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

📄 cabacreader.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  DTRACE_T( "EOS" );
  DTRACE_CODE( uiEOS );
  DTRACE_N;

  return (uiEOS == 1);
}


ErrVal CabacReader::xReadBCbp( MbDataAccess& rcMbDataAccess, Bool& rbCoded, ResidualMode eResidualMode, ChromaIdx cIdx )
{
  UInt uiBitPos;

  if( CHROMA_AC == eResidualMode )
  {
    uiBitPos = 16 + cIdx;
  }
  else if( CHROMA_DC == eResidualMode )
  {
    uiBitPos = 24 + cIdx.plane();
  }
  else
  {
    // full stop
    AF();
    return Err::m_nERR;
  }

  UInt uiCtx      = rcMbDataAccess.getCtxCodedBlockBit( uiBitPos );
  UInt uiBit;

  RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cBCbpCCModel.get( type2ctx1[ eResidualMode ], uiCtx) ) );

  rbCoded = ( uiBit == 1 );
  rcMbDataAccess.getMbData().setBCBP( uiBitPos, uiBit);

  return Err::m_nOK;
}


ErrVal CabacReader::xReadBCbp( MbDataAccess& rcMbDataAccess, Bool& rbCoded, ResidualMode eResidualMode, LumaIdx cIdx )
{
  UInt uiBitPos;

  if( LUMA_SCAN == eResidualMode || LUMA_I16_AC == eResidualMode )
  {
    uiBitPos = cIdx;
  }
  else if( LUMA_I16_DC == eResidualMode )
  {
    uiBitPos = 26;
  }
  else
  {
    // full stop
    AF();
    return Err::m_nERR;
  }

  UInt uiCtx      = rcMbDataAccess.getCtxCodedBlockBit( uiBitPos );
  UInt uiBit;

  RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cBCbpCCModel.get( type2ctx1[ eResidualMode ], uiCtx) ) );

  rbCoded = ( uiBit == 1 );
  rcMbDataAccess.getMbData().setBCBP( uiBitPos, uiBit);


  return Err::m_nOK;
}





ErrVal CabacReader::xReadCoeff( TCoeff*         piCoeff,
                                ResidualMode    eResidualMode,
                                const UChar*    pucScan
                                )
{
  CabacContextModel2DBuffer&  rcMapCCModel  = m_cMapCCModel;
  CabacContextModel2DBuffer&  rcLastCCModel = m_cLastCCModel;

  UInt uiStart = 0;
  UInt uiStop  = 15;

  if( CHROMA_AC   == eResidualMode  ||
      LUMA_I16_AC == eResidualMode    )
  {
    uiStart = 1;
  }
  if( CHROMA_DC   == eResidualMode    )
  {
    uiStop = 3;
  }

  UInt ui;
  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, rcMapCCModel.get( type2ctx2[eResidualMode], ui ) ) );

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

      UInt uiLast;
      RNOKCABAC( CabaDecoder::getSymbol( uiLast, rcLastCCModel.get( type2ctx2[eResidualMode], 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++;

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

      RNOKCABAC( CabaDecoder::getSymbol( uiCoeff, m_cOneCCModel.get( type2ctx1[eResidualMode], uiCtx ) ) );

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

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

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

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

  return Err::m_nOK;
}



ErrVal CabacReader::samplesPCM( MbDataAccess& rcMbDataAccess )
{
  RNOK( CabaDecoder::finish() );

  DTRACE_POS;
  DTRACE_T( "  PCM SAMPLES: " );

  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 UChar*  pucScan       = g_aucFrameScan64;

  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 = pos2ctx_map8x8;
  UInt        uiStart     = 0;
  UInt        uiStop      = 63;
  UInt        ui;


  {
    const UInt          uiCtxOffset       = 2;
    CabacContextModel*  pcMapCCModel      = m_cMapCCModel .get( uiCtxOffset );
    CabacContextModel*  pcLastCCModel     = m_cLastCCModel.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 );
}


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

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

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



Bool
CabacReader::RQdecodeBCBP_ChromaDC( MbDataAccess&   rcMbDataAccessBase,
                                    ChromaIdx       cIdx )
{
  UInt    uiSymbol  = 0;
  UInt    uiCtx     = rcMbDataAccessBase.getCtxCodedBlockBit( 24 + cIdx.plane() );

  ANOK( CabaDecoder::getSymbol( uiSymbol, m_cBCbpCCModel.get( type2ctx1[CHROMA_DC], uiCtx ) ) );
  DTRACE_T( "BCBP_ChromaDC" );
  DTRACE_V( uiSymbol );
  DTRACE_N;

  rcMbDataAccessBase.getMbData().setBCBP( 24 + cIdx.plane(), uiSymbol );
  
  return ( uiSymbol == 1 );
}


Bool
CabacReader::RQdecodeBCBP_ChromaAC( MbDataAccess&  rcMbDataAccessBase,
                                    ChromaIdx      cIdx )
{
  UInt    uiSymbol  = 0;
  UInt    uiCtx     = rcMbDataAccessBase.getCtxCodedBlockBit( 16 + cIdx );

  ANOK( CabaDecoder::getSymbol( uiSymbol, m_cBCbpCCModel.get( type2ctx1[CHROMA_AC], uiCtx ) ) );
  DTRACE_T( "BCBP_ChromaAC" );
  DTRACE_V( uiSymbol );
  DTRACE_N;

  rcMbDataAccessBase.getMbData().setBCBP( 16 + cIdx, uiSymbol );
  
  return ( uiSymbol == 1 );
}







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

  ANOK( CabaDecoder::getSymbol( uiSymbol, m_cCbpCCModel.get( 1, uiCtx ) ) );
  DTRACE_T( "CBP_Chroma" );
  DTRACE_V( uiSymbol );
  DTRACE_N;

⌨️ 快捷键说明

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