📄 umc_h264_segment_decoder_deblocking_mbaff.cpp
字号:
//
// step 1. Perform complex deblocking on external edge
//
{
Ipp32s MBAddr = pParams->nMBAddr;
Ipp8u Clipping[16];
Ipp8u Alpha[2];
Ipp8u Beta[2];
Ipp32s AlphaC0Offset = pParams->nAlphaC0Offset;
Ipp32s BetaOffset = pParams->nBetaOffset;
Ipp32s pmq_QP = m_mbinfo.mbs[MBAddr].QP;
Ipp32s pmp_QP;
Ipp8u *pClipTab;
Ipp32s QP;
Ipp32s index;
Ipp8u *pStrength = pParams->StrengthComplex;
Ipp32s i;
// prepare variables
for (i = 0;i < 2;i += 1)
{
// get upper neighbour block QP
pmp_QP = m_mbinfo.mbs[pParams->nLeft[i]].QP;
// luma variables
QP = (pmp_QP + pmq_QP + 1) >> 1 ;
// external edge variables
index = IClip(0, 51, QP + BetaOffset);
Beta[i] = (Ipp8u)(BETA_TABLE[index]);
index = IClip(0, 51, QP + AlphaC0Offset);
Alpha[i] = (Ipp8u)(ALPHA_TABLE[index]);
pClipTab = CLIP_TAB[index];
// create clipping values
Clipping[i * 4 + 0] = (Ipp8u)(pClipTab[pStrength[i * 4 + 0]]);
Clipping[i * 4 + 1] = (Ipp8u)(pClipTab[pStrength[i * 4 + 1]]);
Clipping[i * 4 + 2] = (Ipp8u)(pClipTab[pStrength[i * 4 + 2]]);
Clipping[i * 4 + 3] = (Ipp8u)(pClipTab[pStrength[i * 4 + 3]]);
}
// perform deblocking
if (0 == GetMBFieldDecodingFlag(m_gmbinfo->mbs[MBAddr]))
{
if (pParams->bitDepthLuma > 8)
{
IppDeblocking16u[8]((Ipp16u*)pParams->pLuma,
pParams->pitch_luma * 2,
&Alpha[0],
&Beta[0],
Clipping,
pStrength,
pParams->bitDepthLuma);
IppDeblocking16u[8]((Ipp16u*)pParams->pLuma + pParams->pitch_luma,
pParams->pitch_luma * 2,
&Alpha[1],
&Beta[1],
Clipping + 4,
pStrength + 4,
pParams->bitDepthLuma);
}
else
{
IppDeblocking[8](pParams->pLuma,
pParams->pitch_luma * 2,
&Alpha[0],
&Beta[0],
Clipping,
pStrength,
pParams->bitDepthLuma);
IppDeblocking[8](pParams->pLuma + pParams->pitch_luma,
pParams->pitch_luma * 2,
&Alpha[1],
&Beta[1],
Clipping + 4,
pStrength + 4,
pParams->bitDepthLuma);
}
}
else
{
if (pParams->bitDepthLuma > 8)
{
IppDeblocking16u[8]((Ipp16u*)pParams->pLuma,
pParams->pitch_luma,
&Alpha[0],
&Beta[0],
Clipping,
pStrength,
pParams->bitDepthLuma);
IppDeblocking16u[8]((Ipp16u*)pParams->pLuma + pParams->pitch_luma * 8,
pParams->pitch_luma,
&Alpha[1],
&Beta[1],
Clipping + 4,
pStrength + 4,
pParams->bitDepthLuma);
}
else
{
IppDeblocking[8](pParams->pLuma,
pParams->pitch_luma,
&Alpha[0],
&Beta[0],
Clipping,
pStrength,
pParams->bitDepthLuma);
IppDeblocking[8](pParams->pLuma + pParams->pitch_luma * 8,
pParams->pitch_luma,
&Alpha[1],
&Beta[1],
Clipping + 4,
pStrength + 4,
pParams->bitDepthLuma);
}
}
}
//
// step 2. Perform complex deblocking on internal edges
//
DeblockLuma(VERTICAL_DEBLOCKING, pParams);
} // void H264SegmentDecoder::DeblockLumaVerticalMBAFF(DeblockingParametersMBAFF *pParams)
void H264SegmentDecoder::DeblockChromaVerticalMBAFF400(DeblockingParametersMBAFF *)
{
// there is nothing to do
} // void H264SegmentDecoder::DeblockChromaVerticalMBAFF400(DeblockingParametersMBAFF *)
void H264SegmentDecoder::DeblockChromaVerticalMBAFF420(DeblockingParametersMBAFF *pParams)
{
//
// step 1. Perform complex deblocking on external edge
//
{
Ipp32s MBAddr = pParams->nMBAddr;
Ipp8u Clipping[16];
Ipp8u Alpha[2];
Ipp8u Beta[2];
Ipp32s AlphaC0Offset = pParams->nAlphaC0Offset;
Ipp32s BetaOffset = pParams->nBetaOffset;
Ipp32s pmq_QP = m_mbinfo.mbs[MBAddr].QP;
Ipp32s pmp_QP;
Ipp8u *pClipTab;
Ipp32s QP;
Ipp32s index;
Ipp8u *pStrength = pParams->StrengthComplex;
Ipp32s nPlane;
Ipp32s chroma_qp_offset = ~(m_pPicParamSet->chroma_qp_index_offset[0]);
for (nPlane = 0; nPlane < 2; nPlane += 1)
{
// prepare variables
if (chroma_qp_offset != m_pPicParamSet->chroma_qp_index_offset[nPlane])
{
Ipp32s i;
chroma_qp_offset = m_pPicParamSet->chroma_qp_index_offset[nPlane];
// prepare variables
for (i = 0;i < 2;i += 1)
{
// get upper neighbour block QP
pmp_QP = m_mbinfo.mbs[pParams->nLeft[i]].QP;
// external edge variables
QP = (QP_SCALE_CR[IClip(0, 51, pmp_QP + chroma_qp_offset)] +
QP_SCALE_CR[IClip(0, 51, pmq_QP + chroma_qp_offset)] + 1) >> 1;
// external edge variables
index = IClip(0, 51, QP + BetaOffset);
Beta[i] = (Ipp8u)(BETA_TABLE[index]);
index = IClip(0, 51, QP + AlphaC0Offset);
Alpha[i] = (Ipp8u)(ALPHA_TABLE[index]);
pClipTab = CLIP_TAB[index];
// create clipping values
Clipping[i * 4 + 0] = (Ipp8u)(pClipTab[pStrength[i * 4 + 0]]);
Clipping[i * 4 + 1] = (Ipp8u)(pClipTab[pStrength[i * 4 + 1]]);
Clipping[i * 4 + 2] = (Ipp8u)(pClipTab[pStrength[i * 4 + 2]]);
Clipping[i * 4 + 3] = (Ipp8u)(pClipTab[pStrength[i * 4 + 3]]);
}
}
// perform deblocking
if (0 == GetMBFieldDecodingFlag(m_gmbinfo->mbs[MBAddr]))
{
if (pParams->bitDepthChroma > 8)
{
IppDeblocking16u[9]((Ipp16u*)pParams->pChroma[nPlane],
pParams->pitch_chroma * 2,
&Alpha[0],
&Beta[0],
Clipping,
pStrength,
pParams->bitDepthChroma);
IppDeblocking16u[9]((Ipp16u*)pParams->pChroma[nPlane] + pParams->pitch_chroma,
pParams->pitch_chroma * 2,
&Alpha[1],
&Beta[1],
Clipping + 4,
pStrength + 4,
pParams->bitDepthChroma);
}
else
{
IppDeblocking[9](pParams->pChroma[nPlane],
pParams->pitch_chroma * 2,
&Alpha[0],
&Beta[0],
Clipping,
pStrength,
pParams->bitDepthChroma);
IppDeblocking[9](pParams->pChroma[nPlane] + pParams->pitch_chroma,
pParams->pitch_chroma * 2,
&Alpha[1],
&Beta[1],
Clipping + 4,
pStrength + 4,
pParams->bitDepthChroma);
}
}
else
{
if (pParams->bitDepthChroma > 8)
{
IppDeblocking16u[9]((Ipp16u*)pParams->pChroma[nPlane],
pParams->pitch_chroma,
&Alpha[0],
&Beta[0],
Clipping,
pStrength,
pParams->bitDepthChroma);
IppDeblocking16u[9]((Ipp16u*)pParams->pChroma[nPlane] + pParams->pitch_chroma * 4,
pParams->pitch_chroma,
&Alpha[1],
&Beta[1],
Clipping + 4,
pStrength + 4,
pParams->bitDepthChroma);
}
else
{
IppDeblocking[9](pParams->pChroma[nPlane],
pParams->pitch_chroma,
&Alpha[0],
&Beta[0],
Clipping,
pStrength,
pParams->bitDepthChroma);
IppDeblocking[9](pParams->pChroma[nPlane] + pParams->pitch_chroma * 4,
pParams->pitch_chroma,
&Alpha[1],
&Beta[1],
Clipping + 4,
pStrength + 4,
pParams->bitDepthChroma);
}
}
}
}
//
// step 2. Perform complex deblocking on internal edges
//
(this->*DeblockChroma[CHROMA_FORMAT_420])(VERTICAL_DEBLOCKING, pParams);
} // void H264SegmentDecoder::DeblockChromaVerticalMBAFF420(DeblockingParametersMBAFF *pParams)
void H264SegmentDecoder::DeblockChromaVerticalMBAFF422(DeblockingParametersMBAFF *pParams)
{
//
// step 1. Perform complex deblocking on external edge
//
{
Ipp32s MBAddr = pParams->nMBAddr;
Ipp8u Clipping[16];
Ipp8u Alpha[2];
Ipp8u Beta[2];
Ipp32s AlphaC0Offset = pParams->nAlphaC0Offset;
Ipp32s BetaOffset = pParams->nBetaOffset;
Ipp32s pmq_QP = m_mbinfo.mbs[MBAddr].QP;
Ipp32s pmp_QP;
Ipp8u *pClipTab;
Ipp32s QP;
Ipp32s index;
Ipp8u *pStrength = pParams->StrengthComplex;
Ipp32s nPlane;
Ipp32s chroma_qp_offset = ~(m_pPicParamSet->chroma_qp_index_offset[0]);
for (nPlane = 0; nPlane < 2; nPlane += 1)
{
// prepare variables
if (chroma_qp_offset != m_pPicParamSet->chroma_qp_index_offset[nPlane])
{
Ipp32s i;
chroma_qp_offset = m_pPicParamSet->chroma_qp_index_offset[nPlane];
// prepare variables
for (i = 0;i < 2;i += 1)
{
// get upper neighbour block QP
pmp_QP = m_mbinfo.mbs[pParams->nLeft[i]].QP;
// external edge variables
QP = (QP_SCALE_CR[IClip(0, 51, pmp_QP + chroma_qp_offset)] +
QP_SCALE_CR[IClip(0, 51, pmq_QP + chroma_qp_offset)] + 1) >> 1;
// external edge variables
index = IClip(0, 51, QP + BetaOffset);
Beta[i] = (Ipp8u)(BETA_TABLE[index]);
index = IClip(0, 51, QP + AlphaC0Offset);
Alpha[i] = (Ipp8u)(ALPHA_TABLE[index]);
pClipTab = CLIP_TAB[index];
// create clipping values
Clipping[i * 4 + 0] = (Ipp8u)(pClipTab[pStrength[i * 4 + 0]]);
Clipping[i * 4 + 1] = (Ipp8u)(pClipTab[pStrength[i * 4 + 1]]);
Clipping[i * 4 + 2] = (Ipp8u)(pClipTab[pStrength[i * 4 + 2]]);
Clipping[i * 4 + 3] = (Ipp8u)(pClipTab[pStrength[i * 4 + 3]]);
}
}
// perform deblocking
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -