sequenceparameterset.cpp

来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 800 行 · 第 1/3 页

CPP
800
字号
        return n;
      }
    }
  }
  return MSYS_UINT_MAX;
}


ErrVal
SequenceParameterSet::write( HeaderSymbolWriteIf* pcWriteIf ) const
{
  //===== NAL unit header =====
  ETRACE_DECLARE( Bool m_bTraceEnable = true );
	g_nLayer = m_uiLayerId;
  ETRACE_LAYER(m_uiLayerId);
  ETRACE_VIEWID(m_uiCurrentViewId);
  ETRACE_HEADER( "SEQUENCE PARAMETER SET" );
  RNOK  ( pcWriteIf->writeFlag( 0,                                        "NALU HEADER: forbidden_zero_bit" ) );
  RNOK  ( pcWriteIf->writeCode( 3, 2,                                     "NALU HEADER: nal_ref_idc" ) );
  RNOK  ( pcWriteIf->writeCode( m_eNalUnitType, 5,                        "NALU HEADER: nal_unit_type" ) );

  //===== Sequence parameter set =====
  RNOK  ( pcWriteIf->writeCode( getProfileIdc(),                  8,      "SPS: profile_idc" ) );
  RNOK  ( pcWriteIf->writeFlag( m_bConstrainedSet0Flag,                   "SPS: constrained_set0_flag" ) );
  RNOK  ( pcWriteIf->writeFlag( m_bConstrainedSet1Flag,                   "SPS: constrained_set1_flag" ) );
  RNOK  ( pcWriteIf->writeFlag( m_bConstrainedSet2Flag,                   "SPS: constrained_set2_flag" ) );
  RNOK  ( pcWriteIf->writeFlag( m_bConstrainedSet3Flag,                   "SPS: constrained_set3_flag" ) );
  RNOK  ( pcWriteIf->writeCode( 0,                                4,      "SPS: reserved_zero_4bits" ) );
  RNOK  ( pcWriteIf->writeCode( getLevelIdc(),                    8,      "SPS: level_idc" ) );
  RNOK  ( pcWriteIf->writeUvlc( getSeqParameterSetId(),                   "SPS: seq_parameter_set_id" ) );
  
  if( m_eProfileIdc == SCALABLE_PROFILE ) // bug-fix (HS)
  {
    /*RNOK( pcWriteIf->writeFlag( m_bNalUnitExtFlag,                        "SPS: nal_unit_extension_flag" ) );
    if ( m_bNalUnitExtFlag == 0 )
    {
        RNOK ( pcWriteIf->writeUvlc( m_uiNumSimplePriIdVals - 1,          "SPS: number_of_simple_priority_id_values_minus1" ) );
        for ( UInt uiPriCount = 0; uiPriCount < m_uiNumSimplePriIdVals; uiPriCount++ )
        {
            RNOK ( pcWriteIf->writeCode( uiPriCount,              PRI_ID_BITS, "SPS: priority_id" ) );
            RNOK ( pcWriteIf->writeCode( m_uiTemporalLevelList[uiPriCount], 3, "SPS: temporal_level_list[priority_id]" ) );
            RNOK ( pcWriteIf->writeCode( m_uiDependencyIdList [uiPriCount], 3, "SPS: dependency_id_list[priority_id]" ) );
            RNOK ( pcWriteIf->writeCode( m_uiQualityLevelList [uiPriCount], 2, "SPS: quality_level_list[priority_id]" ) );
        }
    }
 JVT-S036  */

    RNOK( pcWriteIf->writeCode( getExtendedSpatialScalability(), 2,       "SPS: ExtendedSpatialScalability" ) );
//    if ( 1 /* chroma_format_idc */ > 0 )
    {
      RNOK( pcWriteIf->writeCode( m_uiChromaPhaseXPlus1, 2,             "SPS: ChromaPhaseXPlus1" ) );
      RNOK( pcWriteIf->writeCode( m_uiChromaPhaseYPlus1, 2,             "SPS: ChromaPhaseYPlus1" ) );
    }
    if (getExtendedSpatialScalability() == ESS_SEQ)
    {
      RNOK( pcWriteIf->writeSvlc( m_iScaledBaseLeftOffset,              "SPS: ScaledBaseLeftOffset" ) );
      RNOK( pcWriteIf->writeSvlc( m_iScaledBaseTopOffset,               "SPS: ScaledBaseTopOffset" ) );
      RNOK( pcWriteIf->writeSvlc( m_iScaledBaseRightOffset,             "SPS: ScaledBaseRightOffset" ) );
      RNOK( pcWriteIf->writeSvlc( m_iScaledBaseBottomOffset,            "SPS: ScaledBaseBottomOffset" ) );
    }

    RNOK  ( pcWriteIf->writeFlag( m_bFGSCodingMode,                       "SPS: FGSCodingMode") );
    if(m_bFGSCodingMode == false)
    {
      RNOK  ( pcWriteIf->writeUvlc(m_uiGroupingSize-1,                    "SPS: GroupingSizeMinus1") );
    }
    else
    {
      UInt uiNumPosVector = 0;
      UInt uiIndex = 0;
      while(uiNumPosVector != 15)
      {
        if(uiIndex == 0)
        {
          RNOK( pcWriteIf->writeUvlc(m_uiPosVect[uiIndex],               "SPS: PosVect[0]") );
        }
        else
        {
          RNOK( pcWriteIf->writeUvlc(m_uiPosVect[uiIndex]-m_uiPosVect[uiIndex-1]-1, "SPS: PosVect") );
        }
        uiNumPosVector = m_uiPosVect[uiIndex];
        uiIndex++;
      }
    }
  }

  if( m_eProfileIdc == MULTI_VIEW_PROFILE ) 
  {

    // seq_parameter_set_mvc_extension()

    RNOK  ( pcWriteIf->writeUvlc( SpsMVC->m_num_views_minus_1,                   "SPS: num_views_minus_1" ) ); // ue(v)
#if JMVM_ONLY // JVT-Y042
	RNOK  ( pcWriteIf->writeFlag(SpsMVC->non_anchor_single_loop_decoding_flag,  "SPS: non_anchor_single_loop_decoding_flag" ) ); // u(1)                             
#endif
	
	int i,j, vcOrder;
    //JVT-V054
    printf("ViewCodingOrder: ");
    for (i=0;i<= SpsMVC->m_num_views_minus_1; i++)
    {
      printf("%d ", SpsMVC->m_uiViewCodingOrder[i]);
      RNOK  ( pcWriteIf->writeUvlc( SpsMVC->m_uiViewCodingOrder[i], "SPS: view_id[i]")); //ue(v)
    }	  
    printf ("\n");

    for (i=1;i<= SpsMVC->m_num_views_minus_1; i++)  //JVT-Y061
    {
      vcOrder = SpsMVC->m_uiViewCodingOrder[i];

      RNOK  ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_anchor_refs_list0[vcOrder],                   "SPS: num_anchor_refs_l0[i]" ) ); // ue(v)
      for (j=0; j<SpsMVC->m_num_anchor_refs_list0[vcOrder]; j++)
        RNOK  ( pcWriteIf->writeUvlc( SpsMVC->m_anchor_ref_list0[vcOrder][j],      "SPS: anchor_ref_l0[i][j]" ) ); // ue(v)
			
      RNOK  ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_anchor_refs_list1[vcOrder],                   "SPS: num_anchor_refs_l1[i]" ) ); // ue(v)
      for (j=0; j<SpsMVC->m_num_anchor_refs_list1[vcOrder]; j++)
        RNOK  ( pcWriteIf->writeUvlc( SpsMVC->m_anchor_ref_list1[vcOrder][j],      "SPS: anchor_ref_l1[i][j]" ) ); // ue(v)
    }

    for (i=1;i<= SpsMVC->m_num_views_minus_1; i++)  //JVT-Y061
    {
      vcOrder = SpsMVC->m_uiViewCodingOrder[i];
#if JMVM_ONLY // JVT-Y042
	  if ( SpsMVC->getSingleLoopDecoding() )
	  {
		  RNOK  ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_sld_list0[vcOrder],               "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
		  for (j=0; j<SpsMVC->m_num_non_anchor_refs_sld_list0[vcOrder]; j++)
			  RNOK  ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list0[vcOrder][j],      "SPS: non_anchor_ref_l0[i][j]" ) ); // ue(v)
	  }
	  else
	  {
		  RNOK  ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_list0[vcOrder],                   "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
		  for (j=0; j<SpsMVC->m_num_non_anchor_refs_list0[vcOrder]; j++)
			  RNOK  ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list0[vcOrder][j],      "SPS: non_anchor_ref_l0[i][j]" ) ); // ue(v)
	  }
#else
      RNOK  ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_list0[vcOrder],                   "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
      for (j=0; j<SpsMVC->m_num_non_anchor_refs_list0[vcOrder]; j++)
		  RNOK  ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list0[vcOrder][j],      "SPS: non_anchor_ref_l0[i][j]" ) ); // ue(v)
#endif

#if JMVM_ONLY // JVT-Y042
	  if ( SpsMVC->getSingleLoopDecoding() )
	  {
		  RNOK  ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_sld_list1[vcOrder],               "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
		  for (j=0; j<SpsMVC->m_num_non_anchor_refs_sld_list1[vcOrder]; j++)
			  RNOK  ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j],      "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
	  }
	  else
	  {
		  RNOK  ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_list1[vcOrder],                   "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
		  for (j=0; j<SpsMVC->m_num_non_anchor_refs_list1[vcOrder]; j++)
			  RNOK  ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j],      "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
	  }
#else
      RNOK  ( pcWriteIf->writeUvlc( (UInt)SpsMVC->m_num_non_anchor_refs_list1[vcOrder],                   "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
      for (j=0; j<SpsMVC->m_num_non_anchor_refs_list1[vcOrder]; j++)
		  RNOK  ( pcWriteIf->writeUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j],      "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
#endif
    }	
  }


  //--- fidelity range extension syntax ---
  RNOK  ( xWriteFrext( pcWriteIf ) );
  
  UInt    uiTmp = getLog2MaxFrameNum();
  ROF   ( uiTmp >= 4 );
  RNOK  ( pcWriteIf->writeUvlc( uiTmp - 4,                                "SPS: log2_max_frame_num_minus_4" ) );
  RNOK  ( pcWriteIf->writeUvlc( getPicOrderCntType(),                     "SPS: pic_order_cnt_type" ) );
  if( getPicOrderCntType() == 0 )
  {
  RNOK  ( pcWriteIf->writeUvlc( getLog2MaxPicOrderCntLsb() - 4,           "SPS: log2_max_pic_order_cnt_lsb_minus4" ) );
  }
  else if( getPicOrderCntType() == 1 )
  {
    RNOK( pcWriteIf->writeFlag( getDeltaPicOrderAlwaysZeroFlag(),         "SPS: delta_pic_order_always_zero_flag" ) );
    RNOK( pcWriteIf->writeSvlc( getOffsetForNonRefPic(),                  "SPS: offset_for_non_ref_pic" ) );
    RNOK( pcWriteIf->writeSvlc( getOffsetForTopToBottomField(),           "SPS: offset_for_top_to_bottom_field" ) );
    RNOK( pcWriteIf->writeUvlc( getNumRefFramesInPicOrderCntCycle(),      "SPS: num_ref_frames_in_pic_order_cnt_cycle" ) );
    for( UInt uiIndex = 0; uiIndex < getNumRefFramesInPicOrderCntCycle(); uiIndex++ )
    {
      RNOK( pcWriteIf->writeSvlc( getOffsetForRefFrame( uiIndex ),        "SPS: offset_for_ref_frame" ) );
    }
  }
  RNOK  ( pcWriteIf->writeUvlc( getNumRefFrames(),                        "SPS: num_ref_frames" ) );
  RNOK  ( pcWriteIf->writeFlag( getRequiredFrameNumUpdateBehaviourFlag(), "SPS: required_frame_num_update_behaviour_flag" ) );
  RNOK  ( pcWriteIf->writeUvlc( getFrameWidthInMbs  () - 1,               "SPS: pic_width_in_mbs_minus_1" ) );
  RNOK  ( pcWriteIf->writeUvlc( getFrameHeightInMbs () - 1,               "SPS: pic_height_in_map_units_minus_1" ) );
  RNOK  ( pcWriteIf->writeFlag( true,                                     "SPS: frame_mbs_only_flag" ) );
  RNOK  ( pcWriteIf->writeFlag( getDirect8x8InferenceFlag(),              "SPS: direct_8x8_inference_flag" ) );
  RNOK  ( pcWriteIf->writeFlag( false,                                    "SPS: frame_cropping_flag" ) );

  RNOK  ( pcWriteIf->writeFlag( false,                                  "SPS: vui_parameters_present_flag" ) );

  return Err::m_nOK;
}


ErrVal
SequenceParameterSet::read( HeaderSymbolReadIf* pcReadIf,
                            NalUnitType         eNalUnitType )
{
  m_uiExtendedSpatialScalability = ESS_NONE;

  //===== NAL unit header =====
  setNalUnitType    ( eNalUnitType );

  Bool  bTmp;
  UInt  uiTmp;

  //===== Sequence parameter set =====
  RNOK  ( pcReadIf->getCode( uiTmp,                               8,      "SPS: profile_idc" ) );
  m_eProfileIdc  = Profile ( uiTmp );
  ROT   ( m_eProfileIdc != BASELINE_PROFILE &&
          m_eProfileIdc != MAIN_PROFILE  &&
          m_eProfileIdc != EXTENDED_PROFILE  &&
          m_eProfileIdc != HIGH_PROFILE  &&
          m_eProfileIdc != MULTI_VIEW_PROFILE &&
          m_eProfileIdc != SCALABLE_PROFILE );
  RNOK  ( pcReadIf->getFlag( m_bConstrainedSet0Flag,                      "SPS: constrained_set0_flag" ) );
  RNOK  ( pcReadIf->getFlag( m_bConstrainedSet1Flag,                      "SPS: constrained_set1_flag" ) );
  RNOK  ( pcReadIf->getFlag( m_bConstrainedSet2Flag,                      "SPS: constrained_set2_flag" ) );
  RNOK  ( pcReadIf->getFlag( m_bConstrainedSet3Flag,                      "SPS: constrained_set3_flag" ) );
  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" ) );

  if( m_eProfileIdc == SCALABLE_PROFILE ) // bug-fix (HS)
  {

   /* RNOK( pcReadIf->getFlag( m_bNalUnitExtFlag,                           "SPS: nal_unit_extension_flag" ) );
    if ( m_bNalUnitExtFlag == 0 )
    {
        RNOK ( pcReadIf->getUvlc( m_uiNumSimplePriIdVals,                 "SPS: number_of_simple_priority_id_values_minus1" ) );
        m_uiNumSimplePriIdVals++;
        for ( UInt uiPriCount = 0; uiPriCount < m_uiNumSimplePriIdVals; uiPriCount++ )
        {
            RNOK ( pcReadIf->getCode( uiTmp,              PRI_ID_BITS,    "SPS: priority_id" ) );
            RNOK ( pcReadIf->getCode( m_uiTemporalLevelList[uiTmp], 3,    "SPS: temporal_level_list[priority_id]" ) );
            RNOK ( pcReadIf->getCode( m_uiDependencyIdList [uiTmp], 3,    "SPS: dependency_id_list[priority_id]" ) );
            RNOK ( pcReadIf->getCode( m_uiQualityLevelList [uiTmp], 2,    "SPS: quality_level_list[priority_id]" ) );
        }
    }
 JVT-S036  */

    RNOK( pcReadIf->getCode( m_uiExtendedSpatialScalability, 2,           "SPS: ExtendedSpatialScalability" ) );
//    if ( 1 /* chroma_format_idc */ > 0 )
    {
      RNOK( pcReadIf->getCode( m_uiChromaPhaseXPlus1, 2,                  "SPS: ChromaPhaseXPlus1" ) );
      RNOK( pcReadIf->getCode( m_uiChromaPhaseYPlus1, 2,                  "SPS: ChromaPhaseYPlus1" ) );
    }
    if (m_uiExtendedSpatialScalability == ESS_SEQ)
    {
      RNOK( pcReadIf->getSvlc( m_iScaledBaseLeftOffset,                   "SPS: ScaledBaseLeftOffset" ) );
      RNOK( pcReadIf->getSvlc( m_iScaledBaseTopOffset,                    "SPS: ScaledBaseTopOffset" ) );
      RNOK( pcReadIf->getSvlc( m_iScaledBaseRightOffset,                  "SPS: ScaledBaseRightOffset" ) );
      RNOK( pcReadIf->getSvlc( m_iScaledBaseBottomOffset,                 "SPS: ScaledBaseBottomOffset" ) );
    }
    RNOK  ( pcReadIf->getFlag( m_bFGSCodingMode,                            "SPS: FGSCodingMode") );
    if(m_bFGSCodingMode == false)
    {
      RNOK  ( pcReadIf->getUvlc(m_uiGroupingSize,                           "SPS: GroupingSizeMinus1") );
      m_uiGroupingSize++;
    }
    else

⌨️ 快捷键说明

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