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

📄 gopdecoder.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  m_bIsCoded      = false;
  m_pcSliceHeader = 0;
}

Bool
MbStatus::canBeUpdated( const SliceHeader* pcSliceHeader )
{
  ROTRS( pcSliceHeader->getQualityId() == 0 && m_uiSliceIdc == MSYS_UINT_MAX,                   true );
  ROTRS( pcSliceHeader->getQualityId() != 0 && pcSliceHeader->getRefLayerDQId() == getDQId() &&
         ( m_bIsCoded || !pcSliceHeader->isTrueSlice() ),                                       true );
  return false;
}

ErrVal
MbStatus::update( SliceHeader* pcSliceHeader )
{
  ROF( canBeUpdated( pcSliceHeader ) );
  m_uiSliceIdc    = pcSliceHeader->getFirstMbInSlice() << 7;
  m_uiSliceIdc   += pcSliceHeader->getDependencyId  () << 4;
  m_uiSliceIdc   += pcSliceHeader->getQualityId     ();
  m_bIsCoded      = pcSliceHeader->isTrueSlice      ();
  m_pcSliceHeader = pcSliceHeader;
  return Err::m_nOK;
}



LayerDecoder::LayerDecoder()
: m_pcH264AVCDecoder                    ( 0 )
, m_pcNalUnitParser                     ( 0 )
, m_pcSliceReader                       ( 0 )
, m_pcSliceDecoder                      ( 0 )
, m_pcControlMng                        ( 0 )
, m_pcLoopFilter                        ( 0 )
, m_pcHeaderSymbolReadIf                ( 0 )
, m_pcParameterSetMng                   ( 0 )
, m_pcPocCalculator                     ( 0 )
, m_pcYuvFullPelBufferCtrl              ( 0 )
, m_pcDecodedPictureBuffer              ( 0 )
, m_pcMotionCompensation                ( 0 )
, m_pcReconstructionBypass              ( 0 )
#ifdef SHARP_AVC_REWRITE_OUTPUT
, m_pcRewriteEncoder                    ( 0 )
#endif
, m_bInitialized                        ( false )
, m_bSPSInitialized                     ( false )
, m_bDependencyRepresentationInitialized( false )
, m_bLayerRepresentationInitialized     ( false )
, m_uiFrameWidthInMb                    ( 0 )
, m_uiFrameHeightInMb                   ( 0 )
, m_uiMbNumber                          ( 0 )
, m_uiDependencyId                      ( 0 )
, m_uiQualityId                         ( 0 )
, m_pacMbStatus                         ( 0 )
, m_pcCurrDPBUnit                       ( 0 )
, m_pcBaseLayerCtrl                     ( 0 )
, m_pcBaseLayerCtrlField                ( 0 )
, m_pcResidual                          ( 0 )
, m_pcILPrediction                      ( 0 )
, m_pcBaseLayerFrame                    ( 0 )
, m_pcBaseLayerResidual                 ( 0 )
{
  ::memset( m_apcFrameTemp, 0x00, sizeof( m_apcFrameTemp ) );
}


LayerDecoder::~LayerDecoder()
{
  while( m_cSliceHeaderList.size() )
  {
    SliceHeader*  pcSliceHeader = m_cSliceHeaderList.popFront();
    delete        pcSliceHeader;
  }
}


ErrVal
LayerDecoder::create( LayerDecoder*& rpcLayerDecoder )
{
  rpcLayerDecoder = new LayerDecoder;
  ROT( NULL == rpcLayerDecoder );
  return Err::m_nOK;
}


ErrVal
LayerDecoder::destroy()
{
  ROT( m_bInitialized );
  delete this;
  return Err::m_nOK;
}


ErrVal
LayerDecoder::init( UInt                   uiDependencyId,
                   H264AVCDecoder*        pcH264AVCDecoder,
                   NalUnitParser*         pcNalUnitParser,
                   SliceReader*           pcSliceReader,
                   SliceDecoder*          pcSliceDecoder,
                   ControlMngIf*          pcControlMng,
                   LoopFilter*            pcLoopFilter,
                   HeaderSymbolReadIf*    pcHeaderSymbolReadIf,
                   ParameterSetMng*       pcParameterSetMng,
                   PocCalculator*         pcPocCalculator,
                   YuvBufferCtrl*         pcYuvFullPelBufferCtrl,
                   DecodedPicBuffer*      pcDecodedPictureBuffer,
                   MotionCompensation*    pcMotionCompensation,
				           ReconstructionBypass*  pcReconstructionBypass 
#ifdef SHARP_AVC_REWRITE_OUTPUT
                   ,RewriteEncoder*       pcRewriteEncoder
#endif
                   )
{
  ROT( m_bInitialized );
  ROF( pcH264AVCDecoder );
  ROF( pcNalUnitParser );
  ROF( pcSliceReader );
  ROF( pcSliceDecoder );
  ROF( pcControlMng );
  ROF( pcLoopFilter );
  ROF( pcHeaderSymbolReadIf );
  ROF( pcParameterSetMng );
  ROF( pcPocCalculator );
  ROF( pcYuvFullPelBufferCtrl );
  ROF( pcDecodedPictureBuffer );
  ROF( pcMotionCompensation );
  ROF( pcReconstructionBypass );
#ifdef SHARP_AVC_REWRITE_OUTPUT
  ROF( pcRewriteEncoder );
#endif

  m_pcH264AVCDecoder                      = pcH264AVCDecoder;
  m_pcNalUnitParser                       = pcNalUnitParser;
  m_pcSliceReader                         = pcSliceReader;
  m_pcSliceDecoder                        = pcSliceDecoder ;
  m_pcControlMng                          = pcControlMng;
  m_pcLoopFilter                          = pcLoopFilter;
  m_pcHeaderSymbolReadIf                  = pcHeaderSymbolReadIf;
  m_pcParameterSetMng                     = pcParameterSetMng;
  m_pcPocCalculator                       = pcPocCalculator;
  m_pcYuvFullPelBufferCtrl                = pcYuvFullPelBufferCtrl;
  m_pcDecodedPictureBuffer                = pcDecodedPictureBuffer;
  m_pcMotionCompensation                  = pcMotionCompensation;
  m_pcReconstructionBypass                = pcReconstructionBypass;
#ifdef SHARP_AVC_REWRITE_OUTPUT
  m_pcRewriteEncoder                      = pcRewriteEncoder;
#endif

  m_bInitialized                          = true;
  m_bSPSInitialized                       = false;
  m_bDependencyRepresentationInitialized  = false;
  m_bLayerRepresentationInitialized       = false;
  m_uiFrameWidthInMb                      = 0;
  m_uiFrameHeightInMb                     = 0;
  m_uiMbNumber                            = 0;
  m_uiDependencyId                        = uiDependencyId;
  m_uiQualityId                           = 0;

  m_pacMbStatus                           = 0;

  m_pcCurrDPBUnit                         = 0;
  m_pcBaseLayerCtrl                       = 0;
  m_pcBaseLayerCtrlField                  = 0;
  m_pcResidual                            = 0;
  m_pcILPrediction                        = 0;
  m_pcBaseLayerFrame                      = 0;
  m_pcBaseLayerResidual                   = 0;

  return Err::m_nOK;
}


ErrVal
LayerDecoder::uninit()
{
  ROF ( m_bInitialized );
  RNOK( xDeleteData() );
  m_bInitialized  = false;
  return Err::m_nOK;
}


ErrVal
LayerDecoder::processSliceData( PicBuffer*         pcPicBuffer,
                                PicBufferList&     rcPicBufferOutputList,
                                PicBufferList&     rcPicBufferUnusedList,
                                BinDataList&       rcBinDataList,
                                SliceDataNALUnit&  rcSliceDataNALUnit )
{
  ROF( m_bInitialized );
  ROF( pcPicBuffer );

  //===== process slice =====
  SliceHeader*  pcSliceHeader                     = 0;
  Bool          bFirstSliceInLayerRepresentation  = ! m_bLayerRepresentationInitialized;
  RNOK( xInitSlice  ( pcSliceHeader, pcPicBuffer, rcPicBufferOutputList, rcPicBufferUnusedList, rcSliceDataNALUnit ) );

  //===== parse, decode, and finish slice =====
  RNOK( xParseSlice ( *pcSliceHeader ) );
  RNOK( xDecodeSlice( *pcSliceHeader, rcSliceDataNALUnit, bFirstSliceInLayerRepresentation ) );
  RNOK( xFinishSlice( *pcSliceHeader, rcPicBufferOutputList, rcPicBufferUnusedList, rcSliceDataNALUnit, rcBinDataList ) );
  return Err::m_nOK;
}


ErrVal
LayerDecoder::finishProcess( PicBufferList&  rcPicBufferOutputList,
                           PicBufferList&  rcPicBufferUnusedList )
{
  ROF( m_bInitialized );
  
  RNOK ( m_pcDecodedPictureBuffer->clear( rcPicBufferOutputList, rcPicBufferUnusedList ) );
  while( m_cSliceHeaderList.size() )
  {
    SliceHeader*  pcSliceHeader = m_cSliceHeaderList.popFront();
    delete        pcSliceHeader;
  }
  return Err::m_nOK;
}


ErrVal
LayerDecoder::xInitSlice( SliceHeader*&     rpcSliceHeader,
                          PicBuffer*        pcPicBuffer,
                          PicBufferList&    rcPicBufferOutputList,
                          PicBufferList&    rcPicBufferUnusedList,
                          SliceDataNALUnit& rcSliceDataNalUnit )
{
  //===== delete non-required slice headers =====
  if( ! m_bDependencyRepresentationInitialized )
  {
    while( m_cSliceHeaderList.size() )
    {
      SliceHeader*  pcSliceHeader = m_cSliceHeaderList.popFront();
      delete        pcSliceHeader;
    }
  }

  //===== create, read, init, and store slice header (and init SPS when required) =====
  RNOK( xReadSliceHeader          (  rpcSliceHeader, rcSliceDataNalUnit ) );
  RNOK( xInitSliceHeader          ( *rpcSliceHeader, rcSliceDataNalUnit ) );
  RNOK( xInitSPS                  ( *rpcSliceHeader ) );
  m_cSliceHeaderList.push_back    (  rpcSliceHeader );

  //===== init DPB unit (when required) =====
  RNOK( xInitDPBUnit              ( *rpcSliceHeader, pcPicBuffer, rcPicBufferOutputList, rcPicBufferUnusedList ) );

  //===== init resize parameters =====  ---> write new function xInitResizeParameters, which is somewhat nicer 
  RNOK( xInitESSandCroppingWindow ( *rpcSliceHeader, *m_pcCurrDPBUnit->getCtrlData().getMbDataCtrl(), m_pcCurrDPBUnit->getCtrlData() ) );

  //===== update parameters =====
  m_bLayerRepresentationInitialized       = true;
  m_bDependencyRepresentationInitialized  = true;

  return Err::m_nOK;
}

ErrVal
LayerDecoder::xParseSlice( SliceHeader& rcSliceHeader )
{
  ROF( m_pcCurrDPBUnit );
  ControlData&  rcControlData = m_pcCurrDPBUnit->getCtrlData();
  MbDataCtrl*   pcMbDataCtrl  = rcControlData.getMbDataCtrl();
  UInt          uiMbRead      = 0;

  RNOK( m_pcControlMng  ->initSliceForReading ( rcSliceHeader ) );
  RNOK( m_pcSliceReader ->read                ( rcSliceHeader,
                                                pcMbDataCtrl,
                                                m_pacMbStatus,
                                                m_uiFrameWidthInMb,
                                                uiMbRead ) );

  return Err::m_nOK;
}

ErrVal
LayerDecoder::xDecodeSlice( SliceHeader&            rcSliceHeader,
                            const SliceDataNALUnit& rcSliceDataNalUnit,
                            Bool                    bFirstSliceInLayerRepresentation )
{
  ROF( m_pcCurrDPBUnit );
  Bool          bReconstructBaseRep = rcSliceHeader.getStoreRefBasePicFlag() && ! rcSliceHeader.getQualityId();
  Bool          bReconstructAll     = rcSliceDataNalUnit.isDQIdMax();
  Bool          bReconstructMCMbs   = bReconstructAll || ( rcSliceDataNalUnit.isDependencyIdMax() && bReconstructBaseRep );
  PicType       ePicType            = rcSliceHeader.getPicType();
  ControlData&  rcControlData       = m_pcCurrDPBUnit->getCtrlData();
  Frame*        pcFrame             = m_pcCurrDPBUnit->getFrame   ();
  Frame*        pcBaseRepFrame      = m_apcFrameTemp[0];
  Frame*        pcRecFrame          = ( bReconstructBaseRep ? pcBaseRepFrame : pcFrame );
  MbDataCtrl*   pcMbDataCtrl        = rcControlData.getMbDataCtrl ();

  //===== get reference frame lists =====
  RNOK( m_pcDecodedPictureBuffer->setPrdRefLists( m_pcCurrDPBUnit ) );
  RefFrameList& rcRefFrameList0 = rcControlData.getPrdFrameList( LIST_0 );
  RefFrameList& rcRefFrameList1 = rcControlData.getPrdFrameList( LIST_1 );
  MbDataCtrl*   pcMbDataCtrl0L1 = rcControlData.getMbDataCtrl0L1();
  rcSliceHeader.setRefFrameList( &rcRefFrameList0, ePicType, LIST_0 );
  rcSliceHeader.setRefFrameList( &rcRefFrameList1, ePicType, LIST_1 );

  //===== init base layer =====
  RNOK( xInitBaseLayer( rcControlData, bFirstSliceInLayerRepresentation ) );

  //----- decoding -----
  RNOK( m_pcControlMng->initSliceForDecoding( rcSliceHeader ) );

  if( rcSliceHeader.isMbaffFrame() )
  {
    RNOK( m_pcSliceDecoder->decodeMbAff( rcSliceHeader,
                                         pcMbDataCtrl,
                                         rcControlData.getBaseLayerCtrl(),
                                         rcControlData.getBaseLayerCtrlField(),
                                         pcRecFrame,
                                         m_pcResidual,
                                         rcControlData.getBaseLayerRec(),
                                         rcControlData.getBaseLayerSbb(),
                                         &rcRefFrameList0,
                                         &rcRefFrameList1,
                                         pcMbDataCtrl0L1,
                                         bReconstructMCMbs ) ); 
  }
  else
  {
    RNOK( m_pcSliceDecoder->decode     ( rcSliceHeader,
                                         pcMbDataCtrl,
                                         rcControlData.getBaseLayerCtrl(),
                                         pcRecFrame,
                                         m_pcResidual,
                                         rcControlData.getBaseLayerRec(),
                                         rcControlData.getBaseLayerSbb(),
                                         &rcRefFrameList0,
                                         &rcRefFrameList1,
                                         pcMbDataCtrl0L1,
                                         bReconstructMCMbs ) );
  }

  printf("  %s %4d ( LId%2d, TL%2d, QL%2d, %s-%c, BId%2d, AP%2d, QP%3d )\n",
    ePicType == FRAME ?  "Frame" : ePicType == TOP_FIELD ? "TopFd" : "BotFd",
    rcSliceHeader.getPoc                  (),
    rcSliceHeader.getDependencyId         (),
    rcSliceHeader.getTemporalId           (),
    rcSliceHeader.getQualityId            (),
    rcSliceHeader.isH264AVCCompatible     () ? "AVC" : "SVC",
    rcSliceHeader.getSliceType            () == I_SLICE ? 'I' :
    rcSliceHeader.getSliceType            () == P_SLICE ? 'P' : 'B',
    rcSliceHeader.getRefLayerDQId         (),
    rcSliceHeader.getAdaptiveBaseModeFlag () ? 1 : 0,
    rcSliceHeader.getSliceQp              () );
  return Err::m_nOK;
}

ErrVal
LayerDecoder::xFinishLayerRepresentation( SliceHeader&            rcSliceHeader, 
                                          PicBufferList&          rcPicBufferOutputList,
                                          PicBufferList&          rcPicBufferUnusedList,
                                          const SliceDataNALUnit& rcSliceDataNalUnit,
                                          BinDataList&            rcBinDataList )
{
  ROF( m_pcCurrDPBUnit );
  Bool          bReconstructBaseRep = rcSliceHeader.getStoreRefBasePicFlag() && ! rcSliceHeader.getQualityId();
  Bool          bReconstructAll     = rcSliceDataNalUnit.isDQIdMax();
  ControlData&  rcControlData       = m_pcCurrDPBUnit->getCtrlData();
  Frame*        pcBaseRepFrame      = m_apcFrameTemp[0];
  MbDataCtrl*   pcMbDataCtrl        = rcControlData.getMbDataCtrl ();
#ifdef SHARP_AVC_REWRITE_OUTPUT
#else
  Frame*        pcFrame             = m_pcCurrDPBUnit->getFrame   ();
  PicType       ePicType            = rcSliceHeader.getPicType();
#endif

  //===== check for missing slices =====
  RNOK( xCheckForMissingSlices( rcSliceDataNalUnit ) );

  //===== determine loop filter QPs =====
  RNOK( xSetLoopFilterQPs( rcSliceHeader, *pcMbDataCtrl ) );

#ifdef SHARP_AVC_REWRITE_OUTPUT
  //===== rewrite picture =====
  if( rcSliceDataNalUnit.isHighestRewriteLayer() )
  {
    RNOK( xRewritePicture( rcBinDataList, *pcMbDataCtrl ) );
  }
#else
  //===== loop filter =====
  if( bReconstructBaseRep )
  {
    //----- copy non-filtered frame -----
    RNOK( pcFrame->copy( pcBaseRepFrame, ePicType ) );

    //----- loop-filtering and store in DPB as base representation -----
    RNOK( m_pcLoopFilter->process( rcSliceHeader,
                                   pcBaseRepFrame,
                                   m_pcResidual,
                                   pcMbDataCtrl,
                                   0, rcControlData.getSpatialScalability() ) );
  }
  RNOK( m_pcILPrediction->copy( pcFrame, 

⌨️ 快捷键说明

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