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

📄 sequenceparameterset.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 3 页
字号:
  m_eProfileIdc  = Profile ( uiTmp );
  ROT   ( m_eProfileIdc != BASELINE_PROFILE           &&
          m_eProfileIdc != MAIN_PROFILE               &&
          m_eProfileIdc != EXTENDED_PROFILE           &&
          m_eProfileIdc != HIGH_PROFILE               &&
          m_eProfileIdc != SCALABLE_BASELINE_PROFILE  &&
          m_eProfileIdc != SCALABLE_HIGH_PROFILE        );
  RNOK  ( pcReadIf->getFlag( m_bConstrainedSet0Flag,                      "SPS: constraint_set0_flag" ) );  //VB-JV 04/08
  RNOK  ( pcReadIf->getFlag( m_bConstrainedSet1Flag,                      "SPS: constraint_set1_flag" ) );  //VB-JV 04/08
  RNOK  ( pcReadIf->getFlag( m_bConstrainedSet2Flag,                      "SPS: constraint_set2_flag" ) );  //VB-JV 04/08
  RNOK  ( pcReadIf->getFlag( m_bConstrainedSet3Flag,                      "SPS: constraint_set3_flag" ) );  //VB-JV 04/08
  RNOK  ( pcReadIf->getCode( uiTmp,                               4,      "SPS: reserved_zero_4bits" ) );
  ROT   ( uiTmp );
  RNOK  ( pcReadIf->getCode( m_uiLevelIdc,                        8,      "SPS: level_idc" ) );
  RNOK  ( pcReadIf->getUvlc( m_uiSeqParameterSetId,                       "SPS: seq_parameter_set_id" ) );

   //--- fidelity range extension syntax ---
  RNOK  ( xReadFrext( pcReadIf ) );

  RNOK  ( pcReadIf->getUvlc( uiTmp,                                       "SPS: log2_max_frame_num_minus_4" ) );
  ROT   ( uiTmp > 12 );
  setLog2MaxFrameNum( uiTmp + 4 );
  RNOK  ( xReadPicOrderCntInfo( pcReadIf ) );
  RNOK( pcReadIf->getUvlc( m_uiNumRefFrames,                              "SPS: num_ref_frames" ) );
  RNOK( pcReadIf->getFlag( m_bGapsInFrameNumValueAllowedFlag,             "SPS: gaps_in_frame_num_value_allowed_flag" ) );

  RNOK( pcReadIf->getUvlc( uiTmp,                                         "SPS: pic_width_in_mbs_minus1" ) );
  setFrameWidthInMbs ( 1 + uiTmp );
  RNOK( pcReadIf->getUvlc( uiTmp,                                         "SPS: pic_height_in_map_units_minus1" ) );
  RNOK( pcReadIf->getFlag( m_bFrameMbsOnlyFlag,                           "SPS: frame_mbs_only_flag" ) );
  if( getFrameMbsOnlyFlag() )
  {
    setFrameHeightInMbs( uiTmp+1 );
    setMbAdaptiveFrameFieldFlag( false );
  }
  else
  {
    setFrameHeightInMbs( (uiTmp+1)<<1 );
    RNOK( pcReadIf->getFlag( m_bMbAdaptiveFrameFieldFlag,                 "SPS: mb_adaptive_frame_field_flag"));
  }
  RNOK( pcReadIf->getFlag( m_bDirect8x8InferenceFlag,                     "SPS: direct_8x8_inference_flag" ) );

  Bool  bFrameCroppingFlag;
  RNOK( pcReadIf->getFlag( bFrameCroppingFlag,                            "SPS: frame_cropping_flag"      ) );
  if( bFrameCroppingFlag )
  {
    RNOK( pcReadIf->getUvlc( m_uiFrameCropLeftOffset,                     "SPS: frame_crop_left_offset"   ) );
    RNOK( pcReadIf->getUvlc( m_uiFrameCropRightOffset,                    "SPS: frame_crop_right_offset"  ) );
    RNOK( pcReadIf->getUvlc( m_uiFrameCropTopOffset,                      "SPS: frame_crop_top_offset"    ) );
    RNOK( pcReadIf->getUvlc( m_uiFrameCropBottomOffset,                   "SPS: frame_crop_bottom_offset" ) );
  }
  else
  {
    m_uiFrameCropLeftOffset   = 0;
    m_uiFrameCropRightOffset  = 0;
    m_uiFrameCropTopOffset    = 0;
    m_uiFrameCropBottomOffset = 0;
  }
  
  RNOK( pcReadIf->getFlag( bTmp,                                          "SPS: vui_parameters_present_flag" ) );
  m_pcVUI = new VUI(this);
  m_pcVUI->setVuiParametersPresentFlag( bTmp );
  if( bTmp )
  {
    RNOK( m_pcVUI->read( pcReadIf ) );
  }

  ROFRS( m_eNalUnitType == NAL_UNIT_SUBSET_SPS, Err::m_nOK );


  //===== start of subset parameter extension =====
  if( m_eProfileIdc == SCALABLE_BASELINE_PROFILE || m_eProfileIdc == SCALABLE_HIGH_PROFILE )
  {
    RNOK( pcReadIf->getFlag( m_bInterlayerDeblockingPresent,              "SPS: inter_layer_deblocking_filter_control_present_flag" ) ); //VB-JV 04/08

    RNOK( pcReadIf->getCode( m_uiExtendedSpatialScalability, 2,           "SPS: extended_spatial_scalability" ) );
    if (getChromaFormatIdc() == 1 || getChromaFormatIdc() == 2 )
    {
      RNOK( pcReadIf->getCode( m_uiChromaPhaseXPlus1, 1,                  "SPS: chroma_phase_x_plus1_flag" ) );  //VB-JV 04/08
      m_uiBaseChromaPhaseXPlus1 = m_uiChromaPhaseXPlus1;
    }
    if (getChromaFormatIdc() == 1 )  
    {
      RNOK( pcReadIf->getCode( m_uiChromaPhaseYPlus1, 2,                  "SPS: chroma_phase_y_plus1" ) );
      m_uiBaseChromaPhaseYPlus1 = m_uiChromaPhaseYPlus1;
    }
    if( m_uiExtendedSpatialScalability == ESS_SEQ )
    {
      if( getChromaFormatIdc() > 0 )
      {
        RNOK( pcReadIf->getCode( m_uiBaseChromaPhaseXPlus1, 1,            "SPS: seq_ref_layer_chroma_phase_x_plus1_flag" ) ); //VB-JV 04/08
        RNOK( pcReadIf->getCode( m_uiBaseChromaPhaseYPlus1, 2,            "SPS: seq_ref_layer_chroma_phase_y_plus1" ) );      //VB-JV 04/08
      }
      RNOK( pcReadIf->getSvlc( m_iScaledBaseLeftOffset,                   "SPS: seq_scaled_ref_layer_left_offset" ) );        //VB-JV 04/08
      RNOK( pcReadIf->getSvlc( m_iScaledBaseTopOffset,                    "SPS: seq_scaled_ref_layer_top_offset" ) );		  //VB-JV 04/08
      RNOK( pcReadIf->getSvlc( m_iScaledBaseRightOffset,                  "SPS: seq_scaled_ref_layer_right_offset" ) );		  //VB-JV 04/08
      RNOK( pcReadIf->getSvlc( m_iScaledBaseBottomOffset,                 "SPS: seq_scaled_ref_layer_bottom_offset" ) );	  //VB-JV 04/08
    }
    else
    {
      m_uiBaseChromaPhaseXPlus1 = m_uiChromaPhaseXPlus1;
      m_uiBaseChromaPhaseYPlus1 = m_uiChromaPhaseYPlus1;
      m_iScaledBaseLeftOffset   = 0;
      m_iScaledBaseTopOffset    = 0;
      m_iScaledBaseRightOffset  = 0;
      m_iScaledBaseBottomOffset = 0;
    }
    RNOK( pcReadIf->getFlag( m_bAVCRewriteFlag,                           "SPS: seq_tcoeff_level_prediction_flag" ) );
    if( m_bAVCRewriteFlag )
    {
      RNOK( pcReadIf->getFlag( m_bAVCAdaptiveRewriteFlag,                 "SPS: adaptive_tcoeff_level_prediction_flag" ) );
    }
    RNOK( pcReadIf->getFlag( m_bAVCHeaderRewriteFlag,                     "SPS: slice_header_restriction_flag" ) );

    //===== svc VUI extension =====
    RNOK ( pcReadIf->getFlag( m_bSVCVUIParametersPresentFlag,             "SPS: svc_vui_parameters_present_flag" ) );
    if( m_bSVCVUIParametersPresentFlag )
    {
      RNOK( m_pcVUI->readSVCExtension( pcReadIf ) );
    }
  }

  RNOK( pcReadIf->getFlag ( m_bAdditionalExtension2Flag,                  "SPS: additional_extension2_flag" ) );
  ROT( m_bAdditionalExtension2Flag ); // not supported

  return Err::m_nOK;
}



ErrVal
SequenceParameterSet::xWriteFrext( HeaderSymbolWriteIf* pcWriteIf ) const
{
  ROTRS( m_eProfileIdc != HIGH_PROFILE              &&
         m_eProfileIdc != HIGH_10_PROFILE           &&
         m_eProfileIdc != HIGH_422_PROFILE          &&
         m_eProfileIdc != HIGH_444_PROFILE          &&
         m_eProfileIdc != CAVLC_444_PROFILE         &&
         m_eProfileIdc != SCALABLE_BASELINE_PROFILE &&
         m_eProfileIdc != SCALABLE_HIGH_PROFILE,      Err::m_nOK );

  RNOK  ( pcWriteIf->writeUvlc( m_uiChromaFormatIdc,            "SPS: chroma_format_idc" ) );
  RNOK  ( pcWriteIf->writeUvlc( 0,                              "SPS: bit_depth_luma_minus8" ) );
  RNOK  ( pcWriteIf->writeUvlc( 0,                              "SPS: bit_depth_chroma_minus8" ) );
  RNOK  ( pcWriteIf->writeFlag( false,                          "SPS: qpprime_y_zero_transform_bypass_flag" ) );
  RNOK  ( pcWriteIf->writeFlag( m_bSeqScalingMatrixPresentFlag, "SPS: seq_scaling_matrix_present_flag"  ) );
  ROFRS ( m_bSeqScalingMatrixPresentFlag, Err::m_nOK );
  RNOK  ( m_cSeqScalingMatrix.write( pcWriteIf, true ) );

  return Err::m_nOK;
}


ErrVal
SequenceParameterSet::xReadFrext( HeaderSymbolReadIf* pcReadIf )
{
  ROTRS( m_eProfileIdc != HIGH_PROFILE              &&
         m_eProfileIdc != HIGH_10_PROFILE           &&
         m_eProfileIdc != HIGH_422_PROFILE          &&
         m_eProfileIdc != HIGH_444_PROFILE          &&
         m_eProfileIdc != CAVLC_444_PROFILE         &&
         m_eProfileIdc != SCALABLE_BASELINE_PROFILE &&
         m_eProfileIdc != SCALABLE_HIGH_PROFILE,      Err::m_nOK );

  UInt  uiTmp;
  Bool  bTmp;
  RNOK( pcReadIf->getUvlc( uiTmp,                               "SPS: chroma_format_idc" ) );
  ROF ( uiTmp == 1 );
  RNOK( pcReadIf->getUvlc( uiTmp,                               "SPS: bit_depth_luma_minus8" ) );
  ROF ( uiTmp == 0 );
  RNOK( pcReadIf->getUvlc( uiTmp,                               "SPS: bit_depth_chroma_minus8" ) );
  ROF ( uiTmp == 0 );
  RNOK( pcReadIf->getFlag( bTmp,                                "SPS: qpprime_y_zero_transform_bypass_flag" ) );
  ROT ( bTmp )
  RNOK( pcReadIf->getFlag( m_bSeqScalingMatrixPresentFlag,      "SPS: seq_scaling_matrix_present_flag") );
  
  ROFRS ( m_bSeqScalingMatrixPresentFlag, Err::m_nOK );
  RNOK  ( m_cSeqScalingMatrix.read( pcReadIf, true ) );

  return Err::m_nOK;
}


Void SequenceParameterSet::setResizeParameters( const ResizeParameters& rcResizeParameters )
{
  Int iVer = ( m_bFrameMbsOnlyFlag ? 2 : 4 ); // m_bFrameMbsOnlyFlag must be set !!!!!

  m_uiExtendedSpatialScalability  = (UInt)rcResizeParameters.m_iExtendedSpatialScalability;
  m_uiChromaPhaseXPlus1           = (UInt)( rcResizeParameters.m_iChromaPhaseX + 1 );
  m_uiChromaPhaseYPlus1           = (UInt)( rcResizeParameters.m_iChromaPhaseY + 1 );

  if( m_uiExtendedSpatialScalability == ESS_SEQ )
  {
    m_uiBaseChromaPhaseXPlus1 = (UInt)(rcResizeParameters.m_iRefLayerChromaPhaseX+1);
    m_uiBaseChromaPhaseYPlus1 = (UInt)(rcResizeParameters.m_iRefLayerChromaPhaseY+1);
    m_iScaledBaseLeftOffset   = rcResizeParameters.m_iLeftFrmOffset / 2;
    m_iScaledBaseTopOffset    = rcResizeParameters.m_iTopFrmOffset  / iVer;
    m_iScaledBaseRightOffset  = ( rcResizeParameters.m_iFrameWidth  - rcResizeParameters.m_iLeftFrmOffset - rcResizeParameters.m_iScaledRefFrmWidth  ) / 2;
    m_iScaledBaseBottomOffset = ( rcResizeParameters.m_iFrameHeight - rcResizeParameters.m_iTopFrmOffset  - rcResizeParameters.m_iScaledRefFrmHeight ) / iVer;
  }
  else
  {
    m_uiBaseChromaPhaseXPlus1 = m_uiChromaPhaseXPlus1;
    m_uiBaseChromaPhaseYPlus1 = m_uiChromaPhaseYPlus1;
    m_iScaledBaseBottomOffset = 0;
    m_iScaledBaseLeftOffset   = 0;
    m_iScaledBaseRightOffset  = 0;
    m_iScaledBaseTopOffset    = 0;
  }
}


ErrVal SequenceParameterSet::xReadPicOrderCntInfo( HeaderSymbolReadIf* pcReadIf )
{
  RNOK( pcReadIf->getUvlc( m_uiPicOrderCntType,                  "SPS: pic_order_cnt_type" ) );
  ROT( m_uiPicOrderCntType>2 );

  ROTRS( 2 == m_uiPicOrderCntType, Err::m_nOK );

  if( 0 == m_uiPicOrderCntType )
  {
    UInt uiTmp;
    RNOK( pcReadIf->getUvlc( uiTmp,                              "SPS: log2_max_pic_order_cnt_lsb_minus4" ));
    setLog2MaxPicOrderCntLsb( 4+uiTmp );
  }
  else if( 1 == m_uiPicOrderCntType )
  {
    RNOK( pcReadIf->getFlag( m_bDeltaPicOrderAlwaysZeroFlag,     "SPS: delta_pic_order_always_zero_flag" ));
    RNOK( pcReadIf->getSvlc( m_iOffsetForNonRefPic,              "SPS: offset_for_non_ref_pic" ));
    RNOK( pcReadIf->getSvlc( m_iOffsetForTopToBottomField,       "SPS: offset_for_top_to_bottom_field" ));
    RNOK( pcReadIf->getUvlc( m_uiNumRefFramesInPicOrderCntCycle, "SPS: num_ref_frames_in_pic_order_cnt_cycle" ));
    RNOK( initOffsetForRefFrame( m_uiNumRefFramesInPicOrderCntCycle ) );

    for( UInt i = 0; i < m_uiNumRefFramesInPicOrderCntCycle; i++)
    {
      Int  iTmp;
      RNOK( pcReadIf->getSvlc( iTmp,                             "SPS: offset_for_ref_frame" ) );
      setOffsetForRefFrame( i, iTmp );
    }
  }

  return Err::m_nOK;
}

H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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