uvlcreader.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 2,624 行 · 第 1/5 页
CPP
2,624 行
uiLength -= 4;
uiSign = (uiCode & 1);
uiLevel = (uiCode >> 1) + (2048<<uiAddBit)+16-2048;
uiCode |= (1 << (uiLength)); // for display purpose only
uiLength += uiAddBit + 16;
}
iLevel = uiSign ? -(Int)uiLevel : (Int)uiLevel;
DTRACE_POS;
DTRACE_T( " VLC0 lev " );
DTRACE_CODE( iLevel );
DTRACE_N;
DTRACE_COUNT( uiLength );
return Err::m_nOK;
}
ErrVal UvlcReader::xGetLevelVLCN( Int& iLevel, UInt uiVlcLength )
{
UInt uiTemp;
UInt uiLength;
UInt uiCode;
UInt uiLevAbs;
UInt uiSb;
UInt uiSign;
UInt uiAddBit;
UInt uiOffset;
UInt uiNumPrefix = 0;
UInt uiShift = uiVlcLength - 1;
UInt uiEscape = (15<<uiShift)+1;
// read pre zeros
do
{
RNOK( m_pcBitReadBuffer->get( uiTemp, 1 ) );
uiNumPrefix++;
} while ( uiTemp == 0 );
uiLength = uiNumPrefix;
uiCode = 1;
uiNumPrefix--;
if (uiNumPrefix < 15)
{
uiLevAbs = (uiNumPrefix<<uiShift) + 1;
if ( uiVlcLength-1 )
{
RNOK( m_pcBitReadBuffer->get( uiSb, uiVlcLength-1 ) );
uiCode = (uiCode << (uiVlcLength-1) )| uiSb;
uiLevAbs += uiSb;
uiLength += (uiVlcLength-1);
}
// read 1 bit -> sign
RNOK( m_pcBitReadBuffer->get( uiSign, 1 ) );
uiCode = (uiCode << 1)| uiSign;
uiLength++;
}
else // escape
{
uiAddBit = uiNumPrefix - 15;
RNOK( m_pcBitReadBuffer->get( uiSb, (11+uiAddBit) ) );
uiCode = (uiCode << (11+uiAddBit) )| uiSb;
uiLength += (11+uiAddBit);
uiOffset = (2048<<uiAddBit)+uiEscape-2048;
uiLevAbs = uiSb + uiOffset;
// read 1 bit -> sign
RNOK( m_pcBitReadBuffer->get( uiSign, 1 ) );
uiCode = (uiCode << 1)| uiSign;
uiLength++;
}
iLevel = (uiSign) ? -(Int)uiLevAbs : (Int)uiLevAbs;
DTRACE_POS;
DTRACE_T( " VLCN lev: " );
DTRACE_CODE( iLevel );
DTRACE_N;
DTRACE_COUNT( uiLength );
return Err::m_nOK;
}
Bool UvlcReader::isEndOfSlice()
{
UInt uiEOS = ( m_uiRun > 1 ) ? 0 : !( moreRBSPData() );
return (uiEOS == 1);
}
ErrVal UvlcReader::finishSlice( )
{
if( m_bRunLengthCoding && m_uiRun )
{
DTRACE_T( "Run" );
RNOK( xGetUvlcCode( m_uiRun ) );
DTRACE_N;
}
if(!m_bTruncated && m_uiRefSymCounter)
{
UInt uiDenom = 9;
RNOK( m_pSymGrp->xFetchSymbol( CAVLC_SYMGRP_SIZE ) );
UInt uiCode = m_pSymGrp->GetCode();
for(UInt ui = 0; ui < m_uiRefSymCounter; ui++)
{
UChar ucSym;
ucSym = uiCode/uiDenom;
if(ucSym > 0)
{
UInt uiSignBL = ( m_auiBaseCoeffSign[ui] );
UInt uiSymbol = (ucSym == 2) ? 1 : 0;
UInt uiSignEL = ( uiSignBL ^ uiSymbol );
m_pRefCoeffPointer[ui][0] = ( uiSignEL ? -1 : 1 );
}
uiCode = (uiCode % uiDenom);
uiDenom /= 3;
}
}
m_pSymGrp->Flush();
m_uiRefSymCounter = 0;
return Err::m_nOK;
}
ErrVal UvlcReader::residualBlock8x8( MbDataAccess& rcMbDataAccess,
B8x8Idx c8x8Idx )
{
const UChar* pucScan = g_aucFrameScan64;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get8x8( c8x8Idx );
UInt uiBlk;
UInt uiPos;
Int aaiLevelRun [4][32];
UInt auiTrailingOnes [4] = { 0, 0, 0, 0 };
UInt auiTotalRun [4] = { 0, 0, 0, 0 };
UInt auiCoeffCnt [4] = { 0, 0, 0, 0 };
{
UInt uiBitPos = c8x8Idx;
rcMbDataAccess.getMbData().setBCBP( uiBitPos, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+1, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+4, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+5, 1);
}
//===== loop over 4x4 blocks =====
for( uiBlk = 0; uiBlk < 4; uiBlk++ )
{
B4x4Idx cIdx( c8x8Idx.b4x4() + 4*(uiBlk/2) + (uiBlk%2) );
xPredictNonZeroCnt( rcMbDataAccess, cIdx, auiCoeffCnt[uiBlk], auiTrailingOnes[uiBlk] );
xGetRunLevel ( aaiLevelRun[uiBlk], auiCoeffCnt[uiBlk], auiTrailingOnes[uiBlk], 16, auiTotalRun[uiBlk] );
uiPos = ((auiTotalRun[uiBlk] + auiCoeffCnt[uiBlk] - 1) << 2) + uiBlk;
for ( Int i = (Int)auiCoeffCnt[uiBlk]; i > 0; i-- )
{
piCoeff[ pucScan [uiPos] ] = aaiLevelRun[uiBlk][i-1];
uiPos -= 4;
for ( Int j = 0; j < aaiLevelRun[uiBlk][i-1+0x10]; j++ )
{
piCoeff[ pucScan [uiPos] ] = 0;
uiPos -= 4;
}
}
}
return Err::m_nOK;
}
ErrVal
UvlcReader::RQdecodeCycleSymbol( UInt& uiCycle )
{
RNOK( xGetFlag( uiCycle ) );
if ( uiCycle > 0 )
{
UInt uiTemp;
RNOK( xGetFlag( uiTemp ) );
uiCycle += uiTemp;
}
uiCycle++;
return Err::m_nOK;
}
ErrVal
UvlcReader::RQdecodeDeltaQp( MbDataAccess& rcMbDataAccess)
{
Int iDQp = 0;
DTRACE_T ("DQp");
RNOK( xGetSvlcCode( iDQp ) );
DTRACE_TY ("se(v)");
DTRACE_N;
rcMbDataAccess.addDeltaQp( iDQp );
return Err::m_nOK;
}
ErrVal
UvlcReader::RQdecode8x8Flag( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase )
{
UInt uiSymbol = 0;
RNOK( xGetFlag( uiSymbol ) );
DTRACE_T( "TRAFO_8x8" );
DTRACE_V( uiSymbol );
DTRACE_N;
rcMbDataAccess .getMbData().setTransformSize8x8( uiSymbol == 1 );
rcMbDataAccessBase.getMbData().setTransformSize8x8( uiSymbol == 1 );
return Err::m_nOK;
}
Bool
UvlcReader::RQdecodeCBP_8x8( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
B8x8Idx c8x8Idx )
{
UInt uiSymbol = 0;
m_uiCbp8x8 = rcMbDataAccess.getMbData().getMbCbp() & 0x0F;
uiSymbol = (m_uiCbp8x8 >> c8x8Idx.b8x8Index()) & 0x1;
DTRACE_T( "ECBP_Luma" );
DTRACE_V(uiSymbol);
if ( uiSymbol )
{
rcMbDataAccessBase.getMbData().setMbCbp( rcMbDataAccessBase.getMbData().getMbCbp() | ( 1 << c8x8Idx.b8x8Index() ) );
}
DTRACE_V( uiSymbol );
DTRACE_N;
return ( uiSymbol == 1 );
}
Bool
UvlcReader::RQpeekCbp4x4( MbDataAccess& rcMbDataAccessBase,
LumaIdx cIdx )
{
UInt uiSymbol = 0;
uiSymbol = rcMbDataAccessBase.getMbData().getBCBP( cIdx );
return ( uiSymbol == 1 );
}
Bool
UvlcReader::RQdecodeBCBP_4x4( MbDataAccess& rcMbDataAccessBase,
LumaIdx cIdx )
{
if ( (cIdx.x() %2) == 0 && (cIdx.y() %2) == 0)
{
// Write
UInt uiCode = 0;
UInt uiLen = 4;
UInt uiFlip = (m_uiCbpStat4x4[1] > m_uiCbpStat4x4[0]) ? 1 : 0;
UInt uiVlc = (m_uiCbpStat4x4[uiFlip] < 2*m_uiCbpStat4x4[1-uiFlip]) ? 0 : 2;
if (uiVlc == 0)
{
ANOK( xGetCode( uiCode, uiLen ) );
} else {
UInt uiTemp;
ANOK( xCodeFromBitstream2Di( g_auiISymCode[2], g_auiISymLen[2], 1<<uiLen, 1, uiCode, uiTemp ) );
}
if (uiFlip)
uiCode = uiCode ^ ((1<<uiLen)-1);
m_uiCurrCbp4x4 = 0;
UInt ui = uiLen;
for( Int uiY=cIdx.y(); uiY<cIdx.y()+2; uiY++)
for( Int uiX=cIdx.x(); uiX<cIdx.x()+2; uiX++)
{
UInt uiSymbol = 0;
B4x4Idx cTmp(uiY*4+uiX);
ui--;
uiSymbol = (uiCode >> ui) & 0x1;
rcMbDataAccessBase.getMbData().setBCBP( cTmp, uiSymbol );
m_uiCurrCbp4x4 |= uiSymbol<<cTmp;
m_uiCbpStat4x4[uiSymbol]++;
}
// Scaling
if (m_uiCbpStat4x4[0]+m_uiCbpStat4x4[1] > 512)
{
m_uiCbpStat4x4[0] >>= 1;
m_uiCbpStat4x4[1] >>= 1;
}
DTRACE_T( "BCBP_4x4" );
DTRACE_V( uiCode );
DTRACE_N;
}
return ((m_uiCurrCbp4x4 >> cIdx) & 0x1);
}
Bool
UvlcReader::RQdecodeBCBP_ChromaDC( MbDataAccess& rcMbDataAccessBase,
ChromaIdx cIdx )
{
UInt uiSymbol = 0;
ANOK( xGetFlag( uiSymbol ) );
DTRACE_T( "BCBP_ChromaDC" );
DTRACE_V( uiSymbol );
DTRACE_N;
rcMbDataAccessBase.getMbData().setBCBP( 24 + cIdx.plane(), uiSymbol );
return ( uiSymbol == 1 );
}
Bool
UvlcReader::RQdecodeBCBP_ChromaAC( MbDataAccess& rcMbDataAccessBase,
ChromaIdx cIdx )
{
UInt uiSymbol = 0;
ANOK( xGetFlag( uiSymbol ) );
DTRACE_T( "BCBP_ChromaAC" );
DTRACE_V( uiSymbol );
DTRACE_N;
rcMbDataAccessBase.getMbData().setBCBP( 16 + cIdx, uiSymbol );
return ( uiSymbol == 1 );
}
Bool
UvlcReader::RQdecodeCBP_Chroma( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase )
{
UInt uiSymbol = ((rcMbDataAccess.getMbData().getMbCbp()>>4) != 0);
DTRACE_T( "CBP_Chroma" );
DTRACE_V( uiSymbol );
DTRACE_N;
if( uiSymbol )
{
rcMbDataAccessBase.getMbData().setMbCbp( rcMbDataAccessBase.getMbData().getMbCbp() | 0x10 );
rcMbDataAccess .getMbData().setMbCbp( rcMbDataAccess .getMbData().getMbCbp() | 0x10 );
}
return ( uiSymbol == 1 );
}
Bool
UvlcReader::RQdecodeCBP_ChromaAC( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase )
{
UInt uiSymbol = ((rcMbDataAccess.getMbData().getMbCbp()>>4) > 1);
DTRACE_T( "CBP_ChromaAC" );
DTRACE_V( uiSymbol );
DTRACE_N;
if( uiSymbol )
{
rcMbDataAccessBase.getMbData().setMbCbp( ( rcMbDataAccessBase.getMbData().getMbCbp() & 0xF ) | 0x20 );
rcMbDataAccess .getMbData().setMbCbp( ( rcMbDataAccess .getMbData().getMbCbp() & 0xF ) | 0x20 );
}
return ( uiSymbol == 1 );
}
ErrVal
UvlcReader::RQdecodeNewTCoeff_8x8( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
B8x8Idx c8x8Idx,
UInt uiScanIndex,
Bool& rbLast )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get8x8( c8x8Idx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get8x8( c8x8Idx );
const UChar* pucScan = g_aucFrameScan64;
ROT( piCoeffBase[pucScan[uiScanIndex]] );
DTRACE_T( "LUMA_8x8_NEW" );
DTRACE_V( c8x8Idx.b8x8Index() );
DTRACE_V( uiScanIndex );
DTRACE_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 );
//===== last symbol ====
if( rbLast )
{
UInt uiSymbol;
RNOK( xGetFlag( uiSymbol ) );
rbLast = (uiSymbol == 1);
ROTRS( rbLast, Err::m_nOK );
}
//===== SIGNIFICANCE BIT =====
UInt uiSig = 0;
RNOK( xGetFlag( uiSig ) );
if( uiSig )
{
Int iCoeff;
RNOK( xGetLevelVLC0( iCoeff ) );
piCoeff[pucScan[uiScanIndex]] = iCoeff;
}
return Err::m_nOK;
}
ErrVal
UvlcReader::RQdecodeTCoeffRef_8x8( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
B8x8Idx c8x8Idx,
UInt uiScanIndex )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get8x8( c8x8Idx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get8x8( c8x8Idx );
const UChar* pucScan = g_aucFrameScan64;
DTRACE_T( "LUMA_8x8_REF" );
DTRACE_V( c8x8Idx.b8x8Index() );
DTRACE_V( uiScanIndex );
DTRACE_N;
RNOK( xRQdecodeTCoeffsRef( piCoeff, piCoeffBase, pucScan, uiScanIndex ) );
return Err::m_nOK;
}
ErrVal
UvlcReader::RQdecodeNewTCoeff_Luma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ResidualMode eResidualMode,
LumaIdx cIdx,
UInt uiScanIndex,
Bool& rbLast,
UInt& ruiNumCoefRead )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get( cIdx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const UChar* pucScan = g_aucFrameScan;
UInt uiStart = 0;
UInt uiStop = 16;
ROT( piCoeffBase[pucScan[uiScanIndex]] );
DTRACE_T( "LUMA_4x4_NEW" );
DTRACE_V( cIdx.b4x4() );
DTRACE_V( uiScanIndex );
DTRACE_N;
RNOK( xRQdecodeNewTCoeffs( piCoeff, piCoeffBase, uiStart, uiStop, eResidualMode, pucScan, uiScanIndex, m_auiShiftLuma, rbLast, ruiNumCoefRead ) );
return Err::m_nOK;
}
ErrVal
UvlcReader::RQdecodeTCoeffRef_Luma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
LumaIdx cIdx,
UInt uiScanIndex )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get( cIdx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const UChar* pucScan = g_aucFrameScan;
DTRACE_T( "LUMA_4x4_REF" );
DTRACE_V( cIdx.b4x4() );
DTRACE_V( uiScanIndex );
DTRACE_N;
RNOK( xRQdecodeTCoeffsRef( piCoeff, piCoeffBase, pucScan, uiScanIndex ) );
return Err::m_nOK;
}
ErrVal
UvlcReader::RQdecodeNewTCoeff_Chroma( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ResidualMode eResidualMode,
ChromaIdx cIdx,
UInt uiScanIndex,
Bool& rbLast,
UInt& ruiNumCoefRead )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get( cIdx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const UChar* pucScan = ( eResidualMode == CHROMA_DC ? g_aucIndexChromaDCScan : g_aucFrameScan );
UInt uiStart = ( eResidualMode == CHROMA_AC ? 1 : 0 );
UInt uiStop = ( eResidualMode == CHROMA_DC ? 4 : 16 );
ROT( piCoeffBase[pucScan[uiScanIndex]] );
DTRACE_T( "CHROMA_4x4_NEW" );
DTRACE_V( cIdx );
DTRACE_V( uiScanIndex );
DTRACE_N;
RNOK( xRQdecodeNewTCoeffs( piCoeff, piCoeffBase, uiStart, uiStop, eResidualMode, pucScan, uiScanIndex, m_auiShiftChroma, rbLast, ruiNumCoefRead ) );
return Err::m_nOK;
}
ErrVal
UvlcReader::RQdecodeTCoeffRef_Chroma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?