📄 cabacwriter.cpp
字号:
{
uiStart = max( 1, uiStart );
}
else
{
return 0;
}
}
for( UInt ui = uiStart; ui < uiStop; ui++ )
{
if( piCoeff[ pucScan[ ui ] ] )
{
uiNumSig++;
}
}
return uiNumSig;
}
ErrVal CabacWriter::xWriteCoeff( UInt uiNumSig,
TCoeff* piCoeff,
ResidualMode eResidualMode,
const UChar* pucScan,
Bool bFrame,
UInt uiStart,
UInt uiStop )
{
CabacContextModel2DBuffer& rcMapCCModel = (bFrame ? m_cMapCCModel : m_cFldMapCCModel );
CabacContextModel2DBuffer& rcLastCCModel = (bFrame ? m_cLastCCModel: m_cFldLastCCModel);
UInt uiCodedSig = 0;
if( CHROMA_DC == eResidualMode || LUMA_I16_DC == eResidualMode )
{
if( uiStart == 0 && uiStop > 0 )
{
uiStop = CHROMA_DC == eResidualMode ? 3 : 15;
}
else
{
ROT( 1 );
}
}
else
{
if( CHROMA_AC == eResidualMode || LUMA_I16_AC == eResidualMode )
{
if( uiStop > 1 )
{
uiStart = max( 1, uiStart );
}
else
{
ROT( 1 );
}
}
uiStop -= 1;
}
UInt ui;
//----- encode significance map -----
for( ui = uiStart; ui < uiStop; ui++ ) // if last coeff is reached, it has to be significant
{
UInt uiSig = piCoeff[ pucScan[ ui ] ] ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSig, rcMapCCModel.get( type2ctx2 [eResidualMode], ui ) ) );
if( uiSig )
{
UInt uiLast = (++uiCodedSig == uiNumSig ? 1 : 0);
RNOK( CabaEncoder::writeSymbol( uiLast, rcLastCCModel.get( type2ctx2 [eResidualMode], ui ) ) );
if( uiLast)
{
break;
}
}
}
int c1 = 1;
int c2 = 0;
//----- encode significant coefficients -----
ui++;
while( (ui--) != uiStart )
{
UInt uiAbs, uiSign;
Int iCoeff = piCoeff[ pucScan[ ui ] ];
if( iCoeff )
{
if( iCoeff > 0) { uiAbs = static_cast<UInt>( iCoeff); uiSign = 0; }
else { uiAbs = static_cast<UInt>(-iCoeff); uiSign = 1; }
UInt uiCtx = min (c1, 4);
UInt uiSymbol = uiAbs > 1 ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cOneCCModel.get( type2ctx1 [eResidualMode], uiCtx ) ) );
if( uiSymbol )
{
uiCtx = min (c2,4);
uiAbs -= 2;
c1 = 0;
c2++;
RNOK( CabaEncoder::writeExGolombLevel( uiAbs, m_cAbsCCModel.get( type2ctx1 [eResidualMode], uiCtx ) ) );
}
else if( c1 )
{
c1++;
}
RNOK( CabaEncoder::writeEPSymbol( uiSign ) );
}
}
return Err::m_nOK;
}
ErrVal CabacWriter::terminatingBit ( UInt uiIsLast )
{
RNOK( CabaEncoder::writeTerminatingBit( uiIsLast ) );
ETRACE_T( "EOS" );
ETRACE_CODE( uiIsLast );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::deltaQp( MbDataAccess& rcMbDataAccess )
{
Int iDQp = rcMbDataAccess.getDeltaQp();
UInt uiCtx = m_uiLastDQpNonZero;
UInt uiDQp = ( iDQp ? 1 : 0 );
RNOK( CabaEncoder::writeSymbol( uiDQp, m_cDeltaQpCCModel.get( 0, uiCtx ) ) );
m_uiLastDQpNonZero = ( 0 != uiDQp ? 1 : 0 );
if( uiDQp )
{
uiDQp = (UInt)( iDQp > 0 ? ( 2 * iDQp - 2 ) : ( -2 * iDQp - 1 ) );
RNOK( CabaEncoder::writeUnarySymbol( uiDQp, &m_cDeltaQpCCModel.get( 0, 2 ), 1 ) );
}
ETRACE_T( "DQp" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE ( iDQp );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::samplesPCM( MbDataAccess& rcMbDataAccess )
{
ETRACE_POS;
ETRACE_T( " PCM SAMPLES: " );
RNOK( CabaEncoder::finish() );
RNOK( m_pcBitWriteBufferIf->write(1) );
RNOK( m_pcBitWriteBufferIf->writeAlignZero() );
rcMbDataAccess.getMbData().setBCBPAll( 1 );
AOF_DBG( rcMbDataAccess.getMbData().isPCM() );
Pel* pSrc = rcMbDataAccess.getMbTCoeffs().getPelBuffer();
const UInt uiFactor = 8*8;
const UInt uiSize = uiFactor*2*3;
RNOK( m_pcBitWriteBufferIf->samples( pSrc, uiSize ) );
ETRACE_N;
RNOK( CabaEncoder::start() );
return Err::m_nOK;
}
UInt CabacWriter::getNumberOfWrittenBits()
{
return CabaEncoder::getWrittenBits();
}
ErrVal CabacWriter::transformSize8x8Flag( MbDataAccess& rcMbDataAccess, UInt uiStart, UInt uiStop )
{
UInt uiSymbol = rcMbDataAccess.getMbData().isTransformSize8x8() ? 1 : 0;
UInt uiCtx = rcMbDataAccess.getCtx8x8Flag( uiStart, uiStop );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cTransSizeCCModel.get( 0, uiCtx ) ) );
ETRACE_T( "transformSize8x8Flag:" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( rcMbDataAccess.getMbData().isTransformSize8x8() );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::residualBlock8x8( MbDataAccess& rcMbDataAccess,
B8x8Idx c8x8Idx,
ResidualMode eResidualMode,
UInt uiStart,
UInt uiStop )
{
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = (bFrame) ? g_aucFrameScan64 : g_aucFieldScan64;
switch( eResidualMode )
{
case LUMA_SCAN:
{
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
ETRACE_T( "LUMA_8x8:" );
ETRACE_V( c8x8Idx.b8x8Index() );
ETRACE_N;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get8x8( c8x8Idx );
UInt ui;
UInt uiNumSig = 0;
ROT( uiStart == uiStop );
uiStart <<= 2;
uiStop <<= 2;
for( UInt uiC = uiStart; uiC < uiStop; uiC++ )
{
if( piCoeff[pucScan[uiC]] )
{
uiNumSig++;
}
}
UInt uiBitPos = c8x8Idx.b4x4();
rcMbDataAccess.getMbData().setBCBP( uiBitPos, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+1, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+4, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+5, 1);
const UInt uiCtxOffset = 2;
CabacContextModel2DBuffer& rcMapCCModel = ( bFrame ? m_cMapCCModel : m_cFldMapCCModel);
CabacContextModel2DBuffer& rcLastCCModel = ( bFrame ? m_cLastCCModel : m_cFldLastCCModel);
UInt uiCodedSig = 0;
const Int* pos2ctx_map = (bFrame) ? pos2ctx_map8x8 : pos2ctx_map8x8i;
//----- encode significance map -----
for( ui = uiStart; ui < uiStop - 1; ui++ ) // if last coeff is reached, it has to be significant
{
UInt uiSig = piCoeff[ pucScan[ ui ] ] ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSig, rcMapCCModel.get( uiCtxOffset, pos2ctx_map[ui] ) ) );
if( uiSig )
{
UInt uiLast = (++uiCodedSig == uiNumSig ? 1 : 0);
RNOK( CabaEncoder::writeSymbol( uiLast, rcLastCCModel.get( uiCtxOffset, pos2ctx_last8x8[ui] ) ) );
if( uiLast)
{
break;
}
}
}
int c1 = 1;
int c2 = 0;
//----- encode significant coefficients -----
ui++;
while( (ui--) != uiStart )
{
UInt uiAbs, uiSign;
Int iCoeff = piCoeff[ pucScan[ ui ] ];
if( iCoeff )
{
if( iCoeff > 0) { uiAbs = static_cast<UInt>( iCoeff); uiSign = 0; }
else { uiAbs = static_cast<UInt>(-iCoeff); uiSign = 1; }
UInt uiCtx = min (c1, 4);
UInt uiSymbol = uiAbs > 1 ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cOneCCModel.get( uiCtxOffset, uiCtx ) ) );
if( uiSymbol )
{
uiCtx = min (c2,4);
uiAbs -= 2;
c1 = 0;
c2++;
RNOK( CabaEncoder::writeExGolombLevel( uiAbs, m_cAbsCCModel.get( uiCtxOffset, uiCtx ) ) );
}
else if( c1 )
{
c1++;
}
RNOK( CabaEncoder::writeEPSymbol( uiSign ) );
}
}
return Err::m_nOK;
}
//JVT-X046 {
void
CabacWriter::loadCabacWrite(MbSymbolWriteIf *pcMbSymbolWriteIf)
{
CabacWriter * pcCabacWriter = (CabacWriter*) (pcMbSymbolWriteIf);
m_cFieldFlagCCModel.setCabacContextModel(pcCabacWriter->getFieldFlagCCModel().getCabacContextModel());
m_cFldMapCCModel.setCabacContextModel(pcCabacWriter->getFldLastCCModel().getCabacContextModel());
m_cFldLastCCModel.setCabacContextModel(pcCabacWriter->getFldLastCCModel().getCabacContextModel());
m_cBLSkipCCModel.setCabacContextModel(pcCabacWriter->getBLSkipCCModel().getCabacContextModel());
m_cBCbpCCModel.setCabacContextModel(pcCabacWriter->getBCbpCCModel().getCabacContextModel());
m_cMapCCModel.setCabacContextModel(pcCabacWriter->getMapCCModel().getCabacContextModel());
m_cLastCCModel.setCabacContextModel(pcCabacWriter->getLastCCModel().getCabacContextModel());
m_cOneCCModel.setCabacContextModel(pcCabacWriter->getOneCCModel().getCabacContextModel());
m_cAbsCCModel.setCabacContextModel(pcCabacWriter->getAbsCCModel().getCabacContextModel());
m_cChromaPredCCModel.setCabacContextModel(pcCabacWriter->getChromaPredCCModel().getCabacContextModel());
m_cMbTypeCCModel.setCabacContextModel(pcCabacWriter->getMbTypeCCModel().getCabacContextModel());
m_cBlockTypeCCModel.setCabacContextModel(pcCabacWriter->getBlockTypeCCModel().getCabacContextModel());
m_cMvdCCModel.setCabacContextModel(pcCabacWriter->getMvdCCModel().getCabacContextModel());
m_cRefPicCCModel.setCabacContextModel(pcCabacWriter->getRefPicCCModel().getCabacContextModel());
m_cMotPredFlagCCModel.setCabacContextModel(pcCabacWriter->getMotPredFlagCCModel().getCabacContextModel());
m_cResPredFlagCCModel.setCabacContextModel(pcCabacWriter->getResPredFlagCCModel().getCabacContextModel());
m_cDeltaQpCCModel.setCabacContextModel(pcCabacWriter->getDeltaQpCCModel().getCabacContextModel());
m_cIntraPredCCModel.setCabacContextModel(pcCabacWriter->getIntraPredCCModel().getCabacContextModel());
m_cCbpCCModel.setCabacContextModel(pcCabacWriter->getCbpCCModel().getCabacContextModel());
m_cTransSizeCCModel.setCabacContextModel(pcCabacWriter->getTransSizeCCModel().getCabacContextModel());
if ( m_pcBitWriteBufferIf == NULL )
{
BitWriteBuffer* pcBitWriteBuffer;
BitWriteBuffer::create(pcBitWriteBuffer);
m_pcBitWriteBufferIf = pcBitWriteBuffer;
}
m_uiRange = pcCabacWriter->m_uiRange;
m_uiLow = pcCabacWriter->m_uiLow;
m_uiByte = pcCabacWriter->m_uiByte;
m_uiBitsLeft = pcCabacWriter->m_uiBitsLeft;
m_uiBitsToFollow = pcCabacWriter->m_uiBitsToFollow;
m_pcBitWriteBufferIf->loadBitWriteBuffer(pcCabacWriter->getBitWriteBufferIf());
}
//JVT-X046 }
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -