📄 uvlcwriter.cpp
字号:
ETRACE_TH( pcTraceString );
RNOK( xWriteUvlcCode( uiCode ) );
ETRACE_N;
return Err::m_nOK;
}
ErrVal UvlcWriter::writeSvlc( Int iCode, Char* pcTraceString )
{
UInt uiCode;
ETRACE_TH( pcTraceString );
uiCode = xConvertToUInt( iCode );
RNOK( xWriteUvlcCode( uiCode ) );
ETRACE_TY( "se(v)" );
ETRACE_CODE( iCode );
ETRACE_N;
return Err::m_nOK;
}
ErrVal UvlcWriter::writeFlag( Bool bFlag, Char* pcTraceString )
{
ETRACE_TH( pcTraceString );
ETRACE_TY( " u(1)" );
RNOK( xWriteFlag( bFlag ? 1:0) );
ETRACE_N;
return Err::m_nOK;
}
ErrVal UvlcWriter::writeSCode( Int iCode, UInt uiLength, Char* pcTraceString )
{
AOT_DBG(uiLength<1);
ETRACE_TH( pcTraceString );
ETRACE_TY( " i(v)" );
UInt uiShift = 32 - uiLength;
UInt uiCode = ((UInt)(iCode << uiShift)) >> uiShift;
RNOK( m_pcBitWriteBufferIf->write( uiCode, uiLength ) );
ETRACE_POS;
ETRACE_CODE (iCode);
ETRACE_BITS (uiCode, uiLength );
ETRACE_COUNT(uiLength);
ETRACE_N;
return Err::m_nOK;
}
ErrVal UvlcWriter::writeCode( UInt uiCode, UInt uiLength, Char* pcTraceString )
{
AOT_DBG(uiLength<1);
ETRACE_TH( pcTraceString );
ETRACE_TY( " u(v)" );
RNOK( m_pcBitWriteBufferIf->write( uiCode, uiLength ) );
ETRACE_POS;
ETRACE_CODE (uiCode);
ETRACE_BITS (uiCode, uiLength );
ETRACE_COUNT(uiLength);
ETRACE_N;
return Err::m_nOK;
}
ErrVal UvlcWriter::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
UInt uiRefFrame = rcMbDataAccess.getMbMotionData( eLstIdx ).getRefIdx();
RNOK( xWriteRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), --uiRefFrame ) )
return Err::m_nOK;
}
ErrVal UvlcWriter::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx )
{
UInt uiRefFrame = rcMbDataAccess.getMbMotionData( eLstIdx ).getRefIdx( eParIdx );
RNOK( xWriteRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), --uiRefFrame ) )
return Err::m_nOK;
}
ErrVal UvlcWriter::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx )
{
UInt uiRefFrame = rcMbDataAccess.getMbMotionData( eLstIdx ).getRefIdx( eParIdx );
RNOK( xWriteRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), --uiRefFrame ) )
return Err::m_nOK;
}
ErrVal UvlcWriter::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx )
{
UInt uiRefFrame = rcMbDataAccess.getMbMotionData( eLstIdx ).getRefIdx( eParIdx );
RNOK( xWriteRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), --uiRefFrame ) )
return Err::m_nOK;
}
ErrVal UvlcWriter::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
return xWriteMotionPredFlag( rcMbDataAccess.getMbMotionData( eLstIdx ).getMotPredFlag() );
}
ErrVal UvlcWriter::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx )
{
return xWriteMotionPredFlag( rcMbDataAccess.getMbMotionData( eLstIdx ).getMotPredFlag( eParIdx ) );
}
ErrVal UvlcWriter::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx )
{
return xWriteMotionPredFlag( rcMbDataAccess.getMbMotionData( eLstIdx ).getMotPredFlag( eParIdx ) );
}
ErrVal UvlcWriter::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx )
{
return xWriteMotionPredFlag( rcMbDataAccess.getMbMotionData( eLstIdx ).getMotPredFlag( eParIdx ) );
}
ErrVal UvlcWriter::blockModes( MbDataAccess& rcMbDataAccess )
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
ETRACE_T( "BlockMode" );
UInt uiBlockMode = rcMbDataAccess.getConvertBlkMode( c8x8Idx.b8x8Index() );
AOT_DBG( uiBlockMode > 12);
RNOK( xWriteUvlcCode( uiBlockMode ) );
ETRACE_N;
}
return Err::m_nOK;
}
ErrVal UvlcWriter::fieldFlag( MbDataAccess& rcMbDataAccess )
{
ETRACE_T( "MbFieldFlag" );
UInt uiBit = rcMbDataAccess.getMbData().getFieldFlag() ? 1 : 0;
RNOK( xWriteFlag( uiBit ) );
ETRACE_N;
return Err::m_nOK;
}
ErrVal UvlcWriter::skipFlag( MbDataAccess& rcMbDataAccess, Bool bNotAllowed )
{
rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 0 );
ROFRS( m_bRunLengthCoding, Err::m_nOK );
if( ! bNotAllowed && rcMbDataAccess.isSkippedMb() )
{
m_uiRun++;
}
else
{
ETRACE_T( "Run" );
RNOK( xWriteUvlcCode( m_uiRun ) );
ETRACE_N;
m_uiRun = 0;
}
rcMbDataAccess.getMbData().setSkipFlag( m_uiRun > 0 );
return Err::m_nOK;
}
ErrVal UvlcWriter::BLSkipFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiCode = ( rcMbDataAccess.getMbData().getBLSkipFlag() ? 1 : 0 );
ETRACE_T( "BLSkipFlag" );
RNOK( xWriteFlag( uiCode ) );
ETRACE_N;
rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 0 );
return Err::m_nOK;
}
ErrVal UvlcWriter::mbMode( MbDataAccess& rcMbDataAccess )
{
UInt uiMbMode = rcMbDataAccess.getConvertMbType( );
if( m_bRunLengthCoding )
{
uiMbMode--;
}
rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 0 );
ETRACE_T( "MbMode" );
RNOK( xWriteUvlcCode( uiMbMode ) );
ETRACE_N;
return Err::m_nOK;
}
ErrVal UvlcWriter::resPredFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiCode = ( rcMbDataAccess.getMbData().getResidualPredFlag( PART_16x16 ) ? 1 : 0 );
ETRACE_T( "ResidualPredFlag" );
RNOK( xWriteFlag( uiCode ) );
ETRACE_N;
return Err::m_nOK;
}
ErrVal UvlcWriter::resPredFlag_FGS( MbDataAccess& rcMbDataAccess, Bool bBaseCoeff )
{
UInt uiCode = ( rcMbDataAccess.getMbData().getResidualPredFlag( PART_16x16 ) ? 1 : 0 );
ETRACE_T( "ResidualPredFlag" );
RNOK( xWriteFlag( uiCode ) );
ETRACE_N;
return Err::m_nOK;
}
//-- JVT-R091
ErrVal UvlcWriter::smoothedRefFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiCode = ( rcMbDataAccess.getMbData().getSmoothedRefFlag() ? 1 : 0 );
ETRACE_T( "SmoothedRefFlag" );
RNOK( xWriteFlag( uiCode ) );
ETRACE_N;
return Err::m_nOK;
}
//--
ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv();
RNOK( xWriteMvd( cMv ) );
return Err::m_nOK;
}
ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx );
RNOK( xWriteMvd( cMv ) );
return Err::m_nOK;
}
ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx );
RNOK( xWriteMvd( cMv ) );
return Err::m_nOK;
}
ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx );
RNOK( xWriteMvd( cMv ) );
return Err::m_nOK;
}
ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx, eSParIdx );
RNOK( xWriteMvd( cMv ) );
return Err::m_nOK;
}
ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx, eSParIdx );
RNOK( xWriteMvd( cMv ) );
return Err::m_nOK;
}
ErrVal UvlcWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx, eSParIdx );
RNOK( xWriteMvd( cMv ) );
return Err::m_nOK;
}
ErrVal UvlcWriter::xWriteMvd( Mv cMv )
{
ETRACE_T( "Mvd: x" );
UInt uiTemp;
Short sHor = cMv.getHor();
Short sVer = cMv.getVer();
uiTemp = xConvertToUInt( sHor );
RNOK( xWriteUvlcCode( uiTemp ) );
ETRACE_CODE( sHor );
ETRACE_TY("se(v)");
ETRACE_N;
ETRACE_T( "Mvd: y" );
uiTemp = xConvertToUInt( sVer );
RNOK( xWriteUvlcCode( uiTemp ) );
ETRACE_CODE( sVer );
ETRACE_TY("se(v)");
ETRACE_N;
return Err::m_nOK;
}
ErrVal UvlcWriter::intraPredModeChroma( MbDataAccess& rcMbDataAccess )
{
ETRACE_T( "IntraPredModeChroma" );
AOT_DBG( 4 < rcMbDataAccess.getMbData().getChromaPredMode() );
RNOK( xWriteUvlcCode( rcMbDataAccess.getMbData().getChromaPredMode() ) );
ETRACE_N;
return Err::m_nOK;
}
ErrVal UvlcWriter::intraPredModeLuma( MbDataAccess& rcMbDataAccess, LumaIdx cIdx )
{
ETRACE_T( "IntraPredModeLuma" );
ETRACE_POS;
Int iIntraPredModeLuma = rcMbDataAccess.encodeIntraPredMode(cIdx);
ROT( iIntraPredModeLuma > 7);
UInt uiBits = (iIntraPredModeLuma < 0) ? 1 : 0;
RNOK( m_pcBitWriteBufferIf->write( uiBits, 1 ) );
ETRACE_BITS( uiBits,1 );
ETRACE_DO( m_uiBitCounter = 1 );
if( ! uiBits )
{
RNOK( m_pcBitWriteBufferIf->write( iIntraPredModeLuma, 3 ) );
ETRACE_BITS( iIntraPredModeLuma, 3 );
ETRACE_DO( m_uiBitCounter = 4 );
}
ETRACE_COUNT(m_uiBitCounter);
ETRACE_CODE(iIntraPredModeLuma);
ETRACE_N;
return Err::m_nOK;
}
ErrVal UvlcWriter::cbp( MbDataAccess& rcMbDataAccess )
{
UInt uiCbp = rcMbDataAccess.getMbData().getMbCbp();
ETRACE_T( "Cbp: " );
ETRACE_X ( uiCbp );
AOT_DBG( 48 < uiCbp );
Bool bIntra = ( !rcMbDataAccess.getMbData().getBLSkipFlag() && rcMbDataAccess.getMbData().isIntra() );
UInt uiTemp = ( bIntra ? g_aucCbpIntra[uiCbp]: g_aucCbpInter[uiCbp] );
RNOK( xWriteUvlcCode( uiTemp ) );
ETRACE_N;
return Err::m_nOK;
}
const UChar g_aucTcoeffCDc[3][2]=
{
{0,0},
{2,6},
{4,1}
};
const UChar g_aucRunCDc[4]=
{
2,1,0,0
};
const UChar g_aucRunSScan[16]=
{
4,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0
};
const UChar g_aucTcoeffSScan[4][10]=
{
{ 1, 3, 5, 9,11,13,21,23,25,27},
{ 7,17,19, 0, 0, 0, 0, 0, 0, 0},
{15, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{29, 0, 0, 0, 0, 0, 0, 0, 0, 0},
};
const UChar g_aucRunDScan[8]=
{
9,3,1,1,1,0,0,0
};
const UChar g_aucTcoeffDScan[9][5] =
{
{ 1, 3, 7,15,17},
{ 5,19, 0, 0, 0},
{ 9,21, 0, 0, 0},
{11, 0, 0, 0, 0},
{13, 0, 0, 0, 0},
{23, 0, 0, 0, 0},
{25, 0, 0, 0, 0},
{27, 0, 0, 0, 0},
{29, 0, 0, 0, 0},
};
ErrVal UvlcWriter::residualBlock( MbDataAccess& rcMbDataAccess,
LumaIdx cIdx,
ResidualMode eResidualMode )
{
const UChar* pucScan;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
Int iLevel;
Int iRun = 0;
UInt uiPos = 0;
UInt uiMaxPos = 16;
switch( eResidualMode )
{
case LUMA_I16_DC:
{
pucScan = (bFrame) ? g_aucLumaFrameDCScan : g_aucLumaFieldDCScan;
uiMaxPos = 16;
break;
}
case LUMA_I16_AC:
{
pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
uiPos=1;
break;
}
case LUMA_SCAN:
{
pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
break;
}
default:
return Err::m_nERR;
}
Int aiLevelRun[32];
UInt uiTrailingOnes = 0;
UInt uiTotalRun = 0;
UInt uiCoeffCnt = 0;
while( uiPos < uiMaxPos )
{
if( ( iLevel = piCoeff[ pucScan [ uiPos++ ] ]) )
{
if( abs(iLevel) == 1 )
{
m_uiCoeffCost += COEFF_COST[iRun];
uiTrailingOnes++;
}
else
{
m_uiCoeffCost += MAX_VALUE; // set high cost, shall not be discarded
uiTrailingOnes = 0;
}
aiLevelRun[uiCoeffCnt] = iLevel;
aiLevelRun[uiCoeffCnt+0x10] = iRun;
uiTotalRun += iRun;
uiCoeffCnt++;
iRun = 0;
}
else
{
iRun++;
}
}
if( uiTrailingOnes > 3 )
{
uiTrailingOnes = 3;
}
switch( eResidualMode )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -