📄 cabacwriter.cpp
字号:
ETRACE_T( "TRAFO_8x8" );
ETRACE_V( uiSymbol );
ETRACE_N;
rcMbDataAccessBase.getMbData().setTransformSize8x8( rcMbDataAccess.getMbData().isTransformSize8x8() );
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeTermBit ( UInt uiBit )
{
RNOK( CabaEncoder::writeTerminatingBit( uiBit ) );
ETRACE_T( "EOS" );
ETRACE_V( uiBit );
ETRACE_N;
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeNewTCoeff_8x8( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
B8x8Idx c8x8Idx,
UInt uiScanIndex,
Bool& rbLast,
UInt& ruiNumCoefWritten )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get8x8( c8x8Idx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get8x8( c8x8Idx );
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = (bFrame) ? g_aucFrameScan64 : g_aucFieldScan64;
const UInt uiCtxOffset = 2;
UInt ui;
ROT( piCoeffBase[pucScan[uiScanIndex]] );
ETRACE_T( "LUMA_8x8_NEW" );
ETRACE_V( c8x8Idx.b8x8Index() );
ETRACE_V( uiScanIndex );
ETRACE_N;
rcMbDataAccessBase.getMbData().setBCBP( c8x8Idx.b4x4(), 1 );
rcMbDataAccessBase.getMbData().setBCBP( c8x8Idx.b4x4()+1, 1 );
rcMbDataAccessBase.getMbData().setBCBP( c8x8Idx.b4x4()+4, 1 );
rcMbDataAccessBase.getMbData().setBCBP( c8x8Idx.b4x4()+5, 1 );
//===== end-of-block =====
if( rbLast )
{
for( ui = uiScanIndex; ui < 64; ui++ )
{
if( piCoeff[pucScan[ui]] && ! piCoeffBase[pucScan[ui]] )
{
rbLast = 0;
break;
}
}
UInt uiPrevSigCycle = 0;
// there must be one significant coefficient already
for( ui = uiScanIndex - 1; ui >= 0; ui -- ) {
if( piCoeff[pucScan[ui]] && ! piCoeffBase[pucScan[ui]] ) {
uiPrevSigCycle = ui;
break;
}
}
RNOK( CabaEncoder::writeSymbol( (UInt) rbLast, m_cLastCCModel.get( uiCtxOffset, pos2ctx_last8x8[uiPrevSigCycle] ) ) );
ROTRS( rbLast, Err::m_nOK );
}
else
{
rbLast = 0;
}
//===== SIGNIFICANCE BIT =====
UInt uiLastScanPosition = uiScanIndex + 1;
while( uiLastScanPosition < 64 && piCoeffBase[pucScan[uiLastScanPosition]] )
uiLastScanPosition ++;
UInt uiSig;
if( uiLastScanPosition < 64 )
{
uiSig = piCoeff[pucScan[uiScanIndex] ] ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSig, m_cMapCCModel.get(uiCtxOffset, pos2ctx_map8x8[uiScanIndex] ) ) );
}
else uiSig = 1;
if( uiSig )
{
UInt uiAbs = ( piCoeff[pucScan[uiScanIndex]] > 0 ? piCoeff[pucScan[uiScanIndex]].getCoeff() : -1*(Short)piCoeff[pucScan[uiScanIndex]].getCoeff() );
UInt uiSign = ( piCoeff[pucScan[uiScanIndex]] > 0 ? 0 : 1 );
//===== SIGN =====
RNOK( CabaEncoder::writeEPSymbol( uiSign ) );
//===== ABSOLUTE VALUE =====
UInt uiCtx = 1;
UInt uiSymbol = ( uiAbs > 1 ? 1 : 0 );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cOneCCModel.get( uiCtxOffset, uiCtx ) ) );
if( uiSymbol )
{
uiCtx = 0;
uiAbs -= 2;
RNOK( CabaEncoder::writeExGolombLevel( uiAbs, m_cAbsCCModel.get( uiCtxOffset, uiCtx ) ) );
}
}
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeTCoeffRef_8x8( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
B8x8Idx c8x8Idx,
UInt uiScanIndex,
UInt uiCtx )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get8x8( c8x8Idx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get8x8( c8x8Idx );
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = (bFrame) ? g_aucFrameScan64 : g_aucFieldScan64;
ETRACE_T( "LUMA_8x8_REF" );
ETRACE_V( c8x8Idx.b8x8Index() );
ETRACE_V( uiScanIndex );
ETRACE_V( uiCtx );
ETRACE_N;
UInt uiSig = ( piCoeff[pucScan[uiScanIndex]] ? 1 : 0 );
RNOK( CabaEncoder::writeSymbol( uiSig, m_cRefCCModel.get( 0, 2 * uiCtx ) ) );
if( uiSig )
{
UInt uiSignBL = ( piCoeffBase[pucScan[uiScanIndex]] < 0 ? 1 : 0 );
UInt uiSignEL = ( piCoeff [pucScan[uiScanIndex]] < 0 ? 1 : 0 );
UInt uiSymbol = ( uiSignBL ^ uiSignEL );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cRefCCModel.get( 0, 1 + 2 * uiCtx ) ) );
}
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeNewTCoeff_Luma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ResidualMode eResidualMode,
Bool b8x8,
LumaIdx cIdx,
UInt uiScanIndex,
Bool& rbLast,
UInt& ruiNumCoefWritten )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get( cIdx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
UInt uiStop = 16;
ROT( piCoeffBase[pucScan[uiScanIndex]] );
ETRACE_T( "LUMA_4x4_NEW" );
ETRACE_V( cIdx.b4x4() );
ETRACE_V( uiScanIndex );
ETRACE_N;
RNOK( xRQencodeNewTCoeffs( piCoeff, piCoeffBase, uiStop, type2ctx1[eResidualMode], type2ctx2[eResidualMode], pucScan, uiScanIndex, rbLast, ruiNumCoefWritten ) );
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeTCoeffRef_Luma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
LumaIdx cIdx,
UInt uiScanIndex,
UInt uiCtx )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get( cIdx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
ETRACE_T( "LUMA_4x4_REF" );
ETRACE_V( cIdx.b4x4() );
ETRACE_V( uiScanIndex );
ETRACE_V( uiCtx );
ETRACE_N;
RNOK( xRQencodeTCoeffsRef( piCoeff, piCoeffBase, pucScan, uiScanIndex, uiCtx ) );
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeNewTCoeff_Chroma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ResidualMode eResidualMode,
ChromaIdx cIdx,
UInt uiScanIndex,
Bool& rbLast,
UInt& ruiNumCoefWritten )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get( cIdx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = ( eResidualMode == CHROMA_DC ? g_aucIndexChromaDCScan : ((bFrame) ? g_aucFrameScan : g_aucFieldScan) );
UInt uiStop = ( eResidualMode == CHROMA_DC ? 4 : 16 );
ROT( piCoeffBase[pucScan[uiScanIndex]] );
ETRACE_T( "CHROMA_4x4_NEW" );
ETRACE_V( cIdx );
ETRACE_V( uiScanIndex );
ETRACE_N;
RNOK( xRQencodeNewTCoeffs( piCoeff, piCoeffBase, uiStop, type2ctx1[eResidualMode], type2ctx2[eResidualMode], pucScan, uiScanIndex, rbLast, ruiNumCoefWritten ) );
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeTCoeffRef_Chroma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ResidualMode eResidualMode,
ChromaIdx cIdx,
UInt uiScanIndex,
UInt uiCtx )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get( cIdx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = ( eResidualMode == CHROMA_DC ? g_aucIndexChromaDCScan : ((bFrame) ? g_aucFrameScan : g_aucFieldScan) );
ETRACE_T( "CHROMA_4x4_REF" );
ETRACE_V( cIdx );
ETRACE_V( uiScanIndex );
ETRACE_V( uiCtx );
ETRACE_N;
RNOK( xRQencodeTCoeffsRef( piCoeff, piCoeffBase, pucScan, uiScanIndex, uiCtx ) );
return Err::m_nOK;
}
ErrVal
CabacWriter::xRQencodeNewTCoeffs( TCoeff* piCoeff,
TCoeff* piCoeffBase,
UInt uiStop,
UInt uiCtx1,
UInt uiCtx2,
const UChar* pucScan,
UInt uiScanIndex,
Bool& rbLast,
UInt& ruiNumCoefWritten,
const int* paiCtxEobMap,
const int* paiCtxSigMap,
UInt uiStride )
{
UInt ui;
ruiNumCoefWritten = 0;
if( rbLast )
{
rbLast = true;
for( ui = uiScanIndex; ui < uiStop; ui+=uiStride )
{
if( piCoeff[pucScan[ui]] && ! piCoeffBase[pucScan[ui]] )
{
rbLast = false;
break;
}
}
UInt uiPrevSigCycle = 0;
// there must be one significant coefficient already
for( ui = uiScanIndex - 1; ui >= 0; ui -- ) {
if( piCoeff[pucScan[ui]] && ! piCoeffBase[pucScan[ui]] ) {
uiPrevSigCycle = ui;
break;
}
}
RNOK( CabaEncoder::writeSymbol( rbLast, m_cLastCCModel.get( uiCtx2, paiCtxEobMap[uiPrevSigCycle] ) ) );
ROTRS(rbLast, Err::m_nOK);
} else
rbLast = false;
//===== SIGNIFICANCE BIT ======
UInt uiSig;
do
{
ruiNumCoefWritten++;
UInt uiLastScanPosition = uiScanIndex + uiStride;
while (uiLastScanPosition < uiStop && piCoeffBase[pucScan[uiLastScanPosition]])
uiLastScanPosition += uiStride;
if (uiLastScanPosition < uiStop)
{
uiSig = piCoeff[pucScan[uiScanIndex] ] ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSig, m_cMapCCModel.get( uiCtx2, paiCtxSigMap[uiScanIndex] ) ) );
} else {
uiSig = 1;
}
if( uiSig )
{
break;
}
uiScanIndex+=uiStride;
while (uiScanIndex < uiStop && piCoeffBase[pucScan[uiScanIndex]])
uiScanIndex+=uiStride;
}
while ( true );
UInt uiAbs = ( piCoeff[pucScan[uiScanIndex]] > 0 ? piCoeff[pucScan[uiScanIndex]].getCoeff() : -1*(Short)piCoeff[pucScan[uiScanIndex]].getCoeff() );
UInt uiSign = ( piCoeff[pucScan[uiScanIndex]] > 0 ? 0 : 1 );
//===== SIGN =====
RNOK( CabaEncoder::writeEPSymbol( uiSign ) );
//===== ABSOLUTE VALUE =====
UInt uiCtx = 1;
UInt uiSymbol = ( uiAbs > 1 ? 1 : 0 );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cOneCCModel.get( uiCtx1, uiCtx ) ) );
if( uiSymbol )
{
uiCtx = 0;
uiAbs -= 2;
RNOK( CabaEncoder::writeExGolombLevel( uiAbs, m_cAbsCCModel.get( uiCtx1, uiCtx ) ) );
}
return Err::m_nOK;
}
ErrVal
CabacWriter::xRQencodeTCoeffsRef( TCoeff* piCoeff,
TCoeff* piCoeffBase,
const UChar* pucScan,
UInt uiScanIndex,
UInt uiCtx )
{
UInt uiSig = ( piCoeff[pucScan[uiScanIndex]] ? 1 : 0 );
RNOK( CabaEncoder::writeSymbol( uiSig, m_cRefCCModel.get( 0, 2 * uiCtx ) ) );
if( uiSig )
{
UInt uiSignBL = ( piCoeffBase[pucScan[uiScanIndex]] < 0 ? 1 : 0 );
UInt uiSignEL = ( piCoeff [pucScan[uiScanIndex]] < 0 ? 1 : 0 );
UInt uiSymbol = ( uiSignBL ^ uiSignEL );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cRefCCModel.get( 0, 1 + 2 * uiCtx ) ) );
}
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeCycleSymbol( UInt uiCycle )
{
// Changed mapping to match syntax (justin.ridge@nokia.com)
RNOK( CabaEncoder::writeEPSymbol( uiCycle > 0 ) );
if ( uiCycle > 0 )
RNOK( CabaEncoder::writeEPSymbol( uiCycle - 1 ) );
// heiko.schwarz@hhi.fhg.de: return added
return Err::m_nOK;
}
ErrVal
CabacWriter::RQcompSepAlign()
{
CabacWriter::finish();
// start() takes care of byte align
CabacWriter::start();
return Err::m_nOK;
}
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -