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

📄 h264avcdecoder.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        RNOK( pcPPS->read( m_pcHeaderSymbolReadIf, m_pcNalUnitParser->getNalUnitType() ) );
        RNOK( m_pcParameterSetMngAUInit->store ( pcPPS ) );
        bCompletelyParsed = true;
        break;
      }
    case NAL_UNIT_PREFIX:
      {
        pcPrefixHeader = new PrefixHeader( *m_pcNalUnitParser );
        ROF ( pcPrefixHeader );
        RNOK( pcPrefixHeader->read( *m_pcHeaderSymbolReadIf ) );
        bCompletelyParsed = true;
        break;
      }
    case NAL_UNIT_CODED_SLICE:
    case NAL_UNIT_CODED_SLICE_IDR:
      {
        if( rcAccessUnit.getLastPrefixHeader() )
        {
          pcSliceHeader = new SliceHeader( *rcAccessUnit.getLastPrefixHeader() );
          ROF( pcSliceHeader );
          pcSliceHeader->NalUnitHeader::copy( *m_pcNalUnitParser, false );
        }
        else
        {
          pcSliceHeader = new SliceHeader( *m_pcNalUnitParser );
          ROF( pcSliceHeader );
        }
        RNOK ( pcSliceHeader->read( *m_pcParameterSetMngAUInit, *m_pcHeaderSymbolReadIf ) );
        break;
      }
    case NAL_UNIT_CODED_SLICE_SCALABLE:
      {
        pcSliceHeader = new SliceHeader( *m_pcNalUnitParser );
        ROF ( pcSliceHeader );
        RNOK( pcSliceHeader->read( *m_pcParameterSetMngAUInit, *m_pcHeaderSymbolReadIf ) );
        break;
      }
    default:
      {
        // no parsing required
        break;
      }
    }
    RNOK( m_pcNalUnitParser->closeNalUnit( bCompletelyParsed ) );
    DTRACE_ON;
  }

  //===== update access unit list =====
  switch( m_pcNalUnitParser->getNalUnitType() )
  {
  case NAL_UNIT_PREFIX:
    {
      RNOK( rcAccessUnit.update( pcBinDataCopy, *pcPrefixHeader ) );
      break;
    }
  case NAL_UNIT_CODED_SLICE:
  case NAL_UNIT_CODED_SLICE_IDR:
  case NAL_UNIT_CODED_SLICE_SCALABLE:
    {
      RNOK( rcAccessUnit.update( pcBinDataCopy, *pcSliceHeader ) );
      break;
    }
  case NAL_UNIT_CODED_SLICE_DATAPART_A:
  case NAL_UNIT_CODED_SLICE_DATAPART_B:
  case NAL_UNIT_CODED_SLICE_DATAPART_C:
    {
      RERR(); // not supported
      break;
    }
  default:
    {
      RNOK( rcAccessUnit.update( pcBinDataCopy ) );
      break;
    }
  }
  return Err::m_nOK;
}


ErrVal
H264AVCDecoder::processNALUnit( PicBuffer*        pcPicBuffer,
                                PicBufferList&    rcPicBufferOutputList,
                                PicBufferList&    rcPicBufferUnusedList,
                                BinDataList&      rcBinDataList,
                                NALUnit&          rcNALUnit )
{
  if( ! rcNALUnit.isVCLNALUnit() )
  {
    NonVCLNALUnit& rcNonVCLNALUnit = *(NonVCLNALUnit*)rcNALUnit.getInstance();
    RNOK( xProcessNonVCLNALUnit( rcNonVCLNALUnit ) );
    rcPicBufferUnusedList.push_back( pcPicBuffer );
    return Err::m_nOK;
  }

  PicBufferList     cDummyList;
  SliceDataNALUnit& rcSliceDataNALUnit  = *(SliceDataNALUnit*)rcNALUnit.getInstance();
  PicBufferList&    rcOutputList        = ( rcSliceDataNALUnit.isDependencyIdMax() ? rcPicBufferOutputList : cDummyList );
  RNOK  ( m_apcLayerDecoder[ rcSliceDataNALUnit.getDependencyId() ]->processSliceData( pcPicBuffer, rcOutputList, rcPicBufferUnusedList, rcBinDataList, rcSliceDataNALUnit ) );
  ROFRS ( rcSliceDataNALUnit.isLastAccessUnitInStream() && rcSliceDataNALUnit.isLastSliceInAccessUnit(), Err::m_nOK );

  for( UInt uiDependencyId = 0; uiDependencyId < rcSliceDataNALUnit.getDependencyId(); uiDependencyId++ )
  {
    RNOK( m_apcLayerDecoder[ uiDependencyId                       ]->finishProcess( cDummyList,            rcPicBufferUnusedList ) );
  }
  RNOK(   m_apcLayerDecoder[ rcSliceDataNALUnit.getDependencyId() ]->finishProcess( rcPicBufferOutputList, rcPicBufferUnusedList ) );

  return Err::m_nOK;
}


ErrVal
H264AVCDecoder::xProcessNonVCLNALUnit( NonVCLNALUnit& rcNonVCLNALUnit )
{
  //===== parse prefix header when available =====
  PrefixHeader* pcPrefixHeader = 0;
  if( rcNonVCLNALUnit.getBinDataPrefix() )
  {
    BinDataAccessor cBinDataAccessorPrefix;
    rcNonVCLNALUnit.getBinDataPrefix()->setMemAccessor( cBinDataAccessorPrefix );
    RNOK( m_pcNalUnitParser ->initNalUnit   ( cBinDataAccessorPrefix )  );
    ROF ( m_pcNalUnitParser ->getNalUnitType() == NAL_UNIT_PREFIX );
    pcPrefixHeader = new PrefixHeader( *m_pcNalUnitParser );
    ROF ( pcPrefixHeader );
    RNOK( pcPrefixHeader    ->read          ( *m_pcHeaderSymbolReadIf ) );
    RNOK( m_pcNalUnitParser ->closeNalUnit  () );
  }

  //===== parse NAL unit =====
  BinDataAccessor cBinDataAccessor;
  rcNonVCLNALUnit.getBinData()->setMemAccessor( cBinDataAccessor );
  RNOK  ( m_pcNalUnitParser   ->initNalUnit   ( cBinDataAccessor )  );
  switch( m_pcNalUnitParser   ->getNalUnitType() )
  {
  case NAL_UNIT_SPS:
    {
      SequenceParameterSet* pcSPS = NULL;
      RNOK( SequenceParameterSet::create( pcSPS ) );
      RNOK( pcSPS->read( m_pcHeaderSymbolReadIf, m_pcNalUnitParser->getNalUnitType() ) );
      RNOK( m_pcParameterSetMngDecode->store( pcSPS ) );
      printf("  NON-VCL: SEQUENCE PARAMETER SET (ID=%d)\n", pcSPS->getSeqParameterSetId() );
      break;
    }
  case NAL_UNIT_SUBSET_SPS:
    {
      SequenceParameterSet* pcSPS = NULL;
      RNOK( SequenceParameterSet::create( pcSPS ) );
      RNOK( pcSPS->read( m_pcHeaderSymbolReadIf, m_pcNalUnitParser->getNalUnitType() ) );
      RNOK( m_pcParameterSetMngDecode->store( pcSPS ) );
      printf("  NON-VCL: SUBSET SEQUENCE PARAMETER SET (ID=%d)\n", pcSPS->getSeqParameterSetId() );
      break;
    }
  case NAL_UNIT_PPS:
    {
      PictureParameterSet* pcPPS = NULL;
      RNOK( PictureParameterSet::create( pcPPS ) );
      RNOK( pcPPS->read( m_pcHeaderSymbolReadIf, m_pcNalUnitParser->getNalUnitType() ) );
      RNOK( m_pcParameterSetMngDecode->store ( pcPPS ) );
      printf("  NON-VCL: PICTURE PARAMETER SET (ID=%d)\n", pcPPS->getPicParameterSetId() );
      break;
    }
  case NAL_UNIT_SEI: // just read, but ignore
    {
      SEI::MessageList cSEIMessageList;
      RNOK( SEI::read( m_pcHeaderSymbolReadIf, cSEIMessageList, m_pcParameterSetMngDecode ) );
      printf("  NON-VCL: SEI NAL UNIT\n" );
      break;
    }
  case NAL_UNIT_ACCESS_UNIT_DELIMITER: // just read, but ignore
    {
      AUDelimiter cAUDelimiter( *m_pcNalUnitParser );
      RNOK( cAUDelimiter.read ( *m_pcHeaderSymbolReadIf ) );
      printf("  NON-VCL: ACCESS UNIT DELIMITER\n" );
      break;
    }
  case NAL_UNIT_END_OF_SEQUENCE: // just read, but ignore
    {
      EndOfSequence cEndOfSequence( *m_pcNalUnitParser );
      RNOK( cEndOfSequence.read   ( *m_pcHeaderSymbolReadIf ) );
      printf("  NON-VCL: END OF SEQUENCE\n" );
      break;
    }
  case NAL_UNIT_END_OF_STREAM: // just read, but ignore
    {
      EndOfStream cEndOfStream( *m_pcNalUnitParser );
      RNOK( cEndOfStream.read ( *m_pcHeaderSymbolReadIf ) );
      printf("  NON-VCL: END OF STREAM\n" );
      break;
    }
  case NAL_UNIT_FILLER_DATA: // just read, but ignore
    {
      const NalUnitHeader&  rcNalUnitHeader = ( pcPrefixHeader ? *pcPrefixHeader : *m_pcNalUnitParser );
      FillerData            cFillerData( rcNalUnitHeader );
      RNOK( cFillerData.read( *m_pcHeaderSymbolReadIf ) );
      cFillerData.NalUnitHeader::copy( *m_pcNalUnitParser, false );
      printf("  NON-VCL: FILLER DATA (D=%d,Q=%d)\n", cFillerData.getDependencyId(), cFillerData.getQualityId() );
      break;
    }
  default:
    {
      // ignore
      break;
    }
  }
  RNOK( m_pcNalUnitParser->closeNalUnit() );
  return Err::m_nOK;
}

ErrVal
H264AVCDecoder::getBaseLayerData( SliceHeader&      rcELSH,
                                  Frame*&           pcFrame,
                                  Frame*&           pcResidual,
                                  MbDataCtrl*&      pcMbDataCtrl,
                                  ResizeParameters& rcResizeParameters,
                                  UInt              uiBaseLayerId )
{
  RNOK( m_apcLayerDecoder[uiBaseLayerId]->getBaseLayerData( rcELSH, pcFrame, pcResidual, pcMbDataCtrl, rcResizeParameters ) );
  return Err::m_nOK;
}

ErrVal
H264AVCDecoder::getBaseSliceHeader( SliceHeader*& rpcSliceHeader, UInt uiRefLayerDependencyId )
{
  RNOK( m_apcLayerDecoder[ uiRefLayerDependencyId ]->getBaseSliceHeader( rpcSliceHeader ) );
  return Err::m_nOK;
}


H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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