⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mae_hal.c

📁 AU1200嵌入式处理器媒体加速引擎(mae)的驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
  PYUVQ_T f_pyuvq = NULL;
  
  width = pmaeq->encoded_picture_linesize;
  height = pmaeq->encoded_picture_height;
  y_size =width*height;
  // ************************************************************************************************************
  // NEED TO ADD SUPPORT FOR 4:2:2 format here
  uv_size = y_size/4;
  // ************************************************************************************************************
  offset = bottom_field ? width : 0;
  
  if (pmms->b_anchor) 
    b_pyuvq = pmms->b_anchor->pyuvq;
  if (pmms->f_anchor) 
    f_pyuvq = pmms->f_anchor->pyuvq;
  
  DPRINTF(0, (TEXT("Anchor frames: pmms->f_anchor %x pmms->b_anchor %x\n"), (UINT32)pmms->f_anchor, (UINT32)pmms->b_anchor));
  if(pmaeq->frametype[ulInterlaced] == I_FRAME || pmaeq->frametype[ulInterlaced] == P_FRAME)
  {
    val = MAE_PADDR(pmaeq->pyuvq->addr);
    
    if (f_ptr) 
      b_ptr = f_ptr;  // slide the anchors
    // assign the front anchor
    f_ptr = val + offset;
    
    val = val2 = 0;
    if(b_pyuvq)
      val = MAE_PADDR(b_pyuvq->addr);
    if(f_pyuvq)
      val2 = MAE_PADDR(f_pyuvq->addr);
    DPRINTF(0, (TEXT("******* Anchor frames: b_ptr %x f_ptr %x B_Ref %x F_Ref %x  ***********\n"), b_ptr, f_ptr, val, val2));
  }
  
#ifdef REG_DEBUG
  if(ulInterlaced)
    preg_values2 = (reg_info *)(&pmaeq->mae_fe_reglist_field);
  else
    preg_values2 = (reg_info *)(&pmaeq->mae_fe_reglist);
#else
  if(ulInterlaced)
  {
    preg_values2 = (reg_info *)(&pmaeq->fe_reglist_field);
  }
  else
  {
    preg_values2 = (reg_info *)(&pmaeq->fe_reglist);
  }
#endif
  
  preg_values2->picture_size.height = height;
  preg_values2->picture_size.linesiz  = width;
  
  *((unsigned long*)&(preg_values2->config0)) = 0;
  
  // frame coding type 4:2:0 or 4:2:2
  preg_values2->config0.bc = 0; //pmaeq->chroma_format;
  
  // Save the stream type
  g_StreamType = pmaeq->stream_type;

  switch (pmaeq->stream_type)
  {
  case MAE_STREAM_TYPE_MPEG1:
    preg_values2->config0.mis     = 0;
    break;
    
  case MAE_STREAM_TYPE_MPEG2:
    preg_values2->config0.mis     = 1;
    break;
    
  case MAE_STREAM_TYPE_MPEG4:
    if (pmaeq->chopped_picture_height)
      pmms->video_out_height = pmaeq->chopped_picture_height;
    preg_values2->config0.mis     = 1;
    preg_values2->config0.satiq     = 1;
    preg_values2->config0.iqmul1  = 0;
    break;
    
  case MAE_STREAM_TYPE_H263:
    if (pmaeq->chopped_picture_height)
      pmms->video_out_height = pmaeq->chopped_picture_height;
    preg_values2->config0.mis     = 0;
    preg_values2->config0.satiq     = 1;
    preg_values2->config0.iqmul1  = 0;
    break;
    
  case MAE_STREAM_TYPE_DIVX:
    if (pmaeq->chopped_picture_height)
      pmms->video_out_height = pmaeq->chopped_picture_height;
    preg_values2->config0.mis     = 0;
    preg_values2->config0.satiq     = 1;
    preg_values2->config0.iqmul1  = 0;
    break;
    
  case MAE_STREAM_TYPE_WMV9:
    preg_values2->config0.codstyl   = 1;
    preg_values2->config0.iqmul1  = 0;
    preg_values2->config0.mis     = 0;
    preg_values2->config0.satiq     = 1;
    
    // Put in the right frame type here (I, P or B)
    preg_values2->config0.picture_level_mbmode  = (pmaeq->frametype[0] == I_FRAME) ? I_FRAME: (pmaeq->frametype[0] == P_FRAME) ? P_FRAME: 3; // MBM_BIDIRECTIONAL; // implies its a B Frame
    
    // Overlapped Smoothing Filter
    if (pmaeq->bOverlap)
      preg_values2->config0.smooth = 1;
    else
      preg_values2->config0.smooth = 0;
    
    // Deblocking Loop Filter
    if (pmaeq->bDeblock)
      preg_values2->config0.loopfilt = 1;
    else
      preg_values2->config0.loopfilt = 0;
    
    // Intensity Comp related
    if (pmaeq->IntensityComp)
    {
      preg_values2->intensity_comp.icomp      = 1;
      preg_values2->intensity_comp.lumscale   = pmaeq->LumScale;
      preg_values2->intensity_comp.lumshift   = pmaeq->LumShift;
    } else
      preg_values2->intensity_comp.icomp = 0;
    
    regmask |= INTENSITY_COMP_MASK;
    
    // PQUANT
    preg_values2->pquant_reg.pquant = pmaeq->StepSize;
    regmask |= PQUANT_MASK;
    break;
    
  default:
    RPRINTF(MSG_ERROR, (TEXT("Unknown Stream Type. Check the stream_type field in the decoder\n")));
    break;
  }
  
  regmask |= CONFIG0_MASK | PICTURE_SIZE_MASK | CUR_Y_MASK | CUR_CB_MASK | CUR_CR_MASK;
  
  val = MAE_PADDR(pmaeq->pyuvq->addr);
  preg_values2->cur_y_frame_ptr = val + offset;
  preg_values2->cur_cb_frame_ptr  = val + y_size + (offset >> 1);
  preg_values2->cur_cr_frame_ptr = preg_values2->cur_cb_frame_ptr + uv_size;
  DPRINTF(MSG_INFO, (TEXT("Field-%d: Curr %x : Y %x Cb %x Cr %x\n"),bottom_field, val, preg_values2->cur_y_frame_ptr, preg_values2->cur_cb_frame_ptr, preg_values2->cur_cr_frame_ptr));
  DPRINTF(MSG_INFO, (TEXT("Field-%d: Curr %x : Y %x Cb %x Cr %x\n"),pmaeq->frametype[ulInterlaced], preg_values2->cur_y_frame_ptr, ulInterlaced, bottom_field));
  //if(pmaeq->picture_structure == FRAME_PICTURE)
  if(pmaeq->prog_frame)
  {
    if(pmaeq->frametype[ulInterlaced] != I_FRAME)
    {
      if(b_pyuvq)
      {
        regmask |= FWD_Y_TOP_MASK   | FWD_CB_TOP_MASK   |  FWD_CR_TOP_MASK;
        
        preg_values2->fwd_y_top_ptr = MAE_PADDR(b_pyuvq->addr);
        preg_values2->fwd_cb_top_ptr  = preg_values2->fwd_y_top_ptr + y_size;
        preg_values2->fwd_cr_top_ptr = preg_values2->fwd_cb_top_ptr + uv_size;
      }
      
      if(f_pyuvq && pmaeq->frametype[ulInterlaced] == B_FRAME)
      {
        regmask |= BWD_Y_TOP_MASK   |   BWD_CB_TOP_MASK   |  BWD_CR_TOP_MASK;
        
        if(pmaeq->dual_prime_field1)
        {
          preg_values2->bwd_y_top_ptr = MAE_PADDR(b_pyuvq->addr);
        }
        else
        {
          preg_values2->bwd_y_top_ptr = MAE_PADDR(f_pyuvq->addr);
        }
        
        preg_values2->bwd_cb_top_ptr  = preg_values2->bwd_y_top_ptr + y_size;
        preg_values2->bwd_cr_top_ptr = preg_values2->bwd_cb_top_ptr + uv_size;
      }
    }
  } else // Field interlaced picture
  {
    if(pmaeq->frametype[ulInterlaced] == P_FRAME)
    {
      regmask |= FWD_Y_TOP_MASK   | FWD_CB_TOP_MASK   |  FWD_CR_TOP_MASK | 
                 FWD_Y_BOT_MASK   |   FWD_CB_BOT_MASK   |  FWD_CR_BOT_MASK;
      
      if(bottom_field)
      {
        if(b_ptr)
        {
          preg_values2->fwd_y_top_ptr = b_ptr;
          preg_values2->fwd_cb_top_ptr  = preg_values2->fwd_y_top_ptr + y_size;
          preg_values2->fwd_cr_top_ptr = preg_values2->fwd_cb_top_ptr + uv_size;
          
          val = (b_pyuvq)? MAE_PADDR(b_pyuvq->addr):MAE_PADDR(f_pyuvq->addr);
          preg_values2->fwd_y_bot_ptr = val + width;
          preg_values2->fwd_cb_bot_ptr  = val + y_size + (offset >> 1);
          preg_values2->fwd_cr_bot_ptr = preg_values2->fwd_cb_bot_ptr + uv_size;
        }
      } else // if bottom field is not set
      {
        preg_values2->fwd_y_top_ptr = (b_pyuvq)? MAE_PADDR(b_pyuvq->addr):MAE_PADDR(f_pyuvq->addr);
        preg_values2->fwd_cb_top_ptr  = preg_values2->fwd_y_top_ptr + y_size;
        preg_values2->fwd_cr_top_ptr = preg_values2->fwd_cb_top_ptr + uv_size;
        
        if(ulInterlaced)
        {
          val = (b_pyuvq)? MAE_PADDR(b_pyuvq->addr):MAE_PADDR(f_pyuvq->addr);
          preg_values2->fwd_y_bot_ptr = b_ptr;
          preg_values2->fwd_cb_bot_ptr  = f_ptr + y_size + width/2;
          preg_values2->fwd_cr_bot_ptr = preg_values2->fwd_cb_bot_ptr + uv_size;
        } else
        {
          val = (b_pyuvq)? MAE_PADDR(b_pyuvq->addr):MAE_PADDR(f_pyuvq->addr);
          preg_values2->fwd_y_bot_ptr = val + width;
          preg_values2->fwd_cb_bot_ptr  = val + y_size + width/2;
          preg_values2->fwd_cr_bot_ptr = preg_values2->fwd_cb_bot_ptr + uv_size;
        }
        
        if(pmaeq->dual_prime_field1)
        {
          preg_values2->bwd_y_top_ptr = (b_pyuvq)?MAE_PADDR(b_pyuvq->addr):MAE_PADDR(f_pyuvq->addr);
          preg_values2->bwd_cb_top_ptr  = preg_values2->bwd_y_top_ptr + y_size;
          preg_values2->bwd_cr_top_ptr = preg_values2->bwd_cb_top_ptr + uv_size;
          
          preg_values2->bwd_y_bot_ptr = preg_values2->bwd_y_top_ptr + width;
          preg_values2->bwd_cb_bot_ptr  = preg_values2->bwd_cb_top_ptr + width/2;
          preg_values2->bwd_cr_bot_ptr = preg_values2->bwd_cr_top_ptr + width/2;
        }
      }
    } else if(pmaeq->frametype[ulInterlaced] == B_FRAME)
    {
      if (f_pyuvq || b_pyuvq)  /* HWG - we must have at least one reference frame to setup pointer  */
      {
        regmask |=  FWD_Y_TOP_MASK   |  FWD_CB_TOP_MASK  |  FWD_CR_TOP_MASK |
          FWD_Y_BOT_MASK   |  FWD_CB_BOT_MASK  |  FWD_CR_BOT_MASK |
          BWD_Y_TOP_MASK   |  BWD_CB_TOP_MASK  |  BWD_CR_TOP_MASK |
          BWD_Y_BOT_MASK   |  BWD_CB_BOT_MASK  |  BWD_CR_BOT_MASK;
      
        preg_values2->fwd_y_top_ptr = (b_pyuvq)? MAE_PADDR(b_pyuvq->addr):MAE_PADDR(f_pyuvq->addr);
        preg_values2->fwd_cb_top_ptr  = preg_values2->fwd_y_top_ptr + y_size;
        preg_values2->fwd_cr_top_ptr = preg_values2->fwd_cb_top_ptr + uv_size;
      
        val= (b_pyuvq)? MAE_PADDR(b_pyuvq->addr):MAE_PADDR(f_pyuvq->addr);
        preg_values2->fwd_y_bot_ptr = val + width;
        preg_values2->fwd_cb_bot_ptr  = val + y_size + width/2;
        preg_values2->fwd_cr_bot_ptr = preg_values2->fwd_cb_bot_ptr + uv_size;
      
        if(f_pyuvq)
        {
          preg_values2->bwd_y_top_ptr = MAE_PADDR(f_pyuvq->addr);
          preg_values2->bwd_cb_top_ptr  = preg_values2->bwd_y_top_ptr + y_size;
          preg_values2->bwd_cr_top_ptr = preg_values2->bwd_cb_top_ptr + uv_size;
        
          preg_values2->bwd_y_bot_ptr = preg_values2->bwd_y_top_ptr + width;
          preg_values2->bwd_cb_bot_ptr  = preg_values2->bwd_cb_top_ptr + width/2;
          preg_values2->bwd_cr_bot_ptr = preg_values2->bwd_cr_top_ptr + width/2;
        }
      }
      else /* no reference frames */
      {
        regmask = 0;
        DPRINTF(MSG_ERROR, (TEXT("B-Frame: No Anchor frames\n")));
      }
    }
  }
  
  preg_values2->regmask = regmask;
  DPRINTF(0, (TEXT("compute_reg_values: Reg mask: %x pmaeq %x\n"),preg_values2->regmask, (UINT32)pmaeq));
}

UINT32 mask_interrupts(UINT32 intrs)
{
#if (MSG_FUNCTION==1)
  char fe, be, febe, lcd;
  
  fe = (intrs & (1<<AU1200_MAE_FE_INT))?'F':' ';
  be = (intrs & (1<<AU1200_MAE_BE_INT))?'B':' ';
  febe = (intrs & (1<<AU1200_MAE_BOTH_INT))?'O':' ';
  lcd = (intrs & (1<<AU1200_LCD_INT))?'L':' ';
  DPRINTF(MSG_FUNCTION, (TEXT("--- mask %c %c %c %c\n"), fe, be, febe, lcd));
#endif  
  au_writel(intrs, IC0_MASKCLR);
  return intrs;
}

void unmask_interrupts(UINT32 intrs) 
{
#if (MSG_FUNCTION==1)
  char fe, be, febe, lcd;
  
  fe = (intrs & (1<<AU1200_MAE_FE_INT))?'F':' ';
  be = (intrs & (1<<AU1200_MAE_BE_INT))?'B':' ';
  febe = (intrs & (1<<AU1200_MAE_BOTH_INT))?'O':' ';
  lcd = (intrs & (1<<AU1200_LCD_INT))?'L':' ';
  DPRINTF(MSG_FUNCTION, (TEXT("--- unmask %c %c %c %c\n"), fe, be, febe, lcd));
#endif
  au_writel(intrs, IC0_MASKSET);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -