📄 uvlcreader.cpp
字号:
DTRACE_COUNT(m_uiBitCounter);
DTRACE_CODE(rcMbDataAccess.getMbData().intraPredMode( cIdx ));
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::intraPredModeLuma8x8( MbDataAccess& rcMbDataAccess, B8x8Idx cIdx ) // HS: bug fix by Nokia
{
DTRACE_T( "IntraPredModeLuma" );
DTRACE_POS;
UInt uiBits;
RNOK( m_pcBitReadBuffer->get( uiBits, 1 ) );
DTRACE_BITS( uiBits,1 );
DTRACE_DO( m_uiBitCounter = 1 );
if( ! uiBits )
{
UInt uiCode;
RNOK( m_pcBitReadBuffer->get( uiCode, 3 ) );
rcMbDataAccess.getMbData().intraPredMode( cIdx ) = uiCode;
DTRACE_BITS( uiCode, 3 );
DTRACE_DO( m_uiBitCounter = 4 );
}
else
{
rcMbDataAccess.getMbData().intraPredMode( cIdx ) = -1;
}
DTRACE_COUNT(m_uiBitCounter);
DTRACE_CODE(rcMbDataAccess.getMbData().intraPredMode( cIdx ));
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::cbp( MbDataAccess& rcMbDataAccess, UInt uiStart, UInt uiStop )
{
UInt uiTemp = 0;
DTRACE_T( "Cbp: " );
RNOK( xGetUvlcCode( uiTemp ) );
Bool bIntra = ( !rcMbDataAccess.getMbData().getBLSkipFlag() && rcMbDataAccess.getMbData().isIntra() );
UInt uiCbp;
if( ! rcMbDataAccess.getSH().hasDefaultScanIdx() )
{
if( uiTemp == 0 )
{
uiCbp = 0;
if( rcMbDataAccess.isAvailableLeft() )
{
uiCbp = rcMbDataAccess.getMbDataLeft().calcMbCbp( uiStart, uiStop );
}
else if ( rcMbDataAccess.isAvailableAbove() )
{
uiCbp = rcMbDataAccess.getMbDataAbove().calcMbCbp( uiStart, uiStop );
}
}
else
{
uiTemp--;
uiCbp = ( bIntra ? g_aucCbpIntra[uiTemp] : g_aucCbpInter[uiTemp] );
}
}
else
{
uiCbp = ( bIntra ? g_aucCbpIntra[uiTemp]: g_aucCbpInter[uiTemp] );
}
DTRACE_X ( uiCbp );
DTRACE_N;
rcMbDataAccess.getMbData().setMbCbp( uiCbp );
return Err::m_nOK;
}
ErrVal UvlcReader::deltaQp( MbDataAccess& rcMbDataAccess )
{
DTRACE_T ("DQp");
Int uiCode = 0;
RNOK( xGetSvlcCode( uiCode ) );
rcMbDataAccess.addDeltaQp( uiCode );
DTRACE_TY ("se(v)");
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::samplesPCM( MbDataAccess& rcMbDataAccess )
{
DTRACE_POS;
DTRACE_T( " PCM SAMPLES: " );
RNOK( m_pcBitReadBuffer->flush( m_pcBitReadBuffer->getBitsUntilByteAligned() ) );
AOF_DBG( rcMbDataAccess.getMbData().isPCM() );
rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 16 );
Pel* pSrc = rcMbDataAccess.getMbTCoeffs().getPelBuffer();
const UInt uiFactor = 8*8;
const UInt uiSize = uiFactor*2*3;
RNOK( m_pcBitReadBuffer->samples( pSrc, uiSize ) );
DTRACE_N;
DTRACE_COUNT( uiFactor*6 );
return Err::m_nOK;
}
ErrVal UvlcReader::residualBlock( MbDataAccess& rcMbDataAccess,
LumaIdx cIdx,
ResidualMode eResidualMode,
UInt& ruiMbExtCbp,
UInt uiStart,
UInt uiStop )
{
const UChar* pucScan;
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
UInt uiPos;
UInt uiMaxPos = uiStop;
Int aiLevelRun[32];
UInt uiTrailingOnes = 0;
UInt uiTotalRun = 0;
UInt uiCoeffCnt = 0;
for ( uiPos = 0; uiPos < 32; uiPos++ )
{
aiLevelRun[uiPos] = 0;
}
uiPos = uiStart;
switch( eResidualMode )
{
case LUMA_I16_DC:
{
pucScan = (bFrame) ? g_aucLumaFrameDCScan : g_aucLumaFieldDCScan;
uiMaxPos = 16;
DTRACE_T( "Luma:" );
DTRACE_V( cIdx );
DTRACE_N;
xPredictNonZeroCnt( rcMbDataAccess, cIdx, uiCoeffCnt, uiTrailingOnes, uiStart, uiStop );
ROF( uiStart == 0 && uiStop == 16 );
xGetRunLevel( aiLevelRun, uiCoeffCnt, uiTrailingOnes, 16, uiTotalRun, rcMbDataAccess );
break;
}
case LUMA_I16_AC:
{
pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
uiPos=1;
DTRACE_T( "Luma:" );
DTRACE_V( cIdx );
DTRACE_N;
xPredictNonZeroCnt( rcMbDataAccess, cIdx, uiCoeffCnt, uiTrailingOnes, uiStart, uiStop );
xGetRunLevel( aiLevelRun, uiCoeffCnt, uiTrailingOnes, uiStop - max(1,uiStart), uiTotalRun, rcMbDataAccess );
break;
}
case LUMA_SCAN:
{
pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
DTRACE_T( "Luma:" );
DTRACE_V( cIdx );
DTRACE_N;
xPredictNonZeroCnt( rcMbDataAccess, cIdx, uiCoeffCnt, uiTrailingOnes, uiStart, uiStop );
xGetRunLevel( aiLevelRun, uiCoeffCnt, uiTrailingOnes, uiStop - uiStart, uiTotalRun, rcMbDataAccess );
// this is useful only in AR_FGS
rcMbDataAccess.getMbData().setBCBP( cIdx, uiCoeffCnt != 0);
break;
}
default:
return Err::m_nERR;
}
uiPos += uiTotalRun + uiCoeffCnt - 1;
for ( Int i = (Int)uiCoeffCnt; i > 0; i-- )
{
piCoeff[ pucScan [uiPos--] ] = aiLevelRun[i-1];
for ( Int j = 0; j < aiLevelRun[i-1+0x10]; j++ )
{
piCoeff[ pucScan [uiPos--] ] = 0;
}
}
Bool bCoded = (uiCoeffCnt > 0);
if( ! bCoded )
{
ruiMbExtCbp &= ~(1 << cIdx.b4x4() );
}
return Err::m_nOK;
}
ErrVal UvlcReader::residualBlock( MbDataAccess& rcMbDataAccess,
ChromaIdx cIdx,
ResidualMode eResidualMode,
UInt uiStart,
UInt uiStop )
{
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
const UChar* pucScan;
UInt uiPos, uiMaxPos;
Int aiLevelRun[32];
UInt uiTrailingOnes = 0;
UInt uiTotalRun = 0;
UInt uiCoeffCnt = 0;
for ( uiPos = 0; uiPos < 32; uiPos++ )
{
aiLevelRun[uiPos] = 0;
}
uiPos = 0;
switch( eResidualMode )
{
case CHROMA_DC:
{
pucScan = g_aucIndexChromaDCScan;
uiPos=0; uiMaxPos= 4;
ROF( uiStart == 0 );
DTRACE_T( "CHROMA_DC:" );
DTRACE_V( cIdx );
DTRACE_N;
xGetTrailingOnes4( uiCoeffCnt, uiTrailingOnes );
xGetRunLevel( aiLevelRun, uiCoeffCnt, uiTrailingOnes, 4, uiTotalRun, rcMbDataAccess );
// this is useful only in AR_FGS
rcMbDataAccess.getMbData().setBCBP( 24 + cIdx.plane(), uiCoeffCnt != 0);
break;
}
case CHROMA_AC:
{
pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
ROF( uiStop > 1 );
uiPos = max( 1, uiStart );
uiMaxPos = uiStop;
DTRACE_T( "CHROMA_AC:" );
DTRACE_V( cIdx );
DTRACE_N;
xPredictNonZeroCnt( rcMbDataAccess, cIdx, uiCoeffCnt, uiTrailingOnes, uiStart, uiStop );
xGetRunLevel( aiLevelRun, uiCoeffCnt, uiTrailingOnes, uiStop - max( 1, uiStart ), uiTotalRun, rcMbDataAccess );
// this is useful only in AR_FGS
rcMbDataAccess.getMbData().setBCBP( 16 + cIdx, uiCoeffCnt != 0);
break;
}
default:
return Err::m_nERR;
}
uiPos += uiTotalRun + uiCoeffCnt - 1;
for ( Int i = (Int)uiCoeffCnt; i > 0; i-- )
{
piCoeff[ pucScan [uiPos--] ] = aiLevelRun[i-1];
for ( Int j = 0; j < aiLevelRun[i-1+0x10]; j++ )
{
piCoeff[ pucScan [uiPos--] ] = 0;
}
}
return Err::m_nOK;
}
ErrVal UvlcReader::transformSize8x8Flag( MbDataAccess& rcMbDataAccess )
{
DTRACE_T( "transformSize8x8Flag:" );
UInt uiCode;
RNOK( xGetFlag( uiCode) );
rcMbDataAccess.getMbData().setTransformSize8x8( uiCode?true:false );
DTRACE_V( uiCode );
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::xGetRefFrame( Bool bWriteBit, UInt& uiRefFrame, ListIdx eLstIdx )
{
DTRACE_T( "RefFrame" );
UInt uiCode;
if( bWriteBit )
{
RNOK( xGetFlag( uiCode ) );
uiRefFrame = 1-uiCode;
}
else
{
RNOK( xGetUvlcCode( uiRefFrame ) );
}
DTRACE_V( uiRefFrame+1 );
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::xGetMotionPredFlag( Bool& rbFlag )
{
DTRACE_T( "MotionPredFlag" );
UInt uiCode;
RNOK( xGetFlag( uiCode ) );
DTRACE_V( uiCode );
DTRACE_N;
rbFlag = (uiCode == 1);
return Err::m_nOK;
}
ErrVal UvlcReader::xGetMvd( Mv& cMv )
{
DTRACE_T( "Mvd: x" );
UInt uiTemp = 0;
RNOK( xGetUvlcCode( uiTemp ) );
Short sHor = ( uiTemp & 1) ? (Int)((uiTemp+1)>>1) : -(Int)(uiTemp>>1);
DTRACE_CODE( sHor );
DTRACE_TY("se(v)");
DTRACE_N;
DTRACE_T( "Mvd: y" );
RNOK( xGetUvlcCode( uiTemp ) );
Short sVer = ( uiTemp & 1) ? (Int)((uiTemp+1)>>1) : -(Int)(uiTemp>>1);
DTRACE_CODE( sVer );
DTRACE_TY("se(v)");
DTRACE_N;
cMv.setHor( sHor );
cMv.setVer( sVer );
return Err::m_nOK;
}
ErrVal UvlcReader::xPredictNonZeroCnt( MbDataAccess& rcMbDataAccess, LumaIdx cIdx, UInt& uiCoeffCount, UInt& uiTrailingOnes, UInt uiStart, UInt uiStop )
{
UInt uiCoeffCountCtx = rcMbDataAccess.getCtxCoeffCount( cIdx, uiStart, uiStop );
if( ! rcMbDataAccess.getSH().hasDefaultScanIdx() )
{
UInt uiDummy, uiTargetCoeffTokenIdx;
RNOK( xCodeFromBitstream2D( &g_aucCwCodeVectTO16[uiCoeffCountCtx][0], &g_aucCwLenVectTO16[uiCoeffCountCtx][0], 62, 1, uiTargetCoeffTokenIdx, uiDummy ) );
uiCoeffCountCtx = min(uiCoeffCountCtx, 2);
UInt uiBw = uiStop-uiStart;
UInt uiXdim = min(16,uiBw)+1;
UInt uiYdim = min(3, uiBw)+1;
UInt uiCoeffTokenIdx, uiIdx;
for( uiCoeffTokenIdx = uiIdx = 0; uiIdx <= uiTargetCoeffTokenIdx; uiCoeffTokenIdx++ )
{
if( g_aucCwMapTO16[uiCoeffCountCtx][uiCoeffTokenIdx] < uiYdim && g_aucCwMapTC16[uiCoeffCountCtx][uiCoeffTokenIdx] < uiXdim )
{
uiIdx++;
}
}
uiTrailingOnes = g_aucCwMapTO16[uiCoeffCountCtx][uiCoeffTokenIdx-1];
uiCoeffCount = g_aucCwMapTC16[uiCoeffCountCtx][uiCoeffTokenIdx-1];
}
else
{
xGetTrailingOnes16( uiCoeffCountCtx, uiCoeffCount, uiTrailingOnes );
}
rcMbDataAccess.getMbTCoeffs().setCoeffCount( cIdx, uiCoeffCount );
return Err::m_nOK;
}
ErrVal UvlcReader::xPredictNonZeroCnt( MbDataAccess& rcMbDataAccess, ChromaIdx cIdx, UInt& uiCoeffCount, UInt& uiTrailingOnes, UInt uiStart, UInt uiStop )
{
UInt uiCoeffCountCtx = rcMbDataAccess.getCtxCoeffCount( cIdx, uiStart, uiStop );
if( ! rcMbDataAccess.getSH().hasDefaultScanIdx() )
{
UInt uiDummy, uiTargetCoeffTokenIdx;
RNOK( xCodeFromBitstream2D( &g_aucCwCodeVectTO16[uiCoeffCountCtx][0], &g_aucCwLenVectTO16[uiCoeffCountCtx][0], 62, 1, uiTargetCoeffTokenIdx, uiDummy ) );
uiCoeffCountCtx = min(uiCoeffCountCtx, 2);
UInt uiBw = uiStop-uiStart;
UInt uiXdim = min(16,uiBw)+1;
UInt uiYdim = min(3, uiBw)+1;
UInt uiCoeffTokenIdx, uiIdx;
for( uiCoeffTokenIdx = uiIdx = 0; uiIdx <= uiTargetCoeffTokenIdx; uiCoeffTokenIdx++ )
{
if( g_aucCwMapTO16[uiCoeffCountCtx][uiCoeffTokenIdx] < uiYdim && g_aucCwMapTC16[uiCoeffCountCtx][uiCoeffTokenIdx] < uiXdim )
{
uiIdx++;
}
}
uiTrailingOnes = g_aucCwMapTO16[uiCoeffCountCtx][uiCoeffTokenIdx-1];
uiCoeffCount = g_aucCwMapTC16[uiCoeffCountCtx][uiCoeffTokenIdx-1];
}
else
{
xGetTrailingOnes16( uiCoeffCountCtx, uiCoeffCount, uiTrailingOnes );
}
rcMbDataAccess.getMbTCoeffs().setCoeffCount( cIdx, uiCoeffCount );
return Err::m_nOK;
}
ErrVal UvlcReader::xGetTrailingOnes16( UInt uiLastCoeffCount, UInt& uiCoeffCount, UInt& uiTrailingOnes )
{
DTRACE_POS;
if( 3 == uiLastCoeffCount )
{
UInt uiBits;
RNOK( m_pcBitReadBuffer->get( uiBits, 6 ) );
DTRACE_DO( m_uiBitCounter = 6 );
uiTrailingOnes = ( uiBits & 0x3 );
uiCoeffCount = ( uiBits >> 2 );
if ( !uiCoeffCount && uiTrailingOnes == 3 )
{
uiTrailingOnes = 0;
}
else
{
uiCoeffCount++;
}
}
else
{
ROF( uiLastCoeffCount < 3 );
RNOK( xCodeFromBitstream2D( &g_aucCodeTableTO16[uiLastCoeffCount][0][0], &g_aucLenTableTO16[uiLastCoeffCount][0][0], 17, 4, uiCoeffCount, uiTrailingOnes ) );
DTRACE_DO( m_uiBitCounter = g_aucLenTableTO16[uiLastCoeffCount][uiTrailingOnes][uiCoeffCount] );
}
DTRACE_T( " TrailingOnes16: Vlc: " );
DTRACE_V( uiLastCoeffCount );
DTRACE_T( " CoeffCnt: " );
DTRACE_V( uiCoeffCount );
DTRACE_T( " TraiOnes: " );
DTRACE_V( uiTrailingOnes );
DTRACE_N;
DTRACE_COUNT(m_uiBitCounter);
return Err::m_nOK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -