📄 umc_vc1_dec_ppic_adv.cpp
字号:
}
else
{
VC1_GET_BITS(1, picLayerHeader->DMVRANGE);
if(picLayerHeader->DMVRANGE==0)
{
//binary code 10
picLayerHeader->DMVRANGE = VC1_DMVRANGE_HORIZONTAL_RANGE;
}
else
{
VC1_GET_BITS(1, picLayerHeader->DMVRANGE);
if(picLayerHeader->DMVRANGE==0)
{
//binary code 110
picLayerHeader->DMVRANGE = VC1_DMVRANGE_VERTICAL_RANGE;
}
else
{
//binary code 111
picLayerHeader->DMVRANGE = VC1_DMVRANGE_HORIZONTAL_VERTICAL_RANGE;
}
}
}
}
//4 motion vector switch
VC1_GET_BITS(1, picLayerHeader->MV4SWITCH);
if(picLayerHeader->MV4SWITCH)
picLayerHeader->MVMODE = VC1_MVMODE_MIXED_MV;
else
picLayerHeader->MVMODE = VC1_MVMODE_1MV;
//intensity compensation
VC1_GET_BITS(1, tempValue); //INTCOMP
if(tempValue) //INTCOM
{
pContext->m_bIntensityCompensation = 1;
VC1_GET_BITS(6, LUMSCALE);
VC1_GET_BITS(6, LUMSHIFT);
STATISTICS_START_TIME(m_timeStatistics->intensity_StartTime);
FillTablesForIntensityCompensation_Adv(pContext,LUMSCALE,LUMSHIFT,
0,pContext->m_frmBuff.m_iPrevIndex);
STATISTICS_END_TIME(m_timeStatistics->intensity_StartTime,
m_timeStatistics->intensity_EndTime,
m_timeStatistics->intensity_TotalTime);
//pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iPrevIndex].m_bIsExpanded = 0;
//if (pContext->typeOfPreviousFrame != VC1_FieldInterlace)
//ExpandIntens_table[pContext->typeOfPreviousFrame](pContext, &pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iPrevIndex]);
//else
//ExpandFrame_Interlace(pContext, &pContext->m_frmBuff.m_pFrames[pContext->m_frmBuff.m_iPrevIndex]);
}
//skipped macroblock bit syntax element
DecodeBitplane(pContext, &picLayerHeader->SKIPMB,
seqLayerHeader->widthMB, seqLayerHeader->heightMB,0);
//motion vector table
VC1_GET_BITS(2, picLayerHeader->MBMODETAB); //MBMODETAB
ChooseMBModeInterlaceFrame(pContext, picLayerHeader->MV4SWITCH, picLayerHeader->MBMODETAB);
//motion vector table
VC1_GET_BITS(2,picLayerHeader->MVTAB); //MVTAB
picLayerHeader->m_pCurrMVDifftbl =
pContext->m_vlcTbl->MV_INTERLACE_TABLES[8 + picLayerHeader->MVTAB]; //MVTAB
//coded block pattern table
VC1_GET_BITS(3,picLayerHeader->CBPTAB); //CBPTAB
picLayerHeader->m_pCurrCBPCYtbl =
pContext->m_vlcTbl->CBPCY_PB_INTERLACE_TABLES[picLayerHeader->CBPTAB]; //CBPTAB
VC1_GET_BITS(2, picLayerHeader->MV2BPTAB); //MV2BPTAB
picLayerHeader->m_pMV2BP = pContext->m_vlcTbl->MV2BP_TABLES[picLayerHeader->MV2BPTAB];
if(picLayerHeader->MV4SWITCH)
{
VC1_GET_BITS(2, picLayerHeader->MV4BPTAB) //MV4BPTAB;
picLayerHeader->m_pMV4BP = pContext->m_vlcTbl->MV4BP_TABLES[picLayerHeader->MV4BPTAB];
}
vc1Res = VOPDQuant(pContext);
if(seqLayerHeader->VSTRANSFORM == 1)
{
//macroblock - level transform type flag
VC1_GET_BITS(1, picLayerHeader->TTMBF);
if(picLayerHeader->TTMBF)
{
//frame-level transform type
VC1_GET_BITS(2, picLayerHeader->TTFRM_ORIG);
picLayerHeader->TTFRM = 1 << picLayerHeader->TTFRM_ORIG;
}
else
picLayerHeader->TTFRM = VC1_BLK_INTER;
}
else
{
picLayerHeader->TTFRM = VC1_BLK_INTER8X8;
}
//frame-level transform AC Coding set index
VC1_GET_BITS(1, picLayerHeader->TRANSACFRM);//TRANSACFRM
if(picLayerHeader->TRANSACFRM == 1)
{
VC1_GET_BITS(1, picLayerHeader->TRANSACFRM);
picLayerHeader->TRANSACFRM++;
}
ChooseACTable(picLayerHeader, picLayerHeader->TRANSACFRM, picLayerHeader->TRANSACFRM);//TRANSACFRM
VC1_GET_BITS(1, picLayerHeader->TRANSDCTAB); //TRANSDCTAB
ChooseDCTable(pContext, picLayerHeader->TRANSDCTAB); //TRANSDCTAB
return vc1Res;
}
VC1Status DecodeFieldHeaderParams_InterlaceFieldPpicture_Adv (VC1Context* pContext)
{
VC1Status vc1Res = VC1_OK;
VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader;
VC1SequenceLayerHeader* seqLayerHeader = pContext->m_seqLayerHeader;
Ipp32u tempValue;
Ipp32u LUMSCALE;
Ipp32u LUMSHIFT;
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES,
VM_STRING("P frame type \n"));
#endif
if (!picLayerHeader->is_slice)
{
if (!pContext->m_picLayerHeader->CurrField)
memset(pContext->savedMV,0X7F,sizeof(Ipp16s)*seqLayerHeader->heightMB*seqLayerHeader->widthMB*4*2);
else
memset(pContext->savedMV + seqLayerHeader->heightMB*seqLayerHeader->widthMB*4*2,0X7F,
sizeof(Ipp16s)*seqLayerHeader->heightMB*seqLayerHeader->widthMB*4*2);
}
VC1_GET_BITS(5,picLayerHeader->PQINDEX);
CalculatePQuant(pContext);
ChooseTTMB_TTBLK_SBP(pContext);
if(picLayerHeader->PQINDEX<=8)
{
VC1_GET_BITS(1,picLayerHeader->HALFQP);
}
else
picLayerHeader->HALFQP = 0;
if(seqLayerHeader->QUANTIZER == 1)
{
VC1_GET_BITS(1,picLayerHeader->PQUANTIZER); //PQUANTIZER
}
if(seqLayerHeader->POSTPROCFLAG)
{
//post processing
VC1_GET_BITS(2,tempValue); //POSTPROC
}
//NUMREF
VC1_GET_BITS(1,picLayerHeader->NUMREF);
if(!picLayerHeader->NUMREF)
{
VC1_GET_BITS(1,picLayerHeader->REFFIELD);
}
//extended MV range flag
MVRangeDecode(pContext);
//for scaling mv predictors
ChoosePredScaleValuePPictbl(picLayerHeader);
//extended differential MV Range Flag
DMVRangeDecode(pContext);
picLayerHeader->INTCOMFIELD = 0;
//motion vector mode
if(picLayerHeader->PQUANT > 12)
{
//MVMODE VLC Mode
//1 1 MV Half-pel bilinear
//01 1 MV
//001 1 MV Half-pel
//0000 Mixed MV
//0001 Intensity Compensation
Ipp32s bit_count = 1;
VC1_GET_BITS(1, picLayerHeader->MVMODE);
while((picLayerHeader->MVMODE == 0) && (bit_count < 4))
{
VC1_GET_BITS(1, picLayerHeader->MVMODE);
bit_count++;
}
if (bit_count < 4)
picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_1);
else
if(picLayerHeader->MVMODE == 0)
picLayerHeader->MVMODE = VC1_MVMODE_MIXED_MV;
else
{
pContext->m_bIntensityCompensation = 1;
picLayerHeader->MVMODE = VC1_MVMODE_INTENSCOMP;
{
Ipp32u is_bottom = 0;
Ipp32u is_top = 0;
Ipp32s index_bottom = pContext->m_frmBuff.m_iPrevIndex;
Ipp32s index_top = pContext->m_frmBuff.m_iPrevIndex;
//pContext->m_bIntensityCompensation = 0;
//MVMODE VLC Mode
//1 1 MV Half-pel bilinear
//01 1 MV
//001 1 MV Half-pel
//000 Mixed MV
Ipp32s bit_count = 1;
VC1_GET_BITS(1, picLayerHeader->MVMODE);
while((picLayerHeader->MVMODE == 0) && (bit_count < 3))
{
VC1_GET_BITS(1, picLayerHeader->MVMODE);
bit_count++;
}
if (bit_count < 3)
picLayerHeader->MVMODE = VC1_LUT_SET(bit_count,bc_lut_5);
else
if(picLayerHeader->MVMODE == 0)
picLayerHeader->MVMODE = VC1_MVMODE_MIXED_MV;
else
picLayerHeader->MVMODE = VC1_MVMODE_HPEL_1MV;
if (picLayerHeader->CurrField)
{
pContext->m_bNeedToUseCompBuffer = 1;
if (picLayerHeader->BottomField)
index_top = pContext->m_frmBuff.m_iCurrIndex;
else
index_bottom = pContext->m_frmBuff.m_iCurrIndex;
}
//INTCOMPFIELD
VC1_GET_BITS(1, picLayerHeader->INTCOMFIELD);
if(picLayerHeader->INTCOMFIELD == 1)
{
//1
picLayerHeader->INTCOMFIELD = VC1_INTCOMP_BOTH_FIELD;
}
else
{
VC1_GET_BITS(1, picLayerHeader->INTCOMFIELD);
if(picLayerHeader->INTCOMFIELD == 1)
{
//01
picLayerHeader->INTCOMFIELD = VC1_INTCOMP_BOTTOM_FIELD;
}
else
{
//00
picLayerHeader->INTCOMFIELD = VC1_INTCOMP_TOP_FIELD;
}
}
if(VC1_IS_INT_TOP_FIELD(picLayerHeader->INTCOMFIELD))
{
is_top = 1;
//top
//Luma scale
VC1_GET_BITS(6, LUMSCALE);
//Luma shift
VC1_GET_BITS(6, LUMSHIFT);
STATISTICS_START_TIME(m_timeStatistics->intensity_StartTime);
FillTablesForIntensityCompensation_Adv(pContext, LUMSCALE,LUMSHIFT,
0,index_top);
STATISTICS_END_TIME(m_timeStatistics->intensity_StartTime,
m_timeStatistics->intensity_EndTime,
m_timeStatistics->intensity_TotalTime);
}
if(VC1_IS_INT_BOTTOM_FIELD(picLayerHeader->INTCOMFIELD) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -