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

📄 createrh264avcdecoder.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 4 页
字号:
, m_pcCabacReader           ( 0 )
, m_pcSampleWeighting       ( 0 )
#ifdef SHARP_AVC_REWRITE_OUTPUT
, m_pcRewriteEncoder        ( 0 )
#endif
{
  ::memset( m_apcDecodedPicBuffer,     0x00, MAX_LAYERS * sizeof( Void* ) );
  ::memset( m_apcLayerDecoder,         0x00, MAX_LAYERS * sizeof( Void* ) );
  ::memset( m_apcPocCalculator,        0x00, MAX_LAYERS * sizeof( Void* ) );
  ::memset( m_apcYuvFullPelBufferCtrl, 0x00, MAX_LAYERS * sizeof( Void* ) );
}

CreaterH264AVCDecoder::~CreaterH264AVCDecoder()
{
}

ErrVal
CreaterH264AVCDecoder::create( CreaterH264AVCDecoder*& rpcCreaterH264AVCDecoder )
{
  rpcCreaterH264AVCDecoder = new CreaterH264AVCDecoder;
  ROT( NULL == rpcCreaterH264AVCDecoder );
  RNOK( rpcCreaterH264AVCDecoder->xCreateDecoder() )
  return Err::m_nOK;
}

ErrVal
CreaterH264AVCDecoder::xCreateDecoder()
{
  RNOK( ParameterSetMng         ::create( m_pcParameterSetMngAUInit ) );
  RNOK( ParameterSetMng         ::create( m_pcParameterSetMngDecode ) );
  RNOK( BitReadBuffer           ::create( m_pcBitReadBuffer ) );
  RNOK( NalUnitParser           ::create( m_pcNalUnitParser) );
  RNOK( SliceReader             ::create( m_pcSliceReader ) );
  RNOK( SliceDecoder            ::create( m_pcSliceDecoder ) );
  RNOK( UvlcReader              ::create( m_pcUvlcReader ) );
  RNOK( CabacReader             ::create( m_pcCabacReader ) );
  RNOK( MbParser                ::create( m_pcMbParser ) );
  RNOK( MbDecoder               ::create( m_pcMbDecoder ) );
  RNOK( LoopFilter              ::create( m_pcLoopFilter ) );
  RNOK( IntraPrediction         ::create( m_pcIntraPrediction ) );
  RNOK( MotionCompensation      ::create( m_pcMotionCompensation ) );
  RNOK( H264AVCDecoder          ::create( m_pcH264AVCDecoder ) );
  RNOK( ControlMngH264AVCDecoder::create( m_pcControlMng ) );
  RNOK( ReconstructionBypass    ::create( m_pcReconstructionBypass ) );
  RNOK( SampleWeighting         ::create( m_pcSampleWeighting ) );
  RNOK( QuarterPelFilter        ::create( m_pcQuarterPelFilter ) );
  RNOK( Transform               ::create( m_pcTransform ) );
#ifdef SHARP_AVC_REWRITE_OUTPUT
  RNOK( RewriteEncoder          ::create( m_pcRewriteEncoder ) );
#endif

  for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
  {
    RNOK( DecodedPicBuffer      ::create( m_apcDecodedPicBuffer     [uiLayer] ) );
    RNOK( LayerDecoder          ::create( m_apcLayerDecoder         [uiLayer] ) );
    RNOK( PocCalculator         ::create( m_apcPocCalculator        [uiLayer] ) );
    RNOK( YuvBufferCtrl         ::create( m_apcYuvFullPelBufferCtrl [uiLayer] ) );
  }

  return Err::m_nOK;
}


ErrVal
CreaterH264AVCDecoder::destroy()
{
  RNOK( m_pcSliceDecoder          ->destroy() );
  RNOK( m_pcSliceReader           ->destroy() );
  RNOK( m_pcBitReadBuffer         ->destroy() );
  RNOK( m_pcUvlcReader            ->destroy() );
  RNOK( m_pcMbParser              ->destroy() );
  RNOK( m_pcLoopFilter            ->destroy() );
  RNOK( m_pcMbDecoder             ->destroy() );
  RNOK( m_pcTransform             ->destroy() );
  RNOK( m_pcIntraPrediction       ->destroy() );
  RNOK( m_pcMotionCompensation    ->destroy() );
  RNOK( m_pcQuarterPelFilter      ->destroy() );
  RNOK( m_pcCabacReader           ->destroy() );
  RNOK( m_pcNalUnitParser         ->destroy() );
  RNOK( m_pcParameterSetMngAUInit ->destroy() );
  RNOK( m_pcParameterSetMngDecode ->destroy() );
  RNOK( m_pcSampleWeighting       ->destroy() );
  RNOK( m_pcH264AVCDecoder        ->destroy() );
  RNOK( m_pcControlMng            ->destroy() );
  RNOK( m_pcReconstructionBypass  ->destroy() );
#ifdef SHARP_AVC_REWRITE_OUTPUT
  RNOK( m_pcRewriteEncoder        ->destroy() );
#endif

  for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
  {
    RNOK( m_apcDecodedPicBuffer    [uiLayer]->destroy() );
    RNOK( m_apcLayerDecoder        [uiLayer]->destroy() );
    RNOK( m_apcPocCalculator       [uiLayer]->destroy() );
    RNOK( m_apcYuvFullPelBufferCtrl[uiLayer]->destroy() );
  }
  delete this;
  return Err::m_nOK;
}

ErrVal
CreaterH264AVCDecoder::init( Bool bOpenTrace )
{
  if( bOpenTrace )
  {
    INIT_DTRACE;
    OPEN_DTRACE;
  }

  RNOK( m_pcBitReadBuffer         ->init() );
  RNOK( m_pcNalUnitParser         ->init( m_pcBitReadBuffer, m_pcUvlcReader ) );
  RNOK( m_pcUvlcReader            ->init( m_pcBitReadBuffer ) );
  RNOK( m_pcCabacReader           ->init( m_pcBitReadBuffer ) );
  RNOK( m_pcQuarterPelFilter      ->init() );
  RNOK( m_pcParameterSetMngAUInit ->init() );
  RNOK( m_pcParameterSetMngDecode ->init() );
  RNOK( m_pcSampleWeighting       ->init() );
  RNOK( m_pcSliceDecoder          ->init( m_pcMbDecoder, m_pcControlMng ) );
  RNOK( m_pcSliceReader           ->init( m_pcMbParser ) );
  RNOK( m_pcMbParser              ->init() );
  RNOK( m_pcLoopFilter            ->init( m_pcControlMng, m_pcReconstructionBypass, false ) );
  RNOK( m_pcIntraPrediction       ->init() );
  RNOK( m_pcMotionCompensation    ->init( m_pcQuarterPelFilter, m_pcTransform, m_pcSampleWeighting ) );
  RNOK( m_pcMbDecoder             ->init( m_pcTransform, m_pcIntraPrediction, m_pcMotionCompensation ) );
  RNOK( m_pcH264AVCDecoder        ->init( m_pcNalUnitParser,
                                          m_pcUvlcReader,
                                          m_pcParameterSetMngAUInit,
                                          m_pcParameterSetMngDecode,
                                          m_apcLayerDecoder ) );
  RNOK( m_pcReconstructionBypass  ->init() );
#ifdef SHARP_AVC_REWRITE_OUTPUT
  RNOK( m_pcRewriteEncoder        ->init() );
#endif

  for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
  {
    RNOK( m_apcDecodedPicBuffer[uiLayer]->init ( m_apcYuvFullPelBufferCtrl [uiLayer],
                                                 uiLayer ) );
#ifdef SHARP_AVC_REWRITE_OUTPUT
    RNOK( m_apcLayerDecoder    [uiLayer]->init ( uiLayer,
                                                 m_pcH264AVCDecoder,
                                                 m_pcNalUnitParser,
                                                 m_pcSliceReader,
                                                 m_pcSliceDecoder,
                                                 m_pcControlMng,
                                                 m_pcLoopFilter,
                                                 m_pcUvlcReader,
                                                 m_pcParameterSetMngDecode,
                                                 m_apcPocCalculator        [uiLayer],
                                                 m_apcYuvFullPelBufferCtrl [uiLayer],
                                                 m_apcDecodedPicBuffer     [uiLayer],
                                                 m_pcMotionCompensation,
												                         m_pcReconstructionBypass,
                                                 m_pcRewriteEncoder ) );
#else
    RNOK( m_apcLayerDecoder    [uiLayer]->init ( uiLayer,
                                                 m_pcH264AVCDecoder,
                                                 m_pcNalUnitParser,
                                                 m_pcSliceReader,
                                                 m_pcSliceDecoder,
                                                 m_pcControlMng,
                                                 m_pcLoopFilter,
                                                 m_pcUvlcReader,
                                                 m_pcParameterSetMngDecode,
                                                 m_apcPocCalculator        [uiLayer],
                                                 m_apcYuvFullPelBufferCtrl [uiLayer],
                                                 m_apcDecodedPicBuffer     [uiLayer],
                                                 m_pcMotionCompensation,
												                         m_pcReconstructionBypass ) );
#endif
  }

  RNOK( m_pcControlMng            ->init( m_pcUvlcReader, 
                                          m_pcMbParser, 
                                          m_pcMotionCompensation, 
                                          m_apcYuvFullPelBufferCtrl, 
                                          m_pcCabacReader, 
                                          m_pcSampleWeighting, 
                                          m_apcLayerDecoder ) );

  return Err::m_nOK;
}

ErrVal
CreaterH264AVCDecoder::uninit( Bool bCloseTrace )
{
  RNOK( m_pcSampleWeighting       ->uninit() );
  RNOK( m_pcQuarterPelFilter      ->uninit() );
  RNOK( m_pcParameterSetMngAUInit ->uninit() );
  RNOK( m_pcParameterSetMngDecode ->uninit() );
  RNOK( m_pcSliceDecoder          ->uninit() );
  RNOK( m_pcSliceReader           ->uninit() );
  RNOK( m_pcNalUnitParser         ->uninit() );
  RNOK( m_pcBitReadBuffer         ->uninit() );
  RNOK( m_pcUvlcReader            ->uninit() );
  RNOK( m_pcMbParser              ->uninit() );
  RNOK( m_pcLoopFilter            ->uninit() );
  RNOK( m_pcMbDecoder             ->uninit() );
  RNOK( m_pcIntraPrediction       ->uninit() );
  RNOK( m_pcMotionCompensation    ->uninit() );
  RNOK( m_pcCabacReader           ->uninit() );
  RNOK( m_pcH264AVCDecoder        ->uninit() );
  RNOK( m_pcControlMng            ->uninit() );
  RNOK( m_pcReconstructionBypass  ->uninit() );
#ifdef SHARP_AVC_REWRITE_OUTPUT
  RNOK( m_pcRewriteEncoder        ->uninit() );
#endif

  for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
  {
    RNOK( m_apcDecodedPicBuffer    [uiLayer] ->uninit() );
    RNOK( m_apcLayerDecoder        [uiLayer] ->uninit() );
    RNOK( m_apcYuvFullPelBufferCtrl[uiLayer] ->uninit() );
  }

  if( bCloseTrace )
  {
    CLOSE_DTRACE;
  }

  return Err::m_nOK;
}

ErrVal
CreaterH264AVCDecoder::initNALUnit( BinData*& rpcBinData, AccessUnit& rcAccessUnit )
{
  RNOK( m_pcH264AVCDecoder->initNALUnit( rpcBinData, rcAccessUnit ) );
  return Err::m_nOK;
}

ErrVal
CreaterH264AVCDecoder::processNALUnit( PicBuffer*         pcPicBuffer,
                                       PicBufferList&     rcPicBufferOutputList,
                                       PicBufferList&     rcPicBufferUnusedList,
                                       BinDataList&       rcBinDataList,
                                       NALUnit&           rcNALUnit )
{
  RNOK( m_pcH264AVCDecoder->processNALUnit( pcPicBuffer, rcPicBufferOutputList, rcPicBufferUnusedList, rcBinDataList, rcNALUnit ) );
  return Err::m_nOK;
}








H264AVCPacketAnalyzer::H264AVCPacketAnalyzer()
: m_pcBitReadBuffer       ( 0 )
, m_pcUvlcReader          ( 0 )
, m_pcNalUnitParser       ( 0 )
, m_uiStdAVCOffset        ( 0 )
, m_pcNonRequiredSEI      ( 0 )
, m_uiNonRequiredSeiFlag  ( 0 )
, m_uiPrevPicLayer        ( 0 )
, m_uiCurrPicLayer        ( 0 )
{
  for( Int iLayer = 0; iLayer < MAX_SCALABLE_LAYERS; iLayer++ )
  {
    m_silceIDOfSubPicLayer[iLayer] = -1;
  }
}


H264AVCPacketAnalyzer::~H264AVCPacketAnalyzer()
{
}


ErrVal
H264AVCPacketAnalyzer::create( H264AVCPacketAnalyzer*& rpcH264AVCPacketAnalyzer )
{
  rpcH264AVCPacketAnalyzer = new H264AVCPacketAnalyzer;
  ROT ( NULL == rpcH264AVCPacketAnalyzer );
  RNOK( rpcH264AVCPacketAnalyzer->xCreate() );
  return Err::m_nOK;
}



ErrVal
H264AVCPacketAnalyzer::xCreate()
{
  RNOK( BitReadBuffer::create( m_pcBitReadBuffer ) );
  RNOK( UvlcReader   ::create( m_pcUvlcReader    ) );
  RNOK( NalUnitParser::create( m_pcNalUnitParser  ) );

  return Err::m_nOK;
}



ErrVal
H264AVCPacketAnalyzer::destroy()
{
  RNOK( m_pcBitReadBuffer ->destroy() );
  RNOK( m_pcUvlcReader    ->destroy() );
  RNOK( m_pcNalUnitParser ->destroy() );
  delete this;
  return Err::m_nOK;
}



ErrVal
H264AVCPacketAnalyzer::init()
{
  RNOK( m_pcBitReadBuffer ->init() );
  RNOK( m_pcUvlcReader    ->init( m_pcBitReadBuffer ) );
  RNOK( m_pcNalUnitParser ->init( m_pcBitReadBuffer, m_pcUvlcReader ) );
  m_uiPrevPicLayer = 0;
  return Err::m_nOK;
}


ErrVal
H264AVCPacketAnalyzer::uninit()
{
  RNOK( m_pcBitReadBuffer ->uninit() );
  RNOK( m_pcUvlcReader    ->uninit() );
  RNOK( m_pcNalUnitParser ->uninit() );
  return Err::m_nOK;
}

⌨️ 快捷键说明

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