📄 umc_vc1_dec_ppic_adv.cpp
字号:
/* /////////////////////////////////////////////////////////////////////////////
//
// INTEL CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Intel Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright(c) 2004-2007 Intel Corporation. All Rights Reserved.
//
//
// VC-1 decoder, P picture layer for advanced profile
//
*/
#include "umc_defs.h"
#if defined (UMC_ENABLE_VC1_VIDEO_DECODER)
#include "umc_vc1_dec_seq.h"
#include "umc_vc1_dec_debug.h"
#include "umc_vc1_dec_time_statistics.h"
static const Ipp32u bc_lut_1[] = {4,0,1,3};
static const Ipp32u bc_lut_2[] = {0,1,2,3};
static const Ipp32u bc_lut_4[] = {0,1,2};
static const Ipp32u bc_lut_5[] = {0,0,1};
typedef void (*ExpandIntens)(VC1Context* pContext, Frame* pFrame);
static const ExpandIntens ExpandIntens_table[] =
{
(ExpandIntens)(ExpandFrame_Adv),
(ExpandIntens)(ExpandFrame_Interlace),
(ExpandIntens)(ExpandFrame_Interlace)
};
VC1Status DecodePictHeaderParams_ProgressivePpicture_Adv (VC1Context* pContext)
{
VC1Status vc1Res = VC1_OK;
VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader;
VC1SequenceLayerHeader* seqLayerHeader = pContext->m_seqLayerHeader;
Ipp32u LUMSCALE;
Ipp32u LUMSHIFT;
ChooseTTMB_TTBLK_SBP(pContext);
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_BFRAMES,
VM_STRING("P frame type \n"));
#endif
if (!pContext->m_picLayerHeader->is_slice)
memset(pContext->savedMV,0X7F,sizeof(Ipp16s)*seqLayerHeader->heightMB*seqLayerHeader->widthMB*4*2);
//extended MV range flag
MVRangeDecode(pContext);
//motion vector mode
if(picLayerHeader->PQUANT > 12)
{
//VC-1 Table 45: P Picture Low rate (PQUANT > 12) MVMODE codetable
//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;
//VC-1 Table 48: P Picture Low rate (PQUANT > 12) MVMODE2 codetable
//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;
//Luma scale
VC1_GET_BITS(6, picLayerHeader->LUMSCALE);
//Luma shift
VC1_GET_BITS(6, picLayerHeader->LUMSHIFT);
STATISTICS_START_TIME(m_timeStatistics->intensity_StartTime);
FillTablesForIntensityCompensation_Adv(pContext,
picLayerHeader->LUMSCALE,
picLayerHeader->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]);
pContext->m_picLayerHeader->MVMODE2 = pContext->m_picLayerHeader->MVMODE;
}
}
else
{
//VC-1 Table 46: P Picture High rate (PQUANT <= 12) MVMODE codetable
//MVMODE VLC Mode
//1 1 MV
//01 Mixed MV
//001 1 MV Half-pel
//0000 1 MV Half-pel bilinear
//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_2);
else
if(picLayerHeader->MVMODE == 0)
picLayerHeader->MVMODE = VC1_MVMODE_HPELBI_1MV;
else
{
pContext->m_bIntensityCompensation = 1;
picLayerHeader->MVMODE = VC1_MVMODE_INTENSCOMP;
//VC-1 Table 49: P Picture High rate (PQUANT <= 12) MVMODE2 codetable
//MVMODE VLC Mode
//1 1 MV
//01 Mixed MV
//001 1 MV Half-pel
//000 1 MV Half-pel bilinear
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_4);
else
if(picLayerHeader->MVMODE == 0)
picLayerHeader->MVMODE = VC1_MVMODE_HPELBI_1MV;
else
picLayerHeader->MVMODE = VC1_MVMODE_HPEL_1MV;
//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,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]);
pContext->m_picLayerHeader->MVMODE2 = pContext->m_picLayerHeader->MVMODE;
}
}
//motion vector type bitplane
if(picLayerHeader->MVMODE == VC1_MVMODE_MIXED_MV)
{
DecodeBitplane(pContext, &picLayerHeader->MVTYPEMB,
seqLayerHeader->widthMB, seqLayerHeader->heightMB,0);
}
//skipped macroblock bit syntax element
DecodeBitplane(pContext, &picLayerHeader->SKIPMB,
seqLayerHeader->widthMB, seqLayerHeader->heightMB,0);
//motion vector table
VC1_GET_BITS(2, picLayerHeader->MVTAB); //MVTAB
picLayerHeader->m_pCurrMVDifftbl =
pContext->m_vlcTbl->MVDIFF_PB_TABLES[picLayerHeader->MVTAB]; //MVTAB
//coded block pattern table
VC1_GET_BITS(2, picLayerHeader->CBPTAB); //CBPTAB
picLayerHeader->m_pCurrCBPCYtbl = pContext->m_vlcTbl->CBPCY_PB_TABLES[picLayerHeader->CBPTAB]; //CBPTAB
vc1Res = VOPDQuant(pContext);
if(seqLayerHeader->VSTRANSFORM)
{
//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
{
//_MAYBE_ see reference decoder - vc1decpic.c vc1DECPIC_UnpackPictureLayerPBAdvanced function
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++;
}
picLayerHeader->TRANSACFRM2 = picLayerHeader->TRANSACFRM;
ChooseACTable(picLayerHeader, picLayerHeader->TRANSACFRM, picLayerHeader->TRANSACFRM);//TRANSACFRM
//intra transfrmDC table
VC1_GET_BITS(1, picLayerHeader->TRANSDCTAB); //TRANSDCTAB
ChooseDCTable(pContext, picLayerHeader->TRANSDCTAB); //TRANSDCTAB
return vc1Res;
}
VC1Status DecodePictHeaderParams_InterlacePpicture_Adv (VC1Context* pContext)
{
VC1Status vc1Res = VC1_OK;
VC1PictureLayerHeader* picLayerHeader = pContext->m_picLayerHeader;
VC1SequenceLayerHeader* seqLayerHeader = pContext->m_seqLayerHeader;
Ipp32u tempValue;
Ipp32u LUMSCALE;
Ipp32u LUMSHIFT;
ChooseTTMB_TTBLK_SBP(pContext);
#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)
memset(pContext->savedMV,0X7F,sizeof(Ipp16s)*seqLayerHeader->heightMB*seqLayerHeader->widthMB*4*2*2);
//extended MV range flag
MVRangeDecode(pContext);
//extended differential MV Range Flag
if(seqLayerHeader->EXTENDED_DMV == 1)
{
VC1_GET_BITS(1, picLayerHeader->DMVRANGE);
if(picLayerHeader->DMVRANGE==0)
{
//binary code 0
picLayerHeader->DMVRANGE = VC1_DMVRANGE_NONE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -