📄 mbdata.cpp
字号:
aeBlkMode[uiIdxMb][uiB8x8Idx]=eBlkMode;
}
}
aeMbMode[uiIdxMb]= eMbMode;
bIsMbIntra &= (eMbMode==INTRA_4X4);
}
if(bIsMbIntra) m_eMbMode=INTRA_4X4;
return Err::m_nOK;
}
ErrVal
MbData::xBuildPartInfo(const Int aiPelOrig[2],
ResizeParameters* pcParameters,
const MbMode aeMbMode[4],
const BlkMode aeBlkMode[4][4],
UInt aui4x4Idx[4][4],
UInt auiMbIdx [4][4],
Int aaiPartInfo[4][4],
Bool abBl8x8Intra[4],
const UInt uiMbBaseOrigX,
const UInt uiMbBaseOrigY )
{
for( Int x=0;x<2;x++)
{
for( Int y=0;y<2;y++)
{
UInt uiB8x8Idx=(y<<1) + x;
UInt uiBaseX0=((aiPelOrig[0]+x*8+1)*pcParameters->m_iInWidth + pcParameters->m_iOutWidth/2) / pcParameters->m_iOutWidth ;
UInt uiBaseX1=((aiPelOrig[0]+x*8+5)*pcParameters->m_iInWidth + pcParameters->m_iOutWidth/2) / pcParameters->m_iOutWidth ;
UInt uiBaseY0=((aiPelOrig[1]+y*8+1)*pcParameters->m_iInHeight + pcParameters->m_iOutHeight/2) / pcParameters->m_iOutHeight;
UInt uiBaseY1=((aiPelOrig[1]+y*8+5)*pcParameters->m_iInHeight + pcParameters->m_iOutHeight/2) / pcParameters->m_iOutHeight;
uiBaseX0 -= (uiMbBaseOrigX<<4);
uiBaseX1 -= (uiMbBaseOrigX<<4);
uiBaseY0 -= (uiMbBaseOrigY<<4);
uiBaseY1 -= (uiMbBaseOrigY<<4);
//Set Base Indexes
///////////////////
aui4x4Idx[uiB8x8Idx][0]=(((uiBaseY0>>2)%4)<<2)+((uiBaseX0>>2)%4);
aui4x4Idx[uiB8x8Idx][1]=(((uiBaseY0>>2)%4)<<2)+((uiBaseX1>>2)%4);
aui4x4Idx[uiB8x8Idx][2]=(((uiBaseY1>>2)%4)<<2)+((uiBaseX0>>2)%4);
aui4x4Idx[uiB8x8Idx][3]=(((uiBaseY1>>2)%4)<<2)+((uiBaseX1>>2)%4);
auiMbIdx[uiB8x8Idx][0]=((uiBaseY0>>4)<<1)+(uiBaseX0>>4);
auiMbIdx[uiB8x8Idx][1]=((uiBaseY0>>4)<<1)+(uiBaseX1>>4);
auiMbIdx[uiB8x8Idx][2]=((uiBaseY1>>4)<<1)+(uiBaseX0>>4);
auiMbIdx[uiB8x8Idx][3]=((uiBaseY1>>4)<<1)+(uiBaseX1>>4);
//Set PartInfo
///////////////
aaiPartInfo[uiB8x8Idx][0]=aaacGetPartInfo[ aeMbMode[auiMbIdx[uiB8x8Idx][0]]] [(aeBlkMode[auiMbIdx[uiB8x8Idx][0]][g_aucConvertTo8x8Idx[aui4x4Idx[uiB8x8Idx][0]]])%8 ] [aui4x4Idx[uiB8x8Idx][0]];
aaiPartInfo[uiB8x8Idx][1]=aaacGetPartInfo[ aeMbMode[auiMbIdx[uiB8x8Idx][1]]] [(aeBlkMode[auiMbIdx[uiB8x8Idx][1]][g_aucConvertTo8x8Idx[aui4x4Idx[uiB8x8Idx][1]]])%8 ] [aui4x4Idx[uiB8x8Idx][1]];
aaiPartInfo[uiB8x8Idx][2]=aaacGetPartInfo[ aeMbMode[auiMbIdx[uiB8x8Idx][2]]] [(aeBlkMode[auiMbIdx[uiB8x8Idx][2]][g_aucConvertTo8x8Idx[aui4x4Idx[uiB8x8Idx][2]]])%8 ] [aui4x4Idx[uiB8x8Idx][2]];
aaiPartInfo[uiB8x8Idx][3]=aaacGetPartInfo[ aeMbMode[auiMbIdx[uiB8x8Idx][3]]] [(aeBlkMode[auiMbIdx[uiB8x8Idx][3]][g_aucConvertTo8x8Idx[aui4x4Idx[uiB8x8Idx][3]]])%8 ] [aui4x4Idx[uiB8x8Idx][3]];
aaiPartInfo[uiB8x8Idx][0]+= (aaiPartInfo[uiB8x8Idx][0]==-1? 0:auiMbIdx[uiB8x8Idx][0]<<4);
aaiPartInfo[uiB8x8Idx][1]+= (aaiPartInfo[uiB8x8Idx][1]==-1? 0:auiMbIdx[uiB8x8Idx][1]<<4);
aaiPartInfo[uiB8x8Idx][2]+= (aaiPartInfo[uiB8x8Idx][2]==-1? 0:auiMbIdx[uiB8x8Idx][2]<<4);
aaiPartInfo[uiB8x8Idx][3]+= (aaiPartInfo[uiB8x8Idx][3]==-1? 0:auiMbIdx[uiB8x8Idx][3]<<4);
abBl8x8Intra[uiB8x8Idx]=(aaiPartInfo[uiB8x8Idx][0]==-1)&&(aaiPartInfo[uiB8x8Idx][1]==-1)&&(aaiPartInfo[uiB8x8Idx][2]==-1)&&(aaiPartInfo[uiB8x8Idx][3]==-1);
}
}
return Err::m_nOK;
}
ErrVal
MbData::xInherit8x8MotionData( const UInt aui4x4Idx [4][4],
const UInt auiMbIdx [4][4],
const Int aaiPartInfo[4][4])
{
UInt uiB8x8Idx=0;
for(uiB8x8Idx=0 ; uiB8x8Idx<4 ; uiB8x8Idx++)
{
//Compute m_aBlkMode
//-------------------
Bool bR1 = aaiPartInfo[uiB8x8Idx][0]==aaiPartInfo[uiB8x8Idx][1];
Bool bR2 = aaiPartInfo[uiB8x8Idx][2]==aaiPartInfo[uiB8x8Idx][3];
Bool bC1 = aaiPartInfo[uiB8x8Idx][0]==aaiPartInfo[uiB8x8Idx][2];
Bool bC2 = aaiPartInfo[uiB8x8Idx][1]==aaiPartInfo[uiB8x8Idx][3];
//We assume that m_aBlkMode[uiB8x8Idx]has been initialized with BLK_8x8
if( ! bC1 || ! bC2 )
{
m_aBlkMode[uiB8x8Idx]= BLK_8x4 ;
}
if( ! bR1 || ! bR2 )
{
m_aBlkMode[uiB8x8Idx]= ( m_aBlkMode[uiB8x8Idx] == BLK_8x8 ) ? BLK_4x8 : BLK_4x4;
}
// Inherit from base mv and RefIdx
//---------------------------------
const UInt* pucMbIdx =auiMbIdx[uiB8x8Idx];
const UInt* puc4x4Idx=aui4x4Idx[uiB8x8Idx];
const UChar* pucBlockOrder=&(g_aucConvertBlockOrder[uiB8x8Idx<<2]);
for(UInt uiBl4x4Idx=0;uiBl4x4Idx<4;uiBl4x4Idx++,puc4x4Idx++,pucMbIdx++,pucBlockOrder++)
{
MbMotionData* pcmbMd0=m_apcMbData[*pucMbIdx]->m_apcMbMotionData[0];
MbMotionData* pcmbMd1=m_apcMbData[*pucMbIdx]->m_apcMbMotionData[1];
const UChar ucMapIdx=*puc4x4Idx;
const UChar uc8x8Idx=g_aucConvertTo8x8Idx[ucMapIdx];
m_acBl4x4Mv[0][*pucBlockOrder] =pcmbMd0->getMv(B4x4Idx(ucMapIdx));
m_ascBl4x4RefIdx[0][*pucBlockOrder]=pcmbMd0->getRefIdx(Par8x8(uc8x8Idx));
m_acBl4x4Mv[1][*pucBlockOrder] =pcmbMd1->getMv(B4x4Idx(ucMapIdx));
m_ascBl4x4RefIdx[1][*pucBlockOrder]=pcmbMd1->getRefIdx(Par8x8(uc8x8Idx));
//fill cbp
///////////
if((m_apcMbData[*pucMbIdx]->getMbExtCbp()>>ucMapIdx)&1)
m_uiMbCbp|=(1<<(*pucBlockOrder));
}
}
//Homogenization step
////////////////////////////////
//--- Merge Ref Indexes and Mvs inside a given 8x8 block
for ( uiB8x8Idx=0 ; uiB8x8Idx<4 ; uiB8x8Idx++)
if(m_aBlkMode[uiB8x8Idx]!= BLK_8x8) xMergeBl8x8MvAndRef(uiB8x8Idx);
return Err::m_nOK;
}
ErrVal
MbData::xInheritMbMotionData(const Int aaiPartInfo[4][4])
{
Bool bR1 = (m_aBlkMode[0]==m_aBlkMode[1]) && (m_aBlkMode[0]==BLK_8x8) && (aaiPartInfo[0][0]==aaiPartInfo[1][0]);
Bool bR2 = (m_aBlkMode[2]==m_aBlkMode[3]) && (m_aBlkMode[2]==BLK_8x8) && (aaiPartInfo[2][0]==aaiPartInfo[3][0]);
Bool bC1 = (m_aBlkMode[0]==m_aBlkMode[2]) && (m_aBlkMode[0]==BLK_8x8) && (aaiPartInfo[0][0]==aaiPartInfo[2][0]);
Bool bC2 = (m_aBlkMode[1]==m_aBlkMode[3]) && (m_aBlkMode[1]==BLK_8x8) && (aaiPartInfo[1][0]==aaiPartInfo[3][0]);
//We assume that m_eMbMode has been initialized with MODE_16x16
if( ! bC1 || ! bC2 )
{
m_eMbMode = MODE_16x8 ;
}
if( ! bR1 || ! bR2 )
{
m_eMbMode = ( m_eMbMode == MODE_16x16 ) ? MODE_8x16 : MODE_8x8;
}
return Err::m_nOK;
}
ErrVal
MbData::xMergeBl8x8MvAndRef(const UInt uiBlIdx)
{
const UChar* pucWhich=&(g_aucConvertBlockOrder[uiBlIdx*4]);
SChar ascChosenRefIdx[2]={MSYS_INT8_MAX,MSYS_INT8_MAX};
UInt uiIdxstride=((m_aBlkMode[uiBlIdx]==BLK_8x4)?2:1);
const UInt uiNbBl4x4=((m_aBlkMode[uiBlIdx]==BLK_4x4)?4:2);
const UChar* pucMap=0;
UInt uiList,Bl4x4Idx;
for(uiList=0 ; uiList < 2 ; uiList++)
{
pucMap=pucWhich;
for(Bl4x4Idx=0;Bl4x4Idx<uiNbBl4x4;Bl4x4Idx++,pucMap+=uiIdxstride)
{
SChar scRefIdx=m_ascBl4x4RefIdx[uiList][*pucMap];
if( scRefIdx>0)
{
if(ascChosenRefIdx[uiList]>scRefIdx) ascChosenRefIdx[uiList]=scRefIdx;
}
}
}
ascChosenRefIdx[0]=((ascChosenRefIdx[0]==MSYS_INT8_MAX)? -1:ascChosenRefIdx[0]);
ascChosenRefIdx[1]=((ascChosenRefIdx[1]==MSYS_INT8_MAX)? -1:ascChosenRefIdx[1]);
for(uiList=0 ; uiList < 2 ; uiList++)
{
if(ascChosenRefIdx[uiList]>0)
{
pucMap=pucWhich;
for(Bl4x4Idx=0;Bl4x4Idx<4;Bl4x4Idx++,pucMap++)
{
if(m_ascBl4x4RefIdx[uiList][*pucMap]!=ascChosenRefIdx[uiList])
xFillMvandRefBl4x4(Bl4x4Idx,pucWhich,uiList,ascChosenRefIdx);
}
}
else
{
pucMap=pucWhich;
for(Bl4x4Idx=0;Bl4x4Idx<4;Bl4x4Idx++,pucMap++)
{
m_ascBl4x4RefIdx[uiList][*pucMap]=-1;
m_acBl4x4Mv[uiList][*pucMap].setZero();
}
}
}
return Err::m_nOK;
}
ErrVal
MbData::xFillMvandRefBl4x4(const UInt uiBlIdx,const UChar* pucWhich,const UInt uiList,const SChar* psChosenRefIdx)
{
UChar ucRealBlIdx=pucWhich[uiBlIdx];
UChar ucPredIdx=m_aucPredictor[0][uiBlIdx];
UChar ucRealPredIdx=pucWhich[ucPredIdx];
if(m_ascBl4x4RefIdx[uiList][ucRealPredIdx]!=psChosenRefIdx[uiList])
{
ucPredIdx=m_aucPredictor[1][uiBlIdx];
ucRealPredIdx=pucWhich[ucPredIdx];
if(m_ascBl4x4RefIdx[uiList][ucRealPredIdx]!=psChosenRefIdx[uiList])
xFillMvandRefBl4x4(ucPredIdx,pucWhich,uiList,psChosenRefIdx);
}
m_ascBl4x4RefIdx[uiList][ucRealBlIdx]=m_ascBl4x4RefIdx[uiList][ucRealPredIdx];
m_acBl4x4Mv[uiList][ucRealBlIdx]=m_acBl4x4Mv[uiList][ucRealPredIdx];
return Err::m_nOK;
}
ErrVal
MbData::xRemoveIntra8x8(const UInt uiBlIdx,
const Bool* abBl8x8Intra,
UInt aui4x4Idx[4][4],
UInt auiMbIdx[4][4],
Int aaiPartInfo[4][4])
{
UChar ucPredIdx=m_aucPredictor[0][uiBlIdx] ;
if(abBl8x8Intra[ucPredIdx])
{
ucPredIdx=m_aucPredictor[1][uiBlIdx] ;
if(abBl8x8Intra[ucPredIdx])
xRemoveIntra8x8(ucPredIdx,abBl8x8Intra,aui4x4Idx,auiMbIdx,aaiPartInfo);
}
xCopyBl8x8(ucPredIdx,uiBlIdx,aui4x4Idx,auiMbIdx,aaiPartInfo);
return Err::m_nOK;
}
ErrVal
MbData::xCopyBl8x8(const UInt uiBlIdx,
const UInt uiBlIdxCopy,
UInt aui4x4Idx[4][4],
UInt auiMbIdx[4][4],
Int aaiPartInfo[4][4])
{
for( UInt uiB4x4Idx=0;uiB4x4Idx<4;uiB4x4Idx++)
{
aui4x4Idx[uiBlIdxCopy][uiB4x4Idx]=aui4x4Idx[uiBlIdx][uiB4x4Idx];
auiMbIdx [uiBlIdxCopy][uiB4x4Idx]=auiMbIdx[uiBlIdx][uiB4x4Idx];
aaiPartInfo[uiBlIdxCopy][uiB4x4Idx]=aaiPartInfo[uiBlIdx][uiB4x4Idx];
}
return Err::m_nOK;
}
ErrVal
MbData::xRemoveIntra4x4(const UInt uiBlIdx,
Bool bWasBl4x4Intra[4], //TMM_JV
UInt aui4x4Idx[4],
UInt auiMbIdx[4],
Int aaiPartInfo[4])
{
UChar ucPredIdx=m_aucPredictor[0][uiBlIdx] ;
if(bWasBl4x4Intra[ucPredIdx] || aaiPartInfo[ucPredIdx]==-1)
{
ucPredIdx=m_aucPredictor[1][uiBlIdx] ;
if(bWasBl4x4Intra[ucPredIdx] || aaiPartInfo[ucPredIdx]==-1)//TMM_JV
xRemoveIntra4x4(ucPredIdx,bWasBl4x4Intra,aui4x4Idx,auiMbIdx,aaiPartInfo);
}
aui4x4Idx[uiBlIdx] = aui4x4Idx[ucPredIdx];
auiMbIdx[uiBlIdx] = auiMbIdx [ucPredIdx];
aaiPartInfo[uiBlIdx]= aaiPartInfo[ucPredIdx];
bWasBl4x4Intra[uiBlIdx]=true; //TMM_JV
return Err::m_nOK;
}
ErrVal
MbData::xFillMbMvData(ResizeParameters* pcParameters )
{
//--- IF ESS PICTURE LEVEL
if( pcParameters->m_iExtendedSpatialScalability == ESS_PICT )
{
Mv deltaMv[4];
Int refFrNum, refPosX, refPosY;
Int curFrNum = pcParameters->getPoc();
Int curPosX = pcParameters->getCurrentPictureParameters(curFrNum)->m_iPosX;
Int curPosY = pcParameters->getCurrentPictureParameters(curFrNum)->m_iPosY;
for (UInt uilist=0; uilist<2; uilist++)
{ for (UInt uiB8x8Idx=0; uiB8x8Idx<4 ; uiB8x8Idx++)
{
int refidx= m_ascBl4x4RefIdx[uilist][g_aucConvertTo4x4Idx[uiB8x8Idx]];
if(refidx <=0) deltaMv[uiB8x8Idx].set(0,0) ;
else
{
refFrNum = pcParameters->m_aiRefListPoc[uilist][refidx-1];
refPosX = pcParameters->getCurrentPictureParameters(refFrNum)->m_iPosX;
refPosY = pcParameters->getCurrentPictureParameters(refFrNum)->m_iPosY;
deltaMv[uiB8x8Idx].set( 4*(refPosX-curPosX) , 4*(refPosY-curPosY) );
}
}
m_apcMbMotionData[uilist]->upsampleMotionNonDyad( m_ascBl4x4RefIdx[uilist] , m_acBl4x4Mv[uilist] , pcParameters , deltaMv );
}
}
else
{
m_apcMbMotionData[0]->upsampleMotionNonDyad( m_ascBl4x4RefIdx[0] , m_acBl4x4Mv[0] , pcParameters );
m_apcMbMotionData[1]->upsampleMotionNonDyad( m_ascBl4x4RefIdx[1] , m_acBl4x4Mv[1] , pcParameters );
}
return Err::m_nOK;
}
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -