📄 mae_hal.c
字号:
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 + -