📄 umc_avs_dec_deblocker.cpp
字号:
Ipp8u pStrengt[4] = {0,0,0,0};
AVS_MB_INFO *pMbPrev = (direction == HorizontalEdge)?m_pMbInfoTop:m_pMbInfoLeft;
Ipp32s QPprev;
Ipp32s QPprevchr;
Ipp8u Alpha[2];
Ipp8u Beta[2];
Ipp32s Treshold[2];
if (AVS_B_PICTURE == m_debCtx.m_pPicHeader->picture_coding_type)
GetStrengthsForBMb(pStrengt,m_pMbInfo,pMbPrev,direction);
else
GetStrengthsForPMb(pStrengt,m_pMbInfo,pMbPrev,direction);
if (NULL != pMbPrev)
{
QPprev = (pMbPrev->QP + m_pMbInfo->QP + 1) >> 1;
Alpha[0] = AVS_ALPHA_TABLE[ICLIP(0,63,QPprev + m_debCtx.m_pPicHeader->alpha_c_offset)];
Beta[0] = AVS_BETA_TABLE[ICLIP(0,63,QPprev + m_debCtx.m_pPicHeader->beta_offset)];
Treshold[0] = AVS_CLIP_TABlE[ICLIP(0,63,QPprev + m_debCtx.m_pPicHeader->alpha_c_offset)];
}
Alpha[1] = AVS_ALPHA_TABLE[ICLIP(0,63,m_pMbInfo->QP + m_debCtx.m_pPicHeader->alpha_c_offset)];
Beta[1] = AVS_BETA_TABLE[ICLIP(0,63,m_pMbInfo->QP + m_debCtx.m_pPicHeader->beta_offset)];
Treshold[1] = AVS_CLIP_TABlE[ICLIP(0,63,m_pMbInfo->QP + m_debCtx.m_pPicHeader->alpha_c_offset)];
//luma deblocking
(this->*(AVSDeblockingTbl[direction]))(pY,
m_debCtx.m_iPitch,
Alpha,
Beta,
pStrengt,
Treshold,
0);
// no internal deblocking for chroma
if (NULL != pMbPrev)
{
QPprevchr=(AVS_QP_SCALE_CR[pMbPrev->QP]+AVS_QP_SCALE_CR[m_pMbInfo->QP]+1) >> 1;
// chroma deblocking
Alpha[0] = AVS_ALPHA_TABLE[ICLIP(0,63,QPprevchr + m_debCtx.m_pPicHeader->alpha_c_offset)];
Beta[0] = AVS_BETA_TABLE[ICLIP(0,63,QPprevchr + m_debCtx.m_pPicHeader->beta_offset)];
Treshold[0] = AVS_CLIP_TABlE[ICLIP(0,63,QPprevchr + m_debCtx.m_pPicHeader->alpha_c_offset)];
(this->*(AVSDeblockingTbl[2+direction]))(pU,
m_debCtx.m_iPitch,
Alpha,
Beta,
pStrengt,
Treshold,
0);
(this->*(AVSDeblockingTbl[2+direction]))(pV,
m_debCtx.m_iPitch,
Alpha,
Beta,
pStrengt,
Treshold,
0);
}
}
void AVSDeblocker::GetStrengthsForPMb(Ipp8u* pStrength,
AVS_MB_INFO* pMbCurrent,
AVS_MB_INFO* pMbPrev,
Ipp32s direction)
{
Ipp32u i = 0;
Ipp32u static BlkOrderTPrevHor[4] = {2,3,0,1};
Ipp32u static BlkOrderTPrevVer[4] = {1,3,0,2};
Ipp32u static BlkOrderTQurHor[4] = {0,1,2,3};
Ipp32u static BlkOrderTQurVer[4] = {0,2,1,3};
Ipp32u* blk_order_prev;
Ipp32u* blk_order_curr;
if (direction == HorizontalEdge)
{
blk_order_prev = BlkOrderTPrevHor;
blk_order_curr = BlkOrderTQurHor;
}
else
{
blk_order_prev = BlkOrderTPrevVer;
blk_order_curr = BlkOrderTQurVer;
}
if (NULL == pMbPrev)
{
pStrength[blk_order_curr[0]] = 0;
pStrength[blk_order_curr[1]] = 0;
i += 2;
}
for (i;i < 4; i++)
{
// interal edges
if (i > 1)
pMbPrev = pMbCurrent;
if ((pMbPrev->MbType == I_8x8)||(pMbCurrent->MbType == I_8x8))
pStrength[blk_order_curr[i]] = 2;
else if (pMbPrev->refIdx[AVS_FORWARD][blk_order_prev[i]] != pMbCurrent->refIdx[AVS_FORWARD][blk_order_curr[i]])
pStrength[blk_order_curr[i]] = 1;
// Motion Vectors in 1/4 pixel units
else if (((abs(pMbPrev->mv[AVS_FORWARD][blk_order_prev[i]].vector.x - pMbCurrent->mv[AVS_FORWARD][blk_order_curr[i]].vector.x) >= 4 ) ||
(abs(pMbPrev->mv[AVS_FORWARD][blk_order_prev[i]].vector.y - pMbCurrent->mv[AVS_FORWARD][blk_order_curr[i]].vector.y)) >= 4 ))
pStrength[blk_order_curr[i]] = 1;
}
}
void AVSDeblocker::GetStrengthsForBMb(Ipp8u* pStrength,
AVS_MB_INFO* pMbCurrent,
AVS_MB_INFO* pMbPrev,
Ipp32s direction)
{
Ipp32u i = 0;
Ipp32u static BlkOrderTPrevHor[4] = {2,3,0,1};
Ipp32u static BlkOrderTPrevVer[4] = {1,3,0,2};
Ipp32u static BlkOrderTQurHor[4] = {0,1,2,3};
Ipp32u static BlkOrderTQurVer[4] = {0,2,1,3};
Ipp32u* blk_order_prev;
Ipp32u* blk_order_curr;
if (direction == HorizontalEdge)
{
blk_order_prev = BlkOrderTPrevHor;
blk_order_curr = BlkOrderTQurHor;
}
else
{
blk_order_prev = BlkOrderTPrevVer;
blk_order_curr = BlkOrderTQurVer;
}
if (NULL == pMbPrev)
{
pStrength[blk_order_curr[0]] = 0;
pStrength[blk_order_curr[1]] = 0;
i += 2;
}
for (i;i < 4; i++)
{
// interal edges
if (i > 1)
pMbPrev = pMbCurrent;
if (0 == (pMbPrev->predType[blk_order_prev[i]] & PredForward))
pMbPrev->refIdx[AVS_FORWARD][blk_order_prev[i]] = 0xFF;
if (0 == (pMbPrev->predType[blk_order_prev[i]] &PredBackward))
pMbPrev->refIdx[AVS_BACKWARD][blk_order_prev[i]] = 0xFF;
if (0 == (pMbCurrent->predType[blk_order_curr[i]] & PredForward))
pMbCurrent->refIdx[AVS_FORWARD][blk_order_curr[i]] = 0xFF;
if (0 == (pMbCurrent->predType[blk_order_curr[i]] &PredBackward))
pMbCurrent->refIdx[AVS_BACKWARD][blk_order_curr[i]] = 0xFF;
if ((pMbPrev->MbType == I_8x8)||(pMbCurrent->MbType == I_8x8))
pStrength[blk_order_curr[i]] = 2;
else if ((pMbPrev->refIdx[AVS_FORWARD][blk_order_prev[i]] != pMbCurrent->refIdx[AVS_FORWARD][blk_order_curr[i]])||
(pMbPrev->refIdx[AVS_BACKWARD][blk_order_prev[i]] != pMbCurrent->refIdx[AVS_BACKWARD][blk_order_curr[i]]))
pStrength[blk_order_curr[i]] = 1;
// Motion Vectors in 1/4 pixel units
else if ( (abs(pMbPrev->mv[AVS_FORWARD][blk_order_prev[i]].vector.x - pMbCurrent->mv[AVS_FORWARD][blk_order_curr[i]].vector.x) >= 4 ) ||
(abs(pMbPrev->mv[AVS_FORWARD][blk_order_prev[i]].vector.y - pMbCurrent->mv[AVS_FORWARD][blk_order_curr[i]].vector.y) >= 4 ) ||
(abs(pMbPrev->mv[AVS_BACKWARD][blk_order_prev[i]].vector.x - pMbCurrent->mv[AVS_BACKWARD][blk_order_curr[i]].vector.x) >= 4 ) ||
(abs(pMbPrev->mv[AVS_BACKWARD][blk_order_prev[i]].vector.y - pMbCurrent->mv[AVS_BACKWARD][blk_order_curr[i]].vector.y) >= 4 ))
pStrength[blk_order_curr[i]] = 1;
}
}
//prototypes for IPP
IppStatus AVSDeblocker::FilterDeblockingLuma_VerEdge(Ipp8u* pSrcDst,
Ipp32s srcdstStep,
Ipp8u* pAlpha,
Ipp8u* pBeta,
Ipp8u* pBS,
Ipp32s* pThreshold,
Ipp32s /*bit_depth*/)
{
Ipp8u p2,p1,p0,q0,q1,q2;
Ipp8u* pCurDst = pSrcDst;
for (Ipp32u edgeCount = 0; edgeCount < 2; edgeCount++)
{
for (Ipp32u pixel = 0; pixel < 16; pixel++)
{
// get Strength of edge
// |-0 |-1
// |-2 |-3
if (0 == pBS[((pixel >> 3) << 1) + edgeCount])
{
// go to next edge
pixel += 7;
pCurDst += 8*srcdstStep;
}
else
{
p2 = pCurDst[-3];
p1 = pCurDst[-2];
p0 = pCurDst[-1];
q0 = pCurDst[0];
q1 = pCurDst[1];
q2 = pCurDst[2];
if ( (pAlpha[edgeCount] > abs(q0 - p0))&&
(pBeta[edgeCount] > abs(p1 - p0))&&
(pBeta[edgeCount] > abs(q1 - q0)))
{
Ipp32u ap = abs(p2-p0);
Ipp32u aq = abs(q2-q0);
if (2 == pBS[((pixel >> 3) << 1) + edgeCount])
{
if (ap < pBeta[edgeCount] &&
abs(p0-q0) < ((pAlpha[edgeCount] >> 2)+2))
{
pCurDst[-1] = (p1 + 2*p0 + q0 + 2) >> 2;
pCurDst[-2] = (2*p1 + p0 + q0 + 2) >> 2;
}
else
pCurDst[-1] = (2*p1 + p0 + q0 + 2 ) >> 2;
if (aq < pBeta[edgeCount] &&
abs(p0-q0) < ((pAlpha[edgeCount] >> 2)+2))
{
pCurDst[0] = (q1 + 2*q0 + p0 + 2) >> 2;
pCurDst[1] = (2*q1 + q0 + p0 + 2) >> 2;
}
else
pCurDst[0] = (2*q1 + q0 + p0 + 2 ) >> 2;
}
else if (1 == pBS[((pixel >> 3) << 1) + edgeCount])
{
Ipp32s delta = ICLIP( -pThreshold[edgeCount], pThreshold[edgeCount], ( (q0 - p0)*3 + (p1 - q1) + 4) >> 3 );
pCurDst[-1] = ICLIP<Ipp8u> (0, 255, p0 + delta);
pCurDst[0] = ICLIP<Ipp8u> (0, 255, q0 - delta);
p0 = pCurDst[-1];
q0 = pCurDst[0];
if (ap < pBeta[edgeCount]) // differ from reference
{
delta = ICLIP(-pThreshold[edgeCount], pThreshold[edgeCount], ( (p0 - p1)*3 + (p2 - q0) + 4) >> 3);
pCurDst[-2] = ICLIP<Ipp8u> (0, 255, p1 + delta);
}
if (aq < pBeta[edgeCount])
{
delta = ICLIP(-pThreshold[edgeCount], pThreshold[edgeCount], ( (q1 - q0)*3 + (p0 - q2) + 4) >> 3);
pCurDst[1] = ICLIP<Ipp8u> (0, 255, q1 - delta);
}
}
}
pCurDst += srcdstStep;
}
}
pCurDst = pSrcDst + 8;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -