📄 uvlcwriter.cpp
字号:
{
uiTemp >>= 1;
uiLength += 2;
}
RNOK( m_pcBitWriteBufferIf->write( uiVal, uiLength ) );
ETRACE_TY( "ue(v)" );
ETRACE_BITS( uiVal, uiLength );
ETRACE_POS;
ETRACE_DO( uiVal-- );
ETRACE_CODE( uiVal );
ETRACE_COUNT (uiLength);
return Err::m_nOK;
}
ErrVal UvlcWriter::xWriteSvlcCode( Int iVal)
{
UInt uiVal = xConvertToUInt( iVal );
UInt uiLength = 1;
UInt uiTemp = ++uiVal;
AOF_DBG( uiTemp );
while( 1 != uiTemp )
{
uiTemp >>= 1;
uiLength += 2;
}
RNOK( m_pcBitWriteBufferIf->write( uiVal, uiLength ) );
ETRACE_TY( "ue(v)" );
ETRACE_BITS( uiVal, uiLength );
ETRACE_POS;
ETRACE_CODE( iVal );
ETRACE_COUNT (uiLength);
return Err::m_nOK;
}
ErrVal UvlcWriter::writeUvlc( UInt uiCode, Char* pcTraceString )
{
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 );
if( uiLength > 9 )
{
Char acType[] = "u(00)";
acType[2] += uiLength/10;
acType[3] += uiLength%10;
ETRACE_TY( acType );
}
else
{
Char acType[] = " u(0)";
acType[3] += uiLength;
ETRACE_TY( acType );
}
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() ? 1 : 0 );
ETRACE_T( "ResidualPredFlag" );
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;
}
UvlcWriter* UvlcWriter::xGetUvlcWriterNextSlice( Bool bStartNewBitstream )
{
if( !m_pcNextUvlcWriter || bStartNewBitstream )
{
if( !m_pcNextUvlcWriter )
{
UvlcWriter::create( m_pcNextUvlcWriter );
}
m_pcNextUvlcWriter->init( m_pcBitWriteBufferIf->getNextBitWriteBuffer( true ) );
}
return m_pcNextUvlcWriter;
}
ErrVal UvlcWriter::cbp( MbDataAccess& rcMbDataAccess, UInt uiStart, UInt uiStop )
{
UInt uiCbp = rcMbDataAccess.getMbData().calcMbCbp( uiStart, uiStop ) ;
ETRACE_T( "Cbp: " );
ETRACE_X ( uiCbp );
AOT_DBG( 48 < uiCbp );
Bool bIntra = ( !rcMbDataAccess.getMbData().getBLSkipFlag() && rcMbDataAccess.getMbData().isIntra() );
if( rcMbDataAccess.getMbData().isIntra() )
{
ROF( rcMbDataAccess.getMbData().isIntraBL() == rcMbDataAccess.getMbData().getBLSkipFlag() );
}
if( uiStart != 0 || uiStop != 16 )
{
ROT( bIntra );
}
UInt uiTemp = ( bIntra ? g_aucCbpIntra[uiCbp]: g_aucCbpInter[uiCbp] );
if( uiStart != 0 || uiStop != 16 )
{
UInt uiPrevCbp = 0;
if( rcMbDataAccess.isAvailableLeft() )
uiPrevCbp = rcMbDataAccess.getMbDataLeft().calcMbCbp( uiStart, uiStop );
else if ( rcMbDataAccess.isAvailableAbove() )
uiPrevCbp = rcMbDataAccess.getMbDataAbove().calcMbCbp( uiStart, uiStop );
UInt uiPrevTemp = ( bIntra ? g_aucCbpIntra[uiPrevCbp]: g_aucCbpInter[uiPrevCbp] );
RNOK( xWriteUvlcCode( (uiTemp == uiPrevTemp) ? 0:(uiTemp+1) ) );
}
else
{
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,
UInt uiStart,
UInt uiStop )
{
const UChar* pucScan;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -