📄 umc_h264_segment_decoder_deblocking.cpp
字号:
pClipTab = CLIP_TAB[index];
// create clipping values
Clipping[0] = (Ipp8u) (pClipTab[pStrength[0]]);
Clipping[1] = (Ipp8u) (pClipTab[pStrength[1]]);
Clipping[2] = (Ipp8u) (pClipTab[pStrength[2]]);
Clipping[3] = (Ipp8u) (pClipTab[pStrength[3]]);
}
// internal edge variables
QP = QP_SCALE_CR[IClip(0, 51, pmq_QP + chroma_qp_offset)];
index = IClip(0, 51, QP + BetaOffset);
Beta[1] = (Ipp8u) (BETA_TABLE[index]);
index = IClip(0, 51, QP + AlphaC0Offset);
Alpha[1] = (Ipp8u) (ALPHA_TABLE[index]);
pClipTab = CLIP_TAB[index];
// create clipping values
Clipping[4] = (Ipp8u) (pClipTab[pStrength[8]]);
Clipping[5] = (Ipp8u) (pClipTab[pStrength[9]]);
Clipping[6] = (Ipp8u) (pClipTab[pStrength[10]]);
Clipping[7] = (Ipp8u) (pClipTab[pStrength[11]]);
}
if (pParams->bitDepthChroma > 8)
{
IppDeblocking16u[2 + dir]((Ipp16u*)pParams->pChroma[nPlane],
pic_pitch,
Alpha,
Beta,
Clipping,
pStrength,
pParams->bitDepthChroma);
}
else
{
IppDeblocking[2 + dir](pParams->pChroma[nPlane],
pic_pitch,
Alpha,
Beta,
Clipping,
pStrength,
pParams->bitDepthChroma);
}
}
}
} // void H264SegmentDecoder::DeblockChroma420(Ipp32u dir, DeblockingParameters *pParams)
void H264SegmentDecoder::DeblockChroma422(Ipp32u dir, DeblockingParameters *pParams)
{
if (pParams->DeblockingFlag[dir])
{
Ipp32s pic_pitch = pParams->pitch_chroma;
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;
Ipp8u *pClipTab;
Ipp32s QP;
Ipp32s index;
Ipp8u *pStrength = pParams->Strength[dir];
Ipp32s nPlane;
Ipp32s chroma_qp_offset = ~(m_pPicParamSet->chroma_qp_index_offset[0]);
for (nPlane = 0; nPlane < 2; nPlane += 1)
{
if (chroma_qp_offset != m_pPicParamSet->chroma_qp_index_offset[nPlane])
{
chroma_qp_offset = m_pPicParamSet->chroma_qp_index_offset[nPlane];
if (pParams->ExternalEdgeFlag[dir])
{
Ipp32s pmp_QP;
// get left block QP
pmp_QP = m_mbinfo.mbs[pParams->nNeighbour[dir]].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;
index = IClip(0, 51, QP + BetaOffset);
Beta[0] = (Ipp8u) (BETA_TABLE[index]);
index = IClip(0, 51, QP + AlphaC0Offset);
Alpha[0] = (Ipp8u) (ALPHA_TABLE[index]);
pClipTab = CLIP_TAB[index];
// create clipping values
Clipping[0] = (Ipp8u) (pClipTab[pStrength[0]]);
Clipping[1] = (Ipp8u) (pClipTab[pStrength[1]]);
Clipping[2] = (Ipp8u) (pClipTab[pStrength[2]]);
Clipping[3] = (Ipp8u) (pClipTab[pStrength[3]]);
}
// internal edge variables
QP = QP_SCALE_CR[IClip(0, 51, pmq_QP + chroma_qp_offset)];
index = IClip(0, 51, QP + BetaOffset);
Beta[1] = (Ipp8u) (BETA_TABLE[index]);
index = IClip(0, 51, QP + AlphaC0Offset);
Alpha[1] = (Ipp8u) (ALPHA_TABLE[index]);
pClipTab = CLIP_TAB[index];
if (HORIZONTAL_DEBLOCKING == dir)
{
// create clipping values
Clipping[4] = (Ipp8u) (pClipTab[pStrength[4]]);
Clipping[5] = (Ipp8u) (pClipTab[pStrength[5]]);
Clipping[6] = (Ipp8u) (pClipTab[pStrength[6]]);
Clipping[7] = (Ipp8u) (pClipTab[pStrength[7]]);
Clipping[8] = (Ipp8u) (pClipTab[pStrength[8]]);
Clipping[9] = (Ipp8u) (pClipTab[pStrength[9]]);
Clipping[10] = (Ipp8u) (pClipTab[pStrength[10]]);
Clipping[11] = (Ipp8u) (pClipTab[pStrength[11]]);
Clipping[12] = (Ipp8u) (pClipTab[pStrength[12]]);
Clipping[13] = (Ipp8u) (pClipTab[pStrength[13]]);
Clipping[14] = (Ipp8u) (pClipTab[pStrength[14]]);
Clipping[15] = (Ipp8u) (pClipTab[pStrength[15]]);
}
else
{
// create clipping values
Clipping[4] = (Ipp8u) (pClipTab[pStrength[8]]);
Clipping[5] = (Ipp8u) (pClipTab[pStrength[9]]);
Clipping[6] = (Ipp8u) (pClipTab[pStrength[10]]);
Clipping[7] = (Ipp8u) (pClipTab[pStrength[11]]);
}
}
if (pParams->bitDepthChroma > 8)
{
IppDeblocking16u[4 + dir]((Ipp16u*)pParams->pChroma[nPlane],
pic_pitch,
Alpha,
Beta,
Clipping,
pStrength,
pParams->bitDepthChroma);
}
else
{
IppDeblocking[4 + dir](pParams->pChroma[nPlane],
pic_pitch,
Alpha,
Beta,
Clipping,
pStrength,
pParams->bitDepthChroma);
}
}
}
} // void H264SegmentDecoder::DeblockChroma422(Ipp32u dir, DeblockingParameters *pParams)
void H264SegmentDecoder::DeblockChroma444(Ipp32u dir, DeblockingParameters *pParams)
{
if (pParams->DeblockingFlag[dir])
{
Ipp32s pic_pitch = pParams->pitch_chroma;
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;
Ipp8u *pClipTab;
Ipp32s QP;
Ipp32s index;
Ipp8u *pStrength = pParams->Strength[dir];
Ipp32s nPlane;
Ipp32s chroma_qp_offset = ~(m_pPicParamSet->chroma_qp_index_offset[0]);
for (nPlane = 0; nPlane < 2; nPlane += 1)
{
if (chroma_qp_offset != m_pPicParamSet->chroma_qp_index_offset[nPlane])
{
chroma_qp_offset = m_pPicParamSet->chroma_qp_index_offset[nPlane];
if (pParams->ExternalEdgeFlag[dir])
{
Ipp32s pmp_QP;
// get left block QP
pmp_QP = m_mbinfo.mbs[pParams->nNeighbour[dir]].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;
index = IClip(0, 51, QP + BetaOffset);
Beta[0] = (Ipp8u) (BETA_TABLE[index]);
index = IClip(0, 51, QP + AlphaC0Offset);
Alpha[0] = (Ipp8u) (ALPHA_TABLE[index]);
pClipTab = CLIP_TAB[index];
// create clipping values
Clipping[0] = (Ipp8u) (pClipTab[pStrength[0]]);
Clipping[1] = (Ipp8u) (pClipTab[pStrength[1]]);
Clipping[2] = (Ipp8u) (pClipTab[pStrength[2]]);
Clipping[3] = (Ipp8u) (pClipTab[pStrength[3]]);
}
// internal edge variables
QP = QP_SCALE_CR[IClip(0, 51, pmq_QP + chroma_qp_offset)];
index = IClip(0, 51, QP + BetaOffset);
Beta[1] = (Ipp8u) (BETA_TABLE[index]);
index = IClip(0, 51, QP + AlphaC0Offset);
Alpha[1] = (Ipp8u) (ALPHA_TABLE[index]);
pClipTab = CLIP_TAB[index];
// create clipping values
Clipping[4] = (Ipp8u) (pClipTab[pStrength[4]]);
Clipping[5] = (Ipp8u) (pClipTab[pStrength[5]]);
Clipping[6] = (Ipp8u) (pClipTab[pStrength[6]]);
Clipping[7] = (Ipp8u) (pClipTab[pStrength[7]]);
Clipping[8] = (Ipp8u) (pClipTab[pStrength[8]]);
Clipping[9] = (Ipp8u) (pClipTab[pStrength[9]]);
Clipping[10] = (Ipp8u) (pClipTab[pStrength[10]]);
Clipping[11] = (Ipp8u) (pClipTab[pStrength[11]]);
Clipping[12] = (Ipp8u) (pClipTab[pStrength[12]]);
Clipping[13] = (Ipp8u) (pClipTab[pStrength[13]]);
Clipping[14] = (Ipp8u) (pClipTab[pStrength[14]]);
Clipping[15] = (Ipp8u) (pClipTab[pStrength[15]]);
}
if (pParams->bitDepthChroma > 8)
{
IppDeblocking16u[6 + dir]((Ipp16u*)pParams->pChroma[nPlane],
pic_pitch,
Alpha,
Beta,
Clipping,
pStrength,
pParams->bitDepthChroma);
}
else
{
IppDeblocking[6 + dir](pParams->pChroma[nPlane],
pic_pitch,
Alpha,
Beta,
Clipping,
pStrength,
pParams->bitDepthChroma);
}
}
}
} // void H264SegmentDecoder::DeblockChroma444(Ipp32u dir, DeblockingParameters *pParams)
void H264SegmentDecoder::ResetDeblockingVariables(DeblockingParameters *pParams)
{
PlanePtrYCommon pY;
PlaneUVCommon *pU, *pV;
Ipp32s offset;
Ipp32s MBYAdjust = 0;
Ipp32s mbXOffset, mbYOffset;
Ipp32s pitch_luma = m_pCurrentFrame->pitch_luma();
Ipp32s pitch_chroma = m_pCurrentFrame->pitch_chroma();
Ipp32s MBAddr = pParams->nMBAddr;
Ipp32s nCurrMB_X, nCurrMB_Y;
const H264SliceHeader *pHeader;
// load slice header
pHeader = (m_bFrameDeblocking) ?
(m_pCurrentFrame->GetAU(m_field_index)->GetSliceByNumber(m_gmbinfo->mbs[MBAddr].slice_id)->GetSliceHeader()) :
(m_pSliceHeader);
pParams->bitDepthLuma = (Ipp8u)bit_depth_luma;
pParams->bitDepthChroma = (Ipp8u)bit_depth_chroma;
// load planes
pY = m_pCurrentFrame->m_pYPlane;
pU = m_pCurrentFrame->m_pUPlane;
pV = m_pCurrentFrame->m_pVPlane;
Ipp32s pixel_luma_sz = pParams->bitDepthLuma > 8 ? 2 : 1;
Ipp32s pixel_chroma_sz = pParams->bitDepthChroma > 8 ? 2 : 1;
if (FRM_STRUCTURE > m_pCurrentFrame->m_PictureStructureForDec)
{
if (m_field_index)
{
pY += pitch_luma*pixel_luma_sz;
pU += pitch_chroma*pixel_chroma_sz;
pV += pitch_chroma*pixel_chroma_sz;
}
if (m_field_index)
MBYAdjust = mb_height / 2;
pitch_luma *= 2;
pitch_chroma *= 2;
}
// prepare macroblock variables
nCurrMB_X = (MBAddr % mb_width);
nCurrMB_Y = (MBAddr / mb_width)- MBYAdjust;
mbXOffset = nCurrMB_X * 16;
mbYOffset = nCurrMB_Y * 16;
// calc plane's offsets
offset = mbXOffset + (mbYOffset * pitch_luma);
pY += offset*pixel_luma_sz;
switch (m_pCurrentFrame->m_chroma_format)
{
case CHROMA_FORMAT_420: // YUV420
offset = (mbXOffset + (mbYOffset * pitch_chroma)) >> 1;
break;
case CHROMA_FORMAT_422: // YUV422
offset = (mbXOffset >> 1) + (mbYOffset * pitch_chroma);
break;
case CHROMA_FORMAT_400: // YUV400
offset = 0;
case CHROMA_FORMAT_444: // YUV444
break;
default:
VM_ASSERT(false);
break;
}
pU += offset*pixel_chroma_sz;
pV += offset*pixel_chroma_sz;
// set external edge variables
pParams->ExternalEdgeFlag[VERTICAL_DEBLOCKING] = (nCurrMB_X != 0);
pParams->ExternalEdgeFlag[HORIZONTAL_DEBLOCKING] = (nCurrMB_Y != 0);
if (DEBLOCK_FILTER_ON_NO_SLICE_EDGES == pHeader->disable_deblocking_filter_idc)
{
// don't filter at slice boundaries
if (nCurrMB_X)
{
if (m_gmbinfo->mbs[MBAddr].slice_id !=
m_gmbinfo->mbs[MBAddr - 1].slice_id)
pParams->ExternalEdgeFlag[VERTICAL_DEBLOCKING] = 0;
}
if (nCurrMB_Y)
{
if (m_gmbinfo->mbs[MBAddr].slice_id !=
m_gmbinfo->mbs[MBAddr - mb_width].slice_id)
pParams->ExternalEdgeFlag[HORIZONTAL_DEBLOCKING] = 0;
}
}
// reset external edges strength
SetEdgeStrength(pParams->Strength[VERTICAL_DEBLOCKING], 0);
SetEdgeStrength(pParams->Strength[HORIZONTAL_DEBLOCKING], 0);
// set neighbour addreses
pParams->nNeighbour[VERTICAL_DEBLOCKING] = MBAddr - 1;
pParams->nNeighbour[HORIZONTAL_DEBLOCKING] = MBAddr - mb_width;
// set deblocking flag(s)
pParams->DeblockingFlag[VERTICAL_DEBLOCKING] = 0;
pParams->DeblockingFlag[HORIZONTAL_DEBLOCKING] = 0;
// save variables
pParams->pLuma = pY;
pParams->pChroma[0] = pU;
pParams->pChroma[1] = pV;
pParams->pitch_luma = pitch_luma;
pParams->pitch_chroma = pitch_chroma;
pParams->nMaxMVector = (FRM_STRUCTURE > m_pCurrentFrame->m_PictureStructureForDec) ? (2) : (4);
pParams->MBFieldCoded = (FRM_STRUCTURE > m_pCurrentFrame->m_PictureStructureForDec);
// set slice's variables
pParams->nAlphaC0Offset = pHeader->slice_alpha_c0_offset;
pParams->nBetaOffset = pHeader->slice_beta_offset;
} // void H264SegmentDecoder::ResetDeblockingVariables(DeblockingParameters *pParams)
} // namespace UMC
#endif // UMC_ENABLE_H264_VIDEO_DECODER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -