📄 umc_h264_redual_decoder_templates.h
字号:
iVCLContext = sd->GetBlocksLumaContextLeft(y_pos, pNumCoeffsArray[(y_pos - 1) * 4]); \
/* decode block coeffs */ \
sd->m_pBitStream->GetCAVLCInfoLuma(iVCLContext, \
iMaxNum, \
iCoeffsNumber, \
(CoeffsPtr *) &sd->m_pCoeffBlocksWrite, \
bf); \
/* update final CBP */ \
uFinalCBP |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
/* update a num coeff storage for a prediction of future blocks */ \
pNumCoeffsArray[(y_pos) * 4 + x_pos] = (Ipp8u) iCoeffsNumber; \
}
#define DECODE_INTERNAL_LUMA_BLOCK_CAVLC(x_pos, y_pos, block_num) \
{ \
Ipp16s iCoeffsNumber; \
/* to be honest, VLCContext is an average of coeffs numbers \
of neighbouring blocks */ \
Ipp32s iVCLContext; \
iVCLContext = sd->GetBlocksLumaContextInternal(x_pos, y_pos, pNumCoeffsArray); \
/* decode block coeffs */ \
sd->m_pBitStream->GetCAVLCInfoLuma(iVCLContext, \
iMaxNum, \
iCoeffsNumber, \
(CoeffsPtr *) &sd->m_pCoeffBlocksWrite, \
bf); \
/* update final CBP */ \
uFinalCBP |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
/* update a num coeff storage for a prediction of future blocks */ \
pNumCoeffsArray[(y_pos) * 4 + x_pos] = (Ipp8u) iCoeffsNumber; \
}
#define DECODE_CHROMA_DC_BLOCK_CAVLC(component) \
{ \
Ipp16s iCoeffsNumber; \
/* decode chroma DC coefficients */ \
switch (color_format) \
{ \
case CHROMA_FORMAT_420: \
sd->m_pBitStream->GetCAVLCInfoChroma0(iCoeffsNumber, \
(CoeffsPtr*) &sd->m_pCoeffBlocksWrite); \
break; \
case CHROMA_FORMAT_422: \
sd->m_pBitStream->GetCAVLCInfoChroma2(iCoeffsNumber, \
(CoeffsPtr*) &sd->m_pCoeffBlocksWrite); \
break; \
case CHROMA_FORMAT_444: \
sd->m_pBitStream->GetCAVLCInfoChroma4(iCoeffsNumber, \
(CoeffsPtr*) &sd->m_pCoeffBlocksWrite, 0); \
break; \
default: \
iCoeffsNumber = 0; \
VM_ASSERT(false); \
throw h264_exception(UMC_ERR_INVALID_STREAM); \
} \
/* update final CBP */ \
uFinalCBP[component] = (iCoeffsNumber) ? (1) : (0); \
}
#define DECODE_EXTERNAL_CHROMA_BLOCK_CAVLC(x_pos, y_pos, block_num) \
{ \
Ipp16s iCoeffsNumber; \
/* to be honest, VLCContext is an average of coeffs numbers \
of neighbouring blocks */ \
Ipp32s iVLCContext; \
switch (color_format) \
{ \
case CHROMA_FORMAT_420: \
iVLCContext = sd->GetBlocksChromaContextBMEHExternal(iComponent); \
break; \
case CHROMA_FORMAT_422: \
iVLCContext = sd->GetBlocksChromaContextH2(x_pos, y_pos, iComponent); \
break; \
case CHROMA_FORMAT_444: \
iVLCContext = sd->GetBlocksChromaContextH4(x_pos, y_pos, iComponent); \
break; \
default: \
iVLCContext = 0; \
VM_ASSERT(false); \
throw h264_exception(UMC_ERR_INVALID_STREAM); \
}; \
/* decode chrominance coefficients */ \
sd->m_pBitStream->GetCAVLCInfoLuma(iVLCContext, \
15, \
iCoeffsNumber, \
(CoeffsPtr*) &sd->m_pCoeffBlocksWrite, \
bf); \
/* update final CBP */ \
uFinalCBP[iComponent] |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
/* update a num coeff storage for a prediction of future blocks */ \
pNumCoeffsArray[block_num] = (Ipp8u) iCoeffsNumber; \
}
#define DECODE_TOP_CHROMA_BLOCK_CAVLC(x_pos, y_pos, block_num) \
{ \
Ipp16s iCoeffsNumber; \
/* to be honest, VLCContext is an average of coeffs numbers \
of neighbouring blocks */ \
Ipp32s iVLCContext; \
switch (color_format) \
{ \
case CHROMA_FORMAT_420: \
iVLCContext = sd->GetBlocksChromaContextBMEHTop(x_pos, \
pNumCoeffsArray[0], \
iComponent); \
break; \
case CHROMA_FORMAT_422: \
iVLCContext = sd->GetBlocksChromaContextH2(x_pos, y_pos, iComponent); \
break; \
case CHROMA_FORMAT_444: \
iVLCContext = sd->GetBlocksChromaContextH4(x_pos, y_pos, iComponent); \
break; \
default: \
iVLCContext = 0; \
VM_ASSERT(false); \
throw h264_exception(UMC_ERR_INVALID_STREAM); \
}; \
/* decode chrominance coefficients */ \
sd->m_pBitStream->GetCAVLCInfoLuma(iVLCContext, \
15, \
iCoeffsNumber, \
(CoeffsPtr*) &sd->m_pCoeffBlocksWrite, \
bf); \
/* update final CBP */ \
uFinalCBP[iComponent] |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
/* update a num coeff storage for a prediction of future blocks */ \
pNumCoeffsArray[block_num] = (Ipp8u) iCoeffsNumber; \
}
#define DECODE_LEFT_CHROMA_BLOCK_CAVLC(x_pos, y_pos, block_num) \
{ \
Ipp16s iCoeffsNumber; \
/* to be honest, VLCContext is an average of coeffs numbers \
of neighbouring blocks */ \
Ipp32s iVLCContext; \
switch (color_format) \
{ \
case CHROMA_FORMAT_420: \
iVLCContext = sd->GetBlocksChromaContextBMEHLeft(y_pos, \
pNumCoeffsArray[0], \
iComponent); \
break; \
case CHROMA_FORMAT_422: \
iVLCContext = sd->GetBlocksChromaContextH2(x_pos, y_pos, iComponent); \
break; \
case CHROMA_FORMAT_444: \
iVLCContext = sd->GetBlocksChromaContextH4(x_pos, y_pos, iComponent); \
break; \
default: \
iVLCContext = 0; \
VM_ASSERT(false); \
throw h264_exception(UMC_ERR_INVALID_STREAM); \
}; \
/* decode chrominance coefficients */ \
sd->m_pBitStream->GetCAVLCInfoLuma(iVLCContext, \
15, \
iCoeffsNumber, \
(CoeffsPtr*) &sd->m_pCoeffBlocksWrite, \
bf); \
/* update final CBP */ \
uFinalCBP[iComponent] |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
/* update a num coeff storage for a prediction of future blocks */ \
pNumCoeffsArray[block_num] = (Ipp8u) iCoeffsNumber; \
}
#define DECODE_INTERNAL_CHROMA_BLOCK_CAVLC(x_pos, y_pos, block_num) \
{ \
Ipp16s iCoeffsNumber; \
/* to be honest, VLCContext is an average of coeffs numbers \
of neighbouring blocks */ \
Ipp32s iVLCContext; \
switch (color_format) \
{ \
case CHROMA_FORMAT_420: \
iVLCContext = sd->GetBlocksChromaContextBMEHInternal(x_pos, \
y_pos, \
pNumCoeffsArray); \
break; \
case CHROMA_FORMAT_422: \
iVLCContext = sd->GetBlocksChromaContextH2(x_pos, y_pos, iComponent); \
break; \
case CHROMA_FORMAT_444: \
iVLCContext = sd->GetBlocksChromaContextH4(x_pos, y_pos, iComponent); \
break; \
default: \
iVLCContext = 0; \
VM_ASSERT(false); \
throw h264_exception(UMC_ERR_INVALID_STREAM); \
}; \
/* decode chrominance coefficients */ \
sd->m_pBitStream->GetCAVLCInfoLuma(iVLCContext, \
15, \
iCoeffsNumber, \
(CoeffsPtr*) &sd->m_pCoeffBlocksWrite, \
bf); \
/* update final CBP */ \
uFinalCBP[iComponent] |= (iCoeffsNumber) ? (1 << (block_num + 1)) : (0); \
/* update a num coeff storage for a prediction of future blocks */ \
pNumCoeffsArray[block_num] = (Ipp8u) iCoeffsNumber; \
}
void DecodeCoefficients16x16_CAVLC(H264SegmentDecoderMultiThreaded * sd)
{
Ipp32u iDCCBP = 0;
// set field flag
Ipp32s field_flag = (pGetMBFieldDecodingFlag(sd->m_cur_mb.GlobalMacroblockInfo) || is_field) ? 1 : 0;
// decode luma DC block
{
Ipp16s sNumCoeff;
Ipp32u uNC = 0;
uNC = sd->GetDCBlocksLumaContext();
sd->m_pBitStream->GetCAVLCInfoLuma(uNC,
16,
sNumCoeff,
(CoeffsPtr *)&sd->m_pCoeffBlocksWrite,
field_flag);
if (sNumCoeff)
iDCCBP = D_CBP_LUMA_DC;
}
DecodeCoefficients4x4_CAVLC(sd, 15);
// save final CBP
sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_luma |= iDCCBP;
} // void DecodeCoefficients16x16_CAVLC(H264SegmentDecoderMultiThreaded * sd)
void DecodeCoefficients4x4_CAVLC(H264SegmentDecoderMultiThreaded * sd,
Ipp32s iMaxNum = 16)
{
Ipp32s bFieldDecodeFlag = pGetMBFieldDecodingFlag(sd->m_cur_mb.GlobalMacroblockInfo);
Ipp32s bf = sd->m_pCurrentFrame->m_PictureStructureForDec<FRM_STRUCTURE || bFieldDecodeFlag;
Ipp32u cbp = sd->m_cur_mb.LocalMacroblockInfo->cbp;
//
// decode luminance blocks
//
{
Ipp32u uFinalCBP;
Ipp8u *pNumCoeffsArray = sd->m_cur_mb.MacroblockCoeffsInfo->numCoeff;
uFinalCBP = 0;
if (cbp & LUMA_BLOCK_8X8_0)
{
DECODE_EXTERNAL_LUMA_BLOCK_CAVLC(0, 0, 0)
DECODE_TOP_LUMA_BLOCK_CAVLC(1, 0, 1)
DECODE_LEFT_LUMA_BLOCK_CAVLC(0, 1, 2)
DECODE_INTERNAL_LUMA_BLOCK_CAVLC(1, 1, 3)
}
else
{
SET_TO_ZERO_COEFFS_NUMBER(0, 0)
}
if (cbp & LUMA_BLOCK_8X8_1)
{
DECODE_TOP_LUMA_BLOCK_CAVLC(2, 0, 4)
DECODE_TOP_LUMA_BLOCK_CAVLC(3, 0, 5)
DECODE_INTERNAL_LUMA_BLOCK_CAVLC(2, 1, 6)
DECODE_INTERNAL_LUMA_BLOCK_CAVLC(3, 1, 7)
}
else
{
SET_TO_ZERO_COEFFS_NUMBER(2, 0)
}
if (cbp & LUMA_BLOCK_8X8_2)
{
DECODE_LEFT_LUMA_BLOCK_CAVLC(0, 2, 8)
DECODE_INTERNAL_LUMA_BLOCK_CAVLC(1, 2, 9)
DECODE_LEFT_LUMA_BLOCK_CAVLC(0, 3, 10)
DECODE_INTERNAL_LUMA_BLOCK_CAVLC(1, 3, 11)
}
else
{
SET_TO_ZERO_COEFFS_NUMBER(0, 2)
}
if (cbp & LUMA_BLOCK_8X8_3)
{
DECODE_INTERNAL_LUMA_BLOCK_CAVLC(2, 2, 12)
DECODE_INTERNAL_LUMA_BLOCK_CAVLC(3, 2, 13)
DECODE_INTERNAL_LUMA_BLOCK_CAVLC(2, 3, 14)
DECODE_INTERNAL_LUMA_BLOCK_CAVLC(3, 3, 15)
}
else
{
SET_TO_ZERO_COEFFS_NUMBER(2, 2)
}
// save final CBP
sd->m_cur_mb.LocalMacroblockInfo->cbp4x4_luma = uFinalCBP;
}
//
// decode chrominance blocks
//
if (cbp & CHROMA_DC_AC_BLOCKS)
{
Ipp32u uFinalCBP[2];
// decode DC blocks
DECODE_CHROMA_DC_BLOCK_CAVLC(0)
DECODE_CHROMA_DC_BLOCK_CAVLC(1)
if (cbp & CHROMA_AC_BLOCKS)
{
Ipp32s iComponent;
for (iComponent = 0; iComponent < 2; iComponent += 1)
{
Ipp8u *pNumCoeffsArray = sd->m_cur_mb.MacroblockCoeffsInfo->numCoeff;
switch (color_format)
{
case CHROMA_FORMAT_420:
pNumCoeffsArray += iComponent * 4 + 16;
DECODE_EXTERNAL_CHROMA_BLOCK_CAVLC(0, 0, 0)
DECODE_TOP_CHROMA_BLOCK_CAVLC(1, 0, 1)
DECODE_LEFT_CHROMA_BLOCK_CAVLC(0, 1, 2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -