📄 mbmvdata.cpp
字号:
m_acMv[10] = rcMbMotionDataBot.m_acMv[iMvOffset41+2];
m_acMv[11] = rcMbMotionDataBot.m_acMv[iMvOffset41+3];
m_acMv[12] = rcMbMotionDataBot.m_acMv[iMvOffset32+4];
m_acMv[13] = rcMbMotionDataBot.m_acMv[iMvOffset32+5];
m_acMv[14] = rcMbMotionDataBot.m_acMv[iMvOffset42+6];
m_acMv[15] = rcMbMotionDataBot.m_acMv[iMvOffset42+7];
for(Int n = 0; n < 16; n++ )
{
m_acMv[n].setFrameToFieldPredictor();
}
m_bFieldFlag = true;
}
Void MbMotionData::field2frame( const MbMotionData& rcMbMotionDataTop, const MbMotionData& rcMbMotionDataBot, Bool bTopFrameMb)
{
Int iRefIdxOffset = 0;
Int iMvOffset = 0;
if( ! bTopFrameMb )
{
iRefIdxOffset = 2;
iMvOffset = 8;
}
Bool bTopRef[4] = {true,true,true,true};
if (rcMbMotionDataTop.m_ascRefIdx[iRefIdxOffset+0] > BLOCK_NOT_PREDICTED)
{
m_ascRefIdx[0] = rcMbMotionDataTop.m_ascRefIdx[iRefIdxOffset+0];
}
else
{
m_ascRefIdx[0] = rcMbMotionDataBot.m_ascRefIdx[iRefIdxOffset+0];
bTopRef[0] = false;
}
m_ascRefIdx[2] = m_ascRefIdx[0];
bTopRef[2] = bTopRef[0];
if (rcMbMotionDataTop.m_ascRefIdx[iRefIdxOffset+1] > BLOCK_NOT_PREDICTED)
{
m_ascRefIdx[1] = rcMbMotionDataTop.m_ascRefIdx[iRefIdxOffset+1];
}
else
{
m_ascRefIdx[1] = rcMbMotionDataBot.m_ascRefIdx[iRefIdxOffset+1];
bTopRef[1] = false;
}
m_ascRefIdx[2] = m_ascRefIdx[0];
bTopRef[2] = bTopRef[0];
m_ascRefIdx[3] = m_ascRefIdx[1];
bTopRef[3] = bTopRef[1];
field2FrameRefIdx();
m_acMv[ 0] = (bTopRef[0]) ? rcMbMotionDataTop.m_acMv[iMvOffset+0] : rcMbMotionDataBot.m_acMv[iMvOffset+0];
m_acMv[ 1] = (bTopRef[0]) ? rcMbMotionDataTop.m_acMv[iMvOffset+1] : rcMbMotionDataBot.m_acMv[iMvOffset+1];
m_acMv[ 2] = (bTopRef[1]) ? rcMbMotionDataTop.m_acMv[iMvOffset+2] : rcMbMotionDataBot.m_acMv[iMvOffset+2];
m_acMv[ 3] = (bTopRef[1]) ? rcMbMotionDataTop.m_acMv[iMvOffset+3] : rcMbMotionDataBot.m_acMv[iMvOffset+3];
m_acMv[ 4] = (bTopRef[0]) ? rcMbMotionDataTop.m_acMv[iMvOffset+0] : rcMbMotionDataBot.m_acMv[iMvOffset+0];
m_acMv[ 5] = (bTopRef[0]) ? rcMbMotionDataTop.m_acMv[iMvOffset+1] : rcMbMotionDataBot.m_acMv[iMvOffset+1];
m_acMv[ 6] = (bTopRef[1]) ? rcMbMotionDataTop.m_acMv[iMvOffset+2] : rcMbMotionDataBot.m_acMv[iMvOffset+2];
m_acMv[ 7] = (bTopRef[1]) ? rcMbMotionDataTop.m_acMv[iMvOffset+3] : rcMbMotionDataBot.m_acMv[iMvOffset+3];
m_acMv[ 8] = (bTopRef[2]) ? rcMbMotionDataTop.m_acMv[iMvOffset+4] : rcMbMotionDataBot.m_acMv[iMvOffset+4];
m_acMv[ 9] = (bTopRef[2]) ? rcMbMotionDataTop.m_acMv[iMvOffset+5] : rcMbMotionDataBot.m_acMv[iMvOffset+5];
m_acMv[10] = (bTopRef[3]) ? rcMbMotionDataTop.m_acMv[iMvOffset+6] : rcMbMotionDataBot.m_acMv[iMvOffset+6];
m_acMv[11] = (bTopRef[3]) ? rcMbMotionDataTop.m_acMv[iMvOffset+7] : rcMbMotionDataBot.m_acMv[iMvOffset+7];
m_acMv[12] = (bTopRef[2]) ? rcMbMotionDataTop.m_acMv[iMvOffset+4] : rcMbMotionDataBot.m_acMv[iMvOffset+4];
m_acMv[13] = (bTopRef[2]) ? rcMbMotionDataTop.m_acMv[iMvOffset+5] : rcMbMotionDataBot.m_acMv[iMvOffset+5];
m_acMv[14] = (bTopRef[3]) ? rcMbMotionDataTop.m_acMv[iMvOffset+6] : rcMbMotionDataBot.m_acMv[iMvOffset+6];
m_acMv[15] = (bTopRef[3]) ? rcMbMotionDataTop.m_acMv[iMvOffset+7] : rcMbMotionDataBot.m_acMv[iMvOffset+7];
m_bFieldFlag = false;
for( Int n = 0; n < 16; n++ )
{
m_acMv[n].setFieldToFramePredictor();
}
}
Void MbMotionData::field2FrameRefIdx()
{
Int n;
for( n = 0; n < 4; n++ )
{
if( m_ascRefIdx[n] > BLOCK_NOT_PREDICTED )
{
m_ascRefIdx[n] = ((m_ascRefIdx[n]-1)>>1)+1;
}
}
}
Void MbMotionData::frame2FieldRefIdx()
{
Int n;
for( n = 0; n < 4; n++ )
{
if( m_ascRefIdx[n] > BLOCK_NOT_PREDICTED )
{
m_ascRefIdx[n] = ((m_ascRefIdx[n]-1)<<1)+1;
}
}
}
BlkMode MbMotionData::getBlkMode( const ParIdx8x8 eParIdx, BlkMode eBlkMode )
{
Bool bR1 = m_acMv[ eParIdx + 0] == m_acMv[ eParIdx + 1];
Bool bR2 = m_acMv[ eParIdx + 4] == m_acMv[ eParIdx + 5];
Bool bC1 = m_acMv[ eParIdx + 0] == m_acMv[ eParIdx + 4];
Bool bC2 = m_acMv[ eParIdx + 1] == m_acMv[ eParIdx + 5];
if( ! bC1 || ! bC2 )
{
eBlkMode = ( eBlkMode == BLK_8x8 ) ? BLK_8x4 : BLK_4x4;
}
if( ! bR1 || ! bR2 )
{
eBlkMode = ( eBlkMode == BLK_8x8 ) ? BLK_4x8 : BLK_4x4;
}
return eBlkMode;
}
Void MbMotionData::copyFrom( const MbMotionData& rcMbMotionData )
{
::memcpy( m_acRefPic, rcMbMotionData.m_acRefPic, 4 * sizeof(RefPic) );
::memcpy( m_ascRefIdx, rcMbMotionData.m_ascRefIdx, 4 * sizeof(SChar) );
m_usMotPredFlags = rcMbMotionData.m_usMotPredFlags;
m_bFieldFlag = rcMbMotionData.m_bFieldFlag;
MbMvData::copyFrom( rcMbMotionData );
}
ErrVal
MbMvData::upsampleMotion( const MbMvData& rcMbMvData, Par8x8 ePar8x8 )
{
const Mv* pacMvSrc = &rcMbMvData.m_acMv[4*(ePar8x8&2)+2*(ePar8x8&1)];
m_acMv[ 0] = m_acMv[ 1] = m_acMv[ 4] = m_acMv[ 5] = ( pacMvSrc[0] << 1 );
m_acMv[ 2] = m_acMv[ 3] = m_acMv[ 6] = m_acMv[ 7] = ( pacMvSrc[1] << 1 );
m_acMv[ 8] = m_acMv[ 9] = m_acMv[12] = m_acMv[13] = ( pacMvSrc[4] << 1 );
m_acMv[10] = m_acMv[11] = m_acMv[14] = m_acMv[15] = ( pacMvSrc[5] << 1 );
m_bFieldFlag = rcMbMvData.m_bFieldFlag;
return Err::m_nOK;
}
ErrVal
MbMotionData::upsampleMotion( const MbMotionData& rcMbMotionData, Par8x8 ePar8x8 )
{
m_ascRefIdx[0] = m_ascRefIdx[1] = m_ascRefIdx[2] = m_ascRefIdx[3] = rcMbMotionData.m_ascRefIdx[ePar8x8];
m_acRefPic [0].setFrame( NULL );
m_acRefPic [1].setFrame( NULL );
m_acRefPic [2].setFrame( NULL );
m_acRefPic [3].setFrame( NULL );
RNOK( MbMvData::upsampleMotion( rcMbMotionData, ePar8x8 ) );
return Err::m_nOK;
}
// TMM_ESS {
ErrVal
MbMotionData::upsampleMotionNonDyad( SChar* pscBl4x4RefIdx , Mv* acBl4x4Mv , ResizeParameters* pcParameters )
{
int iScaledBaseWidth = pcParameters->m_iOutWidth;
int iScaledBaseHeight = pcParameters->m_iOutHeight;
int iBaseWidth = pcParameters->m_iInWidth;
int iBaseHeight = pcParameters->m_iInHeight;
for (UInt uiB8x8Idx=0 ; uiB8x8Idx<4 ; uiB8x8Idx++)
{
m_acRefPic[uiB8x8Idx].setFrame(NULL);
m_ascRefIdx[uiB8x8Idx] = pscBl4x4RefIdx[g_aucConvertTo4x4Idx[uiB8x8Idx]];
m_ascRefIdx[uiB8x8Idx] = ((m_ascRefIdx[uiB8x8Idx]<=0)?BLOCK_NOT_PREDICTED:m_ascRefIdx[uiB8x8Idx]);
}
Int dx , dy;
for (Int iB4x4Idx=0 ; iB4x4Idx<16 ; iB4x4Idx++ )
{
m_acMv[iB4x4Idx] = acBl4x4Mv[iB4x4Idx];
dx = (Int) m_acMv[iB4x4Idx].getHor();
dy = (Int) m_acMv[iB4x4Idx].getVer();
Int sign;
sign = (dx>0) ? 1 : (-1);
dx = sign * (sign * dx * iScaledBaseWidth + iBaseWidth/2 ) / iBaseWidth;
sign = (dy>0)?1:(-1);
dy = sign * (sign * dy * iScaledBaseHeight + iBaseHeight/2) / iBaseHeight;
m_acMv[iB4x4Idx].set( dx , dy );
}
return Err::m_nOK;
}
ErrVal
MbMotionData::upsampleMotionNonDyad(SChar* scBl8x8RefIdx ,
Mv* acBl4x4Mv ,
ResizeParameters* pcParameters ,
Mv deltaMv[4] )
{
upsampleMotionNonDyad( scBl8x8RefIdx , acBl4x4Mv , pcParameters );
// PICTURE LEVEL ESS
for (UInt uiB8x8Idx=0 ; uiB8x8Idx<4 ; uiB8x8Idx++)
{
const UChar *b4Idx = &(g_aucConvertBlockOrder[uiB8x8Idx*4]);
if (m_ascRefIdx[uiB8x8Idx] > 0)
{
m_acMv[*(b4Idx++)] += deltaMv[uiB8x8Idx];
m_acMv[*(b4Idx++)] += deltaMv[uiB8x8Idx];
m_acMv[*(b4Idx++)] += deltaMv[uiB8x8Idx];
m_acMv[*b4Idx] += deltaMv[uiB8x8Idx];
}
else
{
m_acMv[*(b4Idx++)].set(0,0);
m_acMv[*(b4Idx++)].set(0,0);
m_acMv[*(b4Idx++)].set(0,0);
m_acMv[*(b4Idx)].set(0,0);
}
}
return Err::m_nOK;
}
// TMM_ESS }
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -