📄 uvlcwriter.cpp
字号:
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::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;
}
#if JMVM_ONLY // JVT-W081
ErrVal UvlcWriter::MotionSkipFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiCode = ( rcMbDataAccess.getMbData().getMotionSkipFlag() ? 1 : 0 );
ETRACE_T( "MotionSkipFlag" );
RNOK( xWriteFlag( uiCode ) );
ETRACE_N;
rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 0 );
return Err::m_nOK;
}
// JVT-W081
//JVT-Z021
ErrVal UvlcWriter::MotionSkipOffset( MbDataAccess& rcMbDataAccess )
{
Mv cMv = rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset;
RNOK( xWriteMotionSkipOffset( cMv ) );
return Err::m_nOK;
}
ErrVal UvlcWriter::MotionSkipListXFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiCode;
if(rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag>=0)
uiCode = rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag;
else
printf("\n error uvlc");
ETRACE_T( "MotionSkipListXFlag" );
RNOK( xWriteFlag( uiCode ) );
ETRACE_N;
return Err::m_nOK;
}
#endif //JMVM_ONLY
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;
}
#if JMVM_ONLY //JVT-Z021
ErrVal UvlcWriter::xWriteMotionSkipOffset( Mv cMv )
{
ETRACE_T( "Offset: 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( "Offset: y" );
uiTemp = xConvertToUInt( sVer );
RNOK( xWriteUvlcCode( uiTemp ) );
ETRACE_CODE( sVer );
ETRACE_TY("se(v)");
ETRACE_N;
return Err::m_nOK;
}
//JVT-Z021
// JVT-U052
ErrVal UvlcWriter::Icpd( MbDataAccess& rcMbDataAccess )
{
UInt uiIcAct = rcMbDataAccess.getMbData().getMbIcp().getIcAct();
Icp cIcp = rcMbDataAccess.getMbData().getMbIcp().getIcp();
RNOK( xWriteFlag( uiIcAct) );
if (uiIcAct)
RNOK( xWriteIcpd( cIcp ) );
return Err::m_nOK;
}
ErrVal UvlcWriter::xWriteIcpd( Icp cIcp )
{
UInt uiTemp;
Short sSymOffset = cIcp.getSymbolOffset();
uiTemp = xConvertToUInt( sSymOffset );
RNOK( xWriteUvlcCode( uiTemp ) );
ETRACE_T( "Icpd: offsetSym" );
ETRACE_CODE( sSymOffset );
ETRACE_TY("se(v)");
ETRACE_T( " offset " );
ETRACE_V( cIcp.getOffset() );
ETRACE_T( " pred " );
ETRACE_V( cIcp.getPredOffset() );
ETRACE_N;
return Err::m_nOK;
}
#endif //JMVM_ONLY
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;
const TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
Int iLevel;
Int iRun = 0;
UInt uiPos = 0;
UInt uiMaxPos = 16;
switch( eResidualMode )
{
case LUMA_I16_DC:
{
pucScan = g_aucLumaFrameDCScan;
uiMaxPos = 16;
break;
}
case LUMA_I16_AC:
{
pucScan = g_aucFrameScan;
uiPos=1;
break;
}
case LUMA_SCAN:
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -