⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cabacreader.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:

  AOF_DBG( rcMbDataAccess.getMbData().isPCM() );

  Pel* pDest = rcMbDataAccess.getMbTCoeffs().getPelBuffer();

  // get chroma mode
  const UInt uiFactor = 8*8;
  const UInt uiSize   = uiFactor*2*3;
  DECRNOK( m_pcBitReadBuffer->samples( pDest, uiSize ) );

  DTRACE_N;

  rcMbDataAccess.getMbData().setBCBPAll( 1 );

  RNOK( CabaDecoder::start() );
  return Err::m_nOK;
}







ErrVal CabacReader::transformSize8x8Flag( MbDataAccess& rcMbDataAccess)
{
  UInt uiSymbol;
  UInt uiCtx = rcMbDataAccess.getCtx8x8Flag();

  RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cTransSizeCCModel.get( 0, uiCtx ) ) );

  rcMbDataAccess.getMbData().setTransformSize8x8( uiSymbol != 0 );

  DTRACE_T( "transformSize8x8Flag:" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( rcMbDataAccess.getMbData().isTransformSize8x8() );
  DTRACE_N;

  return Err::m_nOK;
}


ErrVal CabacReader::intraPredModeLuma8x8( MbDataAccess& rcMbDataAccess, B8x8Idx cIdx )
{
  UInt uiSymbol;
  UInt uiIPredMode;

  RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 0 ) ) );

  if( ! uiSymbol )
  {
    RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
    uiIPredMode  = uiSymbol;
    RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
    uiIPredMode |= (uiSymbol << 1);
    RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
    rcMbDataAccess.getMbData().intraPredMode( cIdx ) = ( uiIPredMode | (uiSymbol << 2) );
  }
  else
  {
    rcMbDataAccess.getMbData().intraPredMode( cIdx ) = -1;
  }

  DTRACE_T( "IntraPredModeLuma" );
  DTRACE_TY( "ae(v)" );
  DTRACE_CODE( rcMbDataAccess.getMbData().intraPredMode( cIdx ) );
  DTRACE_N;

  return Err::m_nOK;
}



ErrVal CabacReader::residualBlock8x8( MbDataAccess& rcMbDataAccess,
                                      B8x8Idx       cIdx )
{
  const Bool bFrame    = ( FRAME == rcMbDataAccess.getMbPicType() );
  const UChar* pucScan = (bFrame) ? g_aucFrameScan64 : g_aucFieldScan64;

  DTRACE_T( "LUMA_8x8:" );
  DTRACE_V( cIdx.b8x8Index() );
  DTRACE_N;

  {
    UInt uiBitPos = cIdx;
    rcMbDataAccess.getMbData().setBCBP( uiBitPos,   1);
    rcMbDataAccess.getMbData().setBCBP( uiBitPos+1, 1);
    rcMbDataAccess.getMbData().setBCBP( uiBitPos+4, 1);
    rcMbDataAccess.getMbData().setBCBP( uiBitPos+5, 1);
  }

  TCoeff*     piCoeff     = rcMbDataAccess.getMbTCoeffs().get8x8( cIdx );
  const Int*  pos2ctx_map = (bFrame) ? pos2ctx_map8x8 : pos2ctx_map8x8i;
  UInt        uiStart     = 0;
  UInt        uiStop      = 63;
  UInt        ui;


  {
    const UInt          uiCtxOffset       = 2;
    CabacContextModel*  pcMapCCModel  = ( (bFrame) ? m_cMapCCModel  : m_cFldMapCCModel). get( uiCtxOffset );
    CabacContextModel*  pcLastCCModel = ( (bFrame) ? m_cLastCCModel : m_cFldLastCCModel).get( uiCtxOffset );

    for( ui = uiStart; ui < uiStop; ui++ ) // if last coeff is reached, it has to be significant
    {
      UInt uiSig;
      //--- read significance symbol ---
        RNOKCABAC( CabaDecoder::getSymbol( uiSig, pcMapCCModel[pos2ctx_map[ui]] ) );

      if( uiSig )
      {
        piCoeff[pucScan[ui]] = uiSig;
        UInt uiLast;

          RNOKCABAC( CabaDecoder::getSymbol( uiLast, pcLastCCModel[pos2ctx_last8x8[ui]] ) );

        if( uiLast )
        {
          break;
        }
      }
    }
    //--- last coefficient must be significant if no last symbol was received ---
    if( ui == uiStop )
    {
      piCoeff[pucScan[ui]] = 1;
    }
  }


  int   c1 = 1;
  int   c2 = 0;

  ui++;
  const UInt uiCtxOffset = 2;

  
  while( (ui--) != uiStart )
  {
    Int   iIndex  = pucScan[ui];
    UInt  uiCoeff = piCoeff[iIndex];
    
    if( uiCoeff )
    {
      UInt uiCtx = min (c1,4);

      RNOKCABAC( CabaDecoder::getSymbol( uiCoeff, m_cOneCCModel.get( uiCtxOffset, uiCtx ) ) );

      if( 1 == uiCoeff )
      {
        uiCtx = min (c2,4);
        RNOKCABAC( CabaDecoder::getExGolombLevel( uiCoeff, m_cAbsCCModel.get( uiCtxOffset, uiCtx ) ) );
        uiCoeff += 2;

        c1=0;
        c2++;
      }
      else if (c1)
      {
        uiCoeff++;
        c1++;
      }
      else
      {
        uiCoeff++;
      }

      UInt uiSign;
      RNOKCABAC( CabaDecoder::getEpSymbol( uiSign ) );

      piCoeff[iIndex] = ( uiSign ? -(Int)uiCoeff : (Int)uiCoeff );
    }
  }

  return Err::m_nOK;
}


Bool
CabacReader::RQpeekCbp4x4(    MbDataAccess&  rcMbDataAccessBase,
                               LumaIdx        cIdx )
{
  UInt    uiSymbol  = 0;

  uiSymbol = rcMbDataAccessBase.getMbData().getBCBP( cIdx );
  
  return ( uiSymbol == 1 );
}

ErrVal
CabacReader::RQdecodeBCBP_4x4( MbDataAccess&  rcMbDataAccess,
                               MbDataAccess&  rcMbDataAccessBase,
                               Bool           b8x8,
                               LumaIdx        cIdx,
                               UInt&          ruiSymbol )
{
  ruiSymbol  = 0;
  UInt    uiCtx     = rcMbDataAccessBase.getCtxCodedBlockBit( cIdx );

  RNOKS( CabaDecoder::getSymbol( ruiSymbol, m_cBCbpCCModel.get( type2ctx1[LUMA_SCAN], uiCtx ) ) );
  DTRACE_T( "BCBP_4x4" );
  DTRACE_V( ruiSymbol );
  DTRACE_N;

  // current layer
  rcMbDataAccess.getMbData()    .setBCBP( cIdx, ruiSymbol );
  rcMbDataAccessBase.getMbData().setBCBP( cIdx, ruiSymbol );
  
  return Err::m_nOK;
}


ErrVal
CabacReader::RQdecodeBCBP_ChromaDC( MbDataAccess&   rcMbDataAccess,
                                    MbDataAccess&   rcMbDataAccessBase,
                                    ChromaIdx       cIdx,
                                    UInt&           ruiSymbol )
{
  UInt    uiCtx     = rcMbDataAccessBase.getCtxCodedBlockBit( 24 + cIdx.plane() );

  ruiSymbol  = 0;
  RNOKS( CabaDecoder::getSymbol( ruiSymbol, m_cBCbpCCModel.get( type2ctx1[CHROMA_DC], uiCtx ) ) );
  DTRACE_T( "BCBP_ChromaDC" );
  DTRACE_V( ruiSymbol );
  DTRACE_N;

  rcMbDataAccess.getMbData()    .setBCBP( 24 + cIdx.plane(), ruiSymbol );
  rcMbDataAccessBase.getMbData().setBCBP( 24 + cIdx.plane(), ruiSymbol );
  
  return Err::m_nOK;
}


ErrVal
CabacReader::RQdecodeBCBP_ChromaAC( MbDataAccess&  rcMbDataAccess, 
                                    MbDataAccess&  rcMbDataAccessBase,
                                    ChromaIdx      cIdx,
                                    UInt&          ruiSymbol )
{
  UInt    uiCtx     = rcMbDataAccessBase.getCtxCodedBlockBit( 16 + cIdx );

  ruiSymbol  = 0;
  RNOKS( CabaDecoder::getSymbol( ruiSymbol, m_cBCbpCCModel.get( type2ctx1[CHROMA_AC], uiCtx ) ) );
  DTRACE_T( "BCBP_ChromaAC" );
  DTRACE_V( ruiSymbol );
  DTRACE_N;

  rcMbDataAccess.getMbData()    .setBCBP( 16 + cIdx, ruiSymbol );
  rcMbDataAccessBase.getMbData().setBCBP( 16 + cIdx, ruiSymbol );
  
  return Err::m_nOK;
}


ErrVal
CabacReader::RQdecodeCBP_Chroma   ( MbDataAccess&   rcMbDataAccess,
                                    MbDataAccess&   rcMbDataAccessBase,
                                     UInt&          ruiSymbol )
{
  UInt  uiLeftChromaCbp   = rcMbDataAccessBase.getLeftChromaCbpFGS ();
  UInt  uiAboveChromaCbp  = rcMbDataAccessBase.getAboveChromaCbpFGS();
  UInt  uiCtx             = ( uiLeftChromaCbp > 0 ? 1 : 0 ) + ( uiAboveChromaCbp > 0 ? 2 : 0 );

  ruiSymbol = 0;
  RNOKS( CabaDecoder::getSymbol( ruiSymbol, m_cCbpCCModel.get( 1, uiCtx ) ) );
  DTRACE_T( "CBP_Chroma" );
  DTRACE_V( ruiSymbol );
  DTRACE_N;

  if( ruiSymbol )
  {
    rcMbDataAccess    .getMbData().setMbCbp( rcMbDataAccess    .getMbData().getMbCbp() | 0x10 );
    rcMbDataAccessBase.getMbData().setMbCbp( rcMbDataAccessBase.getMbData().getMbCbp() | 0x10 );
  }
  return Err::m_nOK;
}


ErrVal
CabacReader::RQdecodeCBP_ChromaAC ( MbDataAccess&   rcMbDataAccess,
                                    MbDataAccess&   rcMbDataAccessBase,
                                    UInt&           ruiSymbol )
{
  ruiSymbol          = 0;
  UInt  uiLeftChromaCbp   = rcMbDataAccessBase.getLeftChromaCbpFGS ();
  UInt  uiAboveChromaCbp  = rcMbDataAccessBase.getAboveChromaCbpFGS();
  UInt  uiCtx             = ( uiLeftChromaCbp > 1 ? 1 : 0 ) + ( uiAboveChromaCbp > 1 ? 2 : 0 );

  RNOKS( CabaDecoder::getSymbol( ruiSymbol, m_cCbpCCModel.get( 2, uiCtx ) ) );
  DTRACE_T( "CBP_ChromaAC" );
  DTRACE_V( ruiSymbol );
  DTRACE_N;

  if( ruiSymbol )
  {
    rcMbDataAccess    .getMbData().setMbCbp( ( rcMbDataAccess    .getMbData().getMbCbp() & 0xF ) | 0x20 );
    rcMbDataAccessBase.getMbData().setMbCbp( ( rcMbDataAccessBase.getMbData().getMbCbp() & 0xF ) | 0x20 );
  }
  return Err::m_nOK;
}


ErrVal
CabacReader::RQdecodeCBP_8x8( MbDataAccess& rcMbDataAccess,
                              MbDataAccess& rcMbDataAccessBase,
                              B8x8Idx       c8x8Idx )
{
  UInt  uiSymbol        = 0;
  UInt  uiCurrentCbp    = rcMbDataAccessBase.getMbData().getMbCbp();
  UInt  uiLeftLumaCbp   = rcMbDataAccessBase.getLeftLumaCbpFGS ( c8x8Idx );
  UInt  uiAboveLumaCbp  = rcMbDataAccessBase.getAboveLumaCbpFGS( c8x8Idx );
  UInt  uiCtx           = 0;

  switch( c8x8Idx.b8x8Index() )
  {
  case 0:   uiCtx = 3 - uiLeftLumaCbp         - 2*uiAboveLumaCbp;       break;
  case 1:   uiCtx = 3 - ( uiCurrentCbp    &1) - 2*uiAboveLumaCbp;       break;
  case 2:   uiCtx = 3 - uiLeftLumaCbp         - ((uiCurrentCbp<<1)&2);  break;
  case 3:   uiCtx = 3 - ((uiCurrentCbp>>2)&1) - ( uiCurrentCbp    &2);  break;
  default:  AF();
  }

  RNOKS( CabaDecoder::getSymbol( uiSymbol, m_cCbpCCModel.get( 0, uiCtx ) ) );
  DTRACE_T( "CBP_Luma" );
  DTRACE_V( uiSymbol );
  DTRACE_N;

  if( uiSymbol )
  {
    rcMbDataAccess    .getMbData().setMbCbp( rcMbDataAccess    .getMbData().getMbCbp() | ( 1 << c8x8Idx.b8x8Index() ) );
    rcMbDataAccessBase.getMbData().setMbCbp( rcMbDataAccessBase.getMbData().getMbCbp() | ( 1 << c8x8Idx.b8x8Index() ) );
  }

  return Err::m_nOK;
}


ErrVal
CabacReader::RQdecodeDeltaQp( MbDataAccess& rcMbDataAccess)
{
  UInt  uiDQp = 0;
  Int   iDQp  = 0;
  UInt  uiCtx = 0;

  RNOKS( CabaDecoder::getSymbol( uiDQp, m_cDeltaQpCCModel.get( 0, uiCtx ) ) );
  if( uiDQp )
  {
    RNOKS( CabaDecoder::getUnarySymbol( uiDQp, &m_cDeltaQpCCModel.get( 0, 2 ), 1 ) );

    iDQp = (uiDQp + 2) / 2;

    if( uiDQp & 1 )
    {
      iDQp = -iDQp;
    }
  }
  DTRACE_T( "DQP" );
  DTRACE_V( uiDQp );
  DTRACE_N;

  rcMbDataAccess.addDeltaQp( iDQp );

  return Err::m_nOK;
}


ErrVal
CabacReader::RQdecode8x8Flag( MbDataAccess& rcMbDataAccess,
                              MbDataAccess& rcMbDataAccessBase ) 
{
  UInt uiSymbol = 0;
  UInt uiCtx    = rcMbDataAccessBase.getCtx8x8Flag();
 
  RNOKS( CabaDecoder::getSymbol( uiSymbol, m_cTransSizeCCModel.get( 0, uiCtx ) ) );
  DTRACE_T( "TRAFO_8x8" );
  DTRACE_V( uiSymbol );
  DTRACE_N;

  rcMbDataAccess    .getMbData().setTransformSize8x8( uiSymbol == 1 );
  rcMbDataAccessBase.getMbData().setTransformSize8x8( uiSymbol == 1 );

  return Err::m_nOK;
}


ErrVal
CabacReader::RQdecodeTermBit ( UInt& ruiBit )
{
  RNOKS( CabaDecoder::getTerminateBufferBit( ruiBit ) );
  DTRACE_T( "EOS" );
  DTRACE_V( ruiBit );
  DTRACE_N;

  return Err::m_nOK;
}

ErrVal
CabacReader::RQdecodeNewTCoeff_8x8( MbDataAccess&   rcMbDataAccess,
                                    MbDataAccess&   rcMbDataAccessBase,
                                    B8x8Idx         c8x8Idx,
                                    UInt            uiScanIndex,
                                    Bool&           rbLast,
                                    UInt&           ruiNumCoefRead )
{
  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;

  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 );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -