📄 mbdata.cpp
字号:
m_aBlkMode[3] = BLK_4x4;
}
}
UInt uiFwdBwd =0;
for( Int n = 3; n >= 0; n--)
{
uiFwdBwd <<= 4;
uiFwdBwd += (0 < m_apcMbMotionData[0]->getRefIdx( Par8x8(n) )) ? 1:0;
uiFwdBwd += (0 < m_apcMbMotionData[1]->getRefIdx( Par8x8(n) )) ? 2:0;
}
m_usFwdBwd = uiFwdBwd ;
}
return Err::m_nOK;
}
ErrVal
MbData::copyMotionScale( const MbData& rcMbDataBL,
const PicType eMbPicType,
const Int iDirectCopyMode )
{
m_bFieldFlag = FRAME != eMbPicType;
m_bBLSkipFlag = rcMbDataBL.m_bBLSkipFlag;
m_eMbMode = rcMbDataBL.m_eMbMode;
m_aBlkMode[0] = rcMbDataBL.m_aBlkMode[0];
m_aBlkMode[1] = rcMbDataBL.m_aBlkMode[1];
m_aBlkMode[2] = rcMbDataBL.m_aBlkMode[2];
m_aBlkMode[3] = rcMbDataBL.m_aBlkMode[3];
m_usFwdBwd = rcMbDataBL.m_usFwdBwd;
m_apcMbMotionData[0]->copyFrom( *rcMbDataBL.m_apcMbMotionData[0] );
m_apcMbMotionData[1]->copyFrom( *rcMbDataBL.m_apcMbMotionData[1] );
m_apcMbMotionData[0]->setFieldMode( m_bFieldFlag );
m_apcMbMotionData[1]->setFieldMode( m_bFieldFlag );
if(iDirectCopyMode==1) //field2frame
{
m_apcMbMotionData[0]->field2FrameRefIdx();
m_apcMbMotionData[1]->field2FrameRefIdx();
}
else if(iDirectCopyMode==2)//frame2field
{
m_apcMbMotionData[0]->frame2FieldRefIdx();
m_apcMbMotionData[1]->frame2FieldRefIdx();
}
return Err::m_nOK;
}
ErrVal
MbData::configureFieldFrameMode( Bool bFieldFlag )
{
m_bFieldFlag = bFieldFlag;
m_apcMbMotionData[0]->setFieldMode( bFieldFlag );
m_apcMbMotionData[1]->setFieldMode( bFieldFlag );
return Err::m_nOK;
}
ErrVal
MbData::initMbCbp()
{
m_uiMbCbp = 0;
return Err::m_nOK;
}
ErrVal
MbData::upsampleMotion( MbData& rcMbData, Par8x8 ePar8x8, Bool bDirect8x8 )
{
RNOK( MbDataStruct::upsampleMotion( rcMbData, ePar8x8, bDirect8x8 ) );
m_bBLSkipFlag = false;
RNOK( m_apcMbMotionData[0]->upsampleMotion( *rcMbData.m_apcMbMotionData[0], ePar8x8 ) );
RNOK( m_apcMbMotionData[1]->upsampleMotion( *rcMbData.m_apcMbMotionData[1], ePar8x8 ) );
UInt uiFwdBwd = 0;
uiFwdBwd += (0 < m_apcMbMotionData[0]->getRefIdx( B_8x8_0 )) ? 1:0;
uiFwdBwd += (0 < m_apcMbMotionData[1]->getRefIdx( B_8x8_0 )) ? 2:0;
m_usFwdBwd = (uiFwdBwd<<12)|(uiFwdBwd<<8)|(uiFwdBwd<<4)|(uiFwdBwd);
return Err::m_nOK;
}
Void
MbData::switchMotionRefinement()
{
ROFVS( m_bHasMotionRefinement );
// switch mb_type
MbMode eMbModeTemp = m_eMbMode;
m_eMbMode = m_eMbModeBase;
m_eMbModeBase = eMbModeTemp;
// switch sub-mb_type
BlkMode aBlkModeTemp[4]; ::memcpy( aBlkModeTemp, m_aBlkMode, sizeof( m_aBlkMode ) );
::memcpy( m_aBlkMode, m_aBlkModeBase, sizeof( m_aBlkMode ) );
::memcpy( m_aBlkModeBase, aBlkModeTemp, sizeof( m_aBlkMode ) );
// switch motion vectors
for( UInt ui = 0; ui < 2; ui++ )
{
MbMotionData cMbMotionDataTemp;
cMbMotionDataTemp.copyFrom( *m_apcMbMotionData[ui] );
m_apcMbMotionData[ui]->copyFrom( *m_apcMbMotionDataBase[ui] );
m_apcMbMotionDataBase[ui]->copyFrom( cMbMotionDataTemp );
}
}
Void
MbData::activateMotionRefinement()
{
AOT( m_bHasMotionRefinement );
m_bHasMotionRefinement = true;
m_eMbModeBase = m_eMbMode;
::memcpy( m_aBlkModeBase, m_aBlkMode, sizeof( m_aBlkMode ) );
m_apcMbMotionDataBase[0]->copyFrom( *m_apcMbMotionData[0] );
m_apcMbMotionDataBase[1]->copyFrom( *m_apcMbMotionData[1] );
}
ErrVal
MbData::noUpsampleMotion()
{
clear();
m_apcMbMotionData[0]->clear(BLOCK_NOT_AVAILABLE) ;
m_apcMbMotionData[1]->clear(BLOCK_NOT_AVAILABLE) ;
return Err::m_nOK;
}
const UChar MbData::m_aucPredictor[2][4]= {{1,0,3,2},{2,3,0,1}};
//Indexes: MBMode Mode8x8%8 b4x4idx
const Char MbData::aaacGetPartInfo[7][4][16]={
//MODE_SKIP
{{0,0,4,4,0,0,4,4,8,8,12,12,8,8,12,12},//BLK_8x8
{0,0,4,4,1,1,5,5,8,8,12,12,9,9,13,13},//BLK_8x4
{0,1,4,5,0,1,4,5,8,9,12,13,8,9,12,13},//BLK_4x8
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}},//BLK_4x4
//MODE_16x16
{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//BLK_8x8
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//BLK_8x4
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//BLK_4x8
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}},//BLK_4x4
//MODE_16x8
{{0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4},//BLK_8x8
{0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4},//BLK_8x4
{0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4},//BLK_4x8
{0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4}},//BLK_4x4
//MODE_8x16
{{0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4},//BLK_8x8
{0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4}, //BLK_8x4
{0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4}, //BLK_4x8
{0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4}},//BLK_4x4
//MODE_8x8
{{0,0,4,4,0,0,4,4,8,8,12,12,8,8,12,12},//BLK_8x8
{0,0,4,4,1,1,5,5,8,8,12,12,9,9,13,13},//BLK_8x4
{0,1,4,5,0,1,4,5,8,9,12,13,8,9,12,13},//BLK_4x8
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}},//BLK_4x4
//MODE_8x8ref0
{{0,0,4,4,0,0,4,4,8,8,12,12,8,8,12,12},//BLK_8x8
{0,0,4,4,1,1,5,5,8,8,12,12,9,9,13,13},//BLK_8x4
{0,1,4,5,0,1,4,5,8,9,12,13,8,9,12,13},//BLK_4x8
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}},//BLK_4x4
//INTRA_4X4_
{{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}}
};
ErrVal
MbData::upsampleMotionESS (MbData* pcBaseMbData,
const UInt uiBaseMbStride,
const Int aiPelOrig[2],
const Bool bDirect8x8,
ResizeParameters* pcParameters)
{
Bool abBl8x8Intra [4]= {false,false,false,false};
MbMode aeMbMode [4]= {MODE_16x16,MODE_16x16,MODE_16x16,MODE_16x16};
BlkMode aeBlkMode [4][4];
UInt auiMbIdx [4][4];
UInt aui4x4Idx [4][4];
Int aaiPartInfo [4][4];
UInt uiMbBaseOrigX = 0, uiMbBaseOrigY = 0;
// initializing
//-------------
xInitESS();
// Fill Base idx
//-----------------
xFillBaseMbData(pcBaseMbData,
uiBaseMbStride,
aiPelOrig,
bDirect8x8,
pcParameters,
aeMbMode,
aeBlkMode,
uiMbBaseOrigX,
uiMbBaseOrigY);
if( m_eMbMode!=INTRA_4X4)
{
// Build PartInfo and inherited base idx filling
//----------------------------------------------
xBuildPartInfo(aiPelOrig,
pcParameters,
aeMbMode,
aeBlkMode,
aui4x4Idx,
auiMbIdx,
aaiPartInfo,
abBl8x8Intra,
uiMbBaseOrigX,
uiMbBaseOrigY);
//--- Remove 4x4 INTRA blocks
//--------------------------
UInt uiB8x8=0,uiB4x4=0;
for ( uiB8x8=0 ; uiB8x8<4 ; uiB8x8++)
if(!abBl8x8Intra[uiB8x8])
{
Bool bWasBl4x4Intra [4]= {false,false,false,false};
for (uiB4x4=0 ; uiB4x4<4 ; uiB4x4++)
if(aaiPartInfo[uiB8x8][uiB4x4]==-1) xRemoveIntra4x4(uiB4x4,bWasBl4x4Intra,aui4x4Idx[uiB8x8],auiMbIdx[uiB8x8],aaiPartInfo[uiB8x8]);
}
//--- Remove 8x8 INTRA blocks
//----------------------------
for ( uiB8x8=0 ; uiB8x8<4 ; uiB8x8++)
if(abBl8x8Intra[uiB8x8]) xRemoveIntra8x8(uiB8x8,abBl8x8Intra,aui4x4Idx,auiMbIdx,aaiPartInfo);
// 8x8 blocks partitioning
//------------------------
xInherit8x8MotionData (aui4x4Idx,auiMbIdx,aaiPartInfo);
// macroblock mode choice
//-----------------------
xInheritMbMotionData (aaiPartInfo);
}
// Transfer in MB structure
//-------------------------
RNOK( xFillMbMvData(pcParameters ) );
//--- Set fwd/bwd
UInt uiFwdBwd = 0;
for( Int n = 3; n >= 0; n--)
{
uiFwdBwd <<= 4;
uiFwdBwd += (0 < m_apcMbMotionData[0]->getRefIdx( Par8x8(n) )) ? 1:0;
uiFwdBwd += (0 < m_apcMbMotionData[1]->getRefIdx( Par8x8(n) )) ? 2:0;
}
m_usFwdBwd = uiFwdBwd;
return Err::m_nOK;
}
ErrVal
MbData::xInitESS()
{
//--- Initialisation
///////////////////////
m_bBLSkipFlag = false;
m_uiMbCbp = 0;
m_eMbMode = MODE_16x16;
m_aBlkMode[0] = m_aBlkMode[1] = m_aBlkMode[2] = m_aBlkMode[3] =BLK_8x8;
Mv* pcMv0=m_acBl4x4Mv[0];
Mv* pcMv1=m_acBl4x4Mv[1];
SChar* pscRefIdx0=m_ascBl4x4RefIdx[0];
SChar* pscRefIdx1=m_ascBl4x4RefIdx[1];
for(UInt uiBl4x4Idx=0 ; uiBl4x4Idx < 16 ;uiBl4x4Idx++,pcMv0++,pcMv1++,pscRefIdx0++,pscRefIdx1++)
{
pcMv0->setZero();
pcMv1->setZero();
*pscRefIdx0=*pscRefIdx1=BLOCK_NOT_PREDICTED;
}
return Err::m_nOK;
}
ErrVal
MbData::xFillBaseMbData( MbData* pcBaseMbData,
const UInt uiBaseMbStride,
const Int aiPelOrig[2],
const Bool bDirect8x8,
ResizeParameters* pcParameters,
MbMode aeMbMode [4],
BlkMode aeBlkMode [4][4],
UInt& uiMbBaseOrigX,
UInt& uiMbBaseOrigY)
{
//--- Base MB association + Fill in Base MbMode + aeBlkMode
///////////////////////////////////////////////////////////
const Int iBaseX0 = ((aiPelOrig[0]+1)*pcParameters->m_iInWidth + pcParameters->m_iOutWidth/2) / pcParameters->m_iOutWidth;
const Int iBaseY0 = ((aiPelOrig[1]+1)*pcParameters->m_iInHeight + pcParameters->m_iOutHeight/2) / pcParameters->m_iOutHeight;
const Int iBaseX1 = ((aiPelOrig[0]+13)*pcParameters->m_iInWidth + pcParameters->m_iOutWidth /2) / pcParameters->m_iOutWidth;
const Int iBaseY1 = ((aiPelOrig[1]+13)*pcParameters->m_iInHeight + pcParameters->m_iOutHeight/2) / pcParameters->m_iOutHeight;
uiMbBaseOrigX=(iBaseX0>>4);
uiMbBaseOrigY=(iBaseY0>>4);
Int iMbBaseIdx =uiMbBaseOrigY*uiBaseMbStride + uiMbBaseOrigX;
MbData* pcBaseMb0 = &(pcBaseMbData[iMbBaseIdx]);
const Int iSMbWidth = ( iBaseX1>>4 > iBaseX0>>4 ) ? 2 : 1;
const Int iSMbHeight = ( iBaseY1>>4 > iBaseY0>>4 ) ? 2 : 1;
Bool bIsMbIntra=true;
m_apcMbData[0]=m_apcMbData[1]=m_apcMbData[2]=m_apcMbData[3]=0;
for( Int iBaseMbY = 0; iBaseMbY < iSMbHeight; iBaseMbY ++)
for( Int iBaseMbX = 0; iBaseMbX < iSMbWidth; iBaseMbX ++)
{
UInt uiIdxMb=(iBaseMbY<<1) + iBaseMbX;
m_apcMbData[uiIdxMb]= pcBaseMb0 + iBaseMbY * uiBaseMbStride + iBaseMbX;
MbMode eMbMode= m_apcMbData[uiIdxMb]->m_eMbMode;
if(eMbMode>=INTRA_4X4 )
{
eMbMode=INTRA_4X4;
aeBlkMode[uiIdxMb][0]=aeBlkMode[uiIdxMb][1]=aeBlkMode[uiIdxMb][2]=aeBlkMode[uiIdxMb][3]=BLK_8x8; //bug fix jerome.vieron@thomson.net
}
else
{
if(eMbMode==MODE_SKIP) eMbMode = MODE_8x8;
for(UInt uiB8x8Idx=0;uiB8x8Idx<4;uiB8x8Idx++)
{
BlkMode eBlkMode=m_apcMbData[uiIdxMb]->m_aBlkMode[uiB8x8Idx];
if (eBlkMode == BLK_SKIP)
eBlkMode = (bDirect8x8) ? BLK_8x8 : BLK_4x4;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -