📄 sampleweighting.cpp
字号:
}
}
Void SampleWeighting::xMixB4x( Pel* pucDest, Int iDestStride, Pel* pucSrc, Int iSrcStride, Int iSizeY )
{
for( Int y = 0; y < iSizeY; y++)
{
for( Int x = 0; x < 4; x++)
{
pucDest[x] = (pucDest[x] + pucSrc[x] + 1) >> 1;
}
pucDest += iDestStride;
pucSrc += iSrcStride;
}
}
Void SampleWeighting::xWeight( Pel* pucDest, Int iDestStride, Int iSizeY, Int iSizeX, Int iWeight, Int iOffset, UInt uiDenom )
{
Int iAdd = ((1+iOffset*2)<<uiDenom)>>1;
AOT_DBG( iWeight > 128 );
AOT_DBG( iWeight < -128 );
for( Int y = 0; y < iSizeY; y++)
{
for( Int x = 0; x < iSizeX; x++)
{
Int iTemp = (( iWeight * pucDest[x] + iAdd) >> uiDenom);
pucDest[x] = gClip( iTemp );
}
pucDest += iDestStride;
}
}
Void SampleWeighting::xMixBWeight( Pel* pucDest, Int iDestStride, Pel* pucSrc, Int iSrcStride, Int iSizeY, Int iSizeX, Int iWD, Int iWS, Int iOffset, UInt uiDenom )
{
Int iAdd = (1<<uiDenom);
AOT_DBG( (iWD + iWS) > ((uiDenom == 7) ? 127 : 128));
AOT_DBG( iWD + iWS < -128 );
uiDenom++;
iOffset = (iOffset+1) >> 1;
for( Int y = 0; y < iSizeY; y++)
{
for( Int x = 0; x < iSizeX; x++)
{
Int iTemp = (( iWD * pucDest[x] + iWS * pucSrc[x] + iAdd) >> uiDenom) + iOffset;
pucDest[x] = gClip( iTemp );
}
pucDest += iDestStride;
pucSrc += iSrcStride;
}
}
__inline Void SampleWeighting::xMixB(Pel* pucDest, Int iDestStride, Pel* pucSrc, Int iSrcStride, Int iSizeY, Int iSizeX)
{
m_afpMixSampleFunc[iSizeX>>2]( pucDest, iDestStride, pucSrc, iSrcStride, iSizeY );
}
Void SampleWeighting::xXMixB16x( XPel* pucDest, Int iDestStride, XPel* pucSrc, Int iSrcStride, Int iSizeY )
{
for( Int y = 0; y < iSizeY; y++)
{
for( Int x = 0; x < 16; x++)
{
pucDest[x] = (pucDest[x] + pucSrc[x] + 1) >> 1;
}
pucDest += iDestStride;
pucSrc += iSrcStride;
}
}
Void SampleWeighting::xXMixB8x( XPel* pucDest, Int iDestStride, XPel* pucSrc, Int iSrcStride, Int iSizeY)
{
for( Int y = 0; y < iSizeY; y++)
{
for( Int x = 0; x < 8; x++)
{
pucDest[x] = (pucDest[x] + pucSrc[x] + 1) >> 1;
}
pucDest += iDestStride;
pucSrc += iSrcStride;
}
}
Void SampleWeighting::xXMixB4x( XPel* pucDest, Int iDestStride, XPel* pucSrc, Int iSrcStride, Int iSizeY )
{
for( Int y = 0; y < iSizeY; y++)
{
for( Int x = 0; x < 4; x++)
{
pucDest[x] = (pucDest[x] + pucSrc[x] + 1) >> 1;
}
pucDest += iDestStride;
pucSrc += iSrcStride;
}
}
Void SampleWeighting::xWeight( XPel* pucDest, Int iDestStride, Int iSizeY, Int iSizeX, Int iWeight, Int iOffset, UInt uiDenom )
{
Int iAdd = ((1+iOffset*2)<<uiDenom)>>1;
AOT_DBG( iWeight > 128 );
AOT_DBG( iWeight < -128 );
for( Int y = 0; y < iSizeY; y++)
{
for( Int x = 0; x < iSizeX; x++)
{
Int iTemp = (( iWeight * pucDest[x] + iAdd) >> uiDenom);
pucDest[x] = gClip( iTemp );
}
pucDest += iDestStride;
}
}
Void SampleWeighting::xMixBWeight( XPel* pucDest, Int iDestStride, XPel* pucSrc, Int iSrcStride, Int iSizeY, Int iSizeX, Int iWD, Int iWS, Int iOffset, UInt uiDenom )
{
Int iAdd = (1<<uiDenom);
AOT_DBG( (iWD + iWS) > ((uiDenom == 7) ? 127 : 128));
AOT_DBG( iWD + iWS < -128 );
uiDenom++;
iOffset = (iOffset+1) >> 1;
for( Int y = 0; y < iSizeY; y++)
{
for( Int x = 0; x < iSizeX; x++)
{
Int iTemp = (( iWD * pucDest[x] + iWS * pucSrc[x] + iAdd) >> uiDenom) + iOffset;
pucDest[x] = gClip( iTemp );
}
pucDest += iDestStride;
pucSrc += iSrcStride;
}
}
__inline Void SampleWeighting::xMixB(XPel* pucDest, Int iDestStride, XPel* pucSrc, Int iSrcStride, Int iSizeY, Int iSizeX)
{
m_afpXMixSampleFunc[iSizeX>>2]( pucDest, iDestStride, pucSrc, iSrcStride, iSizeY );
}
Void
SampleWeighting::weightInverseLumaSamples( YuvMbBuffer* pcDesBuffer,
YuvMbBuffer* pcOrgBuffer,
YuvMbBuffer* pcFixBuffer,
const PredWeight* pcSearchPW,
const PredWeight* pcFixPW,
Double& rdWeight,
Int iYSize,
Int iXSize )
{
XPel* pFix = pcFixBuffer->getLumBlk();
XPel* pOrg = pcOrgBuffer->getLumBlk();
XPel* pDes = pcDesBuffer->getLumBlk();
Int iStride = pcDesBuffer->getLStride();
Int iFixWeight = pcFixPW ->getLumaWeight();
Int iWeight = pcSearchPW->getLumaWeight();
Int iOffset = ( pcFixPW ->getLumaOffset() + pcSearchPW->getLumaOffset() + 1 ) >> 1;
Int iLWD = m_uiLumaLogWeightDenom;
Int iAdd = ( 1 << iLWD );
AOT_DBG( m_bExplicit && iWeight > 128 );
AOT_DBG( m_bExplicit && iWeight < -128 );
if( iWeight == 0 ) // doesn't make sense to transmit a motion vector for that case
{
for( Int iLine = 0, y = 0; y < iYSize; y++, iLine += iStride )
for( Int x = 0; x < iXSize; x++ )
{
pDes[x+iLine] = 128;
}
rdWeight = 1.0;
}
else
{
Int iShift = ( iLWD + 8 );
Int iInvWeight = ( 1 << iShift ) / iWeight;
Int iInvAdd = ( iAdd << iShift ) / iWeight;
for( Int iLine = 0, y = 0; y < iYSize; y++, iLine += iStride )
for( Int x = 0; x < iXSize; x++ )
{
Int iTemp = ( iInvWeight * ( ( ( pOrg[x+iLine] - iOffset ) << (iLWD+1) ) - iFixWeight * pFix[x+iLine] ) - iInvAdd ) >> iShift;
pDes[x+iLine] = gClip( iTemp );
}
rdWeight = 128.0 / abs(iInvWeight);
}
}
Void
SampleWeighting::weightInverseLumaSamples( YuvMbBuffer* pcDesBuffer,
YuvMbBuffer* pcOrgBuffer,
const PredWeight* pcPW,
Double& rdWeight,
Int iYSize,
Int iXSize )
{
XPel* pOrg = pcOrgBuffer->getLumBlk();
XPel* pDes = pcDesBuffer->getLumBlk();
Int iStride = pcDesBuffer->getLStride();
Int iWeight = pcPW->getLumaWeight();
Int iOffset = pcPW->getLumaOffset();
Int iAdd = ( 1 << m_uiLumaLogWeightDenom ) >> 1;
AOT_DBG( iWeight > 127 );
AOT_DBG( iWeight < -128 );
if( iWeight == 0 ) // motion vector doesn't make sense
{
for( Int y = 0; y < iYSize; y++, pDes+=iStride )
for( Int x = 0; x < iXSize; x++)
{
pDes[x] = 128;
}
rdWeight = 1.0;
}
else if( ! pcPW->getLumaWeightFlag() )
{
//===== unweighted copy =====
for( Int y = 0; y < iYSize; y++, pDes+=iStride )
for( Int x = 0; x < iXSize; x++)
{
pDes[x] = pOrg[x];
}
rdWeight = 1.0;
}
else
{
Int iInvWeight = ( 1 << ( m_uiLumaLogWeightDenom + 8 ) ) / iWeight;
Int iInvAdd = ( iAdd << 8 ) / iWeight;
for( Int y = 0; y < iYSize; y++, pDes+=iStride, pOrg+=iStride )
for( Int x = 0; x < iXSize; x++)
{
Int iTemp = ( iInvWeight * ( pOrg[x] - iOffset ) - iInvAdd ) >> 8;
pDes[x] = gClip( iTemp );
}
rdWeight = 256.0 / abs(iInvWeight);
}
}
Void
SampleWeighting::weightInverseChromaSamples( YuvMbBuffer* pcDesBuffer,
YuvMbBuffer* pcOrgBuffer,
const PredWeight* pcPW,
Double* padWeight,
Int iYSize,
Int iXSize )
{
iYSize >>= 1;
iXSize >>= 1;
for( Int C = 0; C < 2; C++ )
{
XPel* pOrg = ( C ? pcOrgBuffer->getCrBlk() : pcOrgBuffer->getCbBlk() );
XPel* pDes = ( C ? pcDesBuffer->getCrBlk() : pcDesBuffer->getCbBlk() );
Int iStride = pcDesBuffer->getCStride();
Int iWeight = ( C ? pcPW->getChromaCrWeight() : pcPW->getChromaCbWeight() );
Int iOffset = ( C ? pcPW->getChromaCrOffset() : pcPW->getChromaCbOffset() );
Int iAdd = ( 1 << m_uiChromaLogWeightDenom ) >> 1;
AOT_DBG( iWeight > 127 );
AOT_DBG( iWeight < -128 );
if( iWeight == 0 ) // motion vector doesn't make sense
{
for( Int y = 0; y < iYSize; y++, pDes+=iStride )
for( Int x = 0; x < iXSize; x++)
{
pDes[x] = 128;
}
padWeight[C] = 1.0;
}
else if( ! pcPW->getChromaWeightFlag() )
{
//===== unweighted copy =====
for( Int y = 0; y < iYSize; y++, pDes+=iStride )
for( Int x = 0; x < iXSize; x++)
{
pDes[x] = pOrg[x];
}
padWeight[C] = 1.0;
}
else
{
Int iInvWeight = ( 1 << ( m_uiChromaLogWeightDenom + 8 ) ) / iWeight;
Int iInvAdd = ( iAdd << 8 ) / iWeight;
for( Int y = 0; y < iYSize; y++, pDes+=iStride, pOrg+=iStride )
for( Int x = 0; x < iXSize; x++)
{
Int iTemp = ( iInvWeight * ( pOrg[x] - iOffset ) - iInvAdd ) >> 8;
pDes[x] = gClip( iTemp );
}
padWeight[C] = 256.0 / abs(iInvWeight);
}
}
}
//TMM_WP
ErrVal SampleWeighting::initSliceForWeighting( const SliceHeader& rcSliceHeader)
{
if( rcSliceHeader.isIntraSlice() )
{
m_bWeightedPredDisableP = true;
m_bWeightedPredDisableB = true;
m_bExplicit = false;
return Err::m_nOK;
}
if( rcSliceHeader.isPSlice() )
{
m_bExplicit = rcSliceHeader.getPPS().getWeightedPredFlag();
m_bWeightedPredDisableP = ! m_bExplicit;
m_bWeightedPredDisableB = true;
if( m_bExplicit )
{
m_uiLumaLogWeightDenom = rcSliceHeader.getLumaLog2WeightDenom();
m_uiChromaLogWeightDenom = rcSliceHeader.getChromaLog2WeightDenom();
}
return Err::m_nOK;
}
else if( rcSliceHeader.isBSlice() )
{
switch( rcSliceHeader.getPPS().getWeightedBiPredIdc() )
{
case 0:
{
m_bExplicit = false;
m_bWeightedPredDisableP = true;
m_bWeightedPredDisableB = true;
m_uiLumaLogWeightDenom = 0;
m_uiChromaLogWeightDenom = 0;
}
break;
case 1:
{
m_bExplicit = true;
m_bWeightedPredDisableP = false;
m_bWeightedPredDisableB = false;
m_uiLumaLogWeightDenom = rcSliceHeader.getLumaLog2WeightDenom();
m_uiChromaLogWeightDenom = rcSliceHeader.getChromaLog2WeightDenom();
}
break;
case 2:
{
m_bExplicit = false;
m_bWeightedPredDisableP = true;
m_bWeightedPredDisableB = false;
m_uiLumaLogWeightDenom = 5;
m_uiChromaLogWeightDenom = 5;
}
break;
default:
{
AF();
}
break;
}
}
return Err::m_nOK;
}
//TMM_WP
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -