sequenceparameterset.cpp

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

CPP
800
字号
    {
      UInt uiNumPosVector = 0;
      UInt uiIndex = 0;
      while(uiNumPosVector != 15)
      {
        if(uiIndex == 0)
        {
          RNOK( pcReadIf->getUvlc(m_uiPosVect[uiIndex],                     "SPS: PosVect[0]") );
        }
        else
        {
          RNOK( pcReadIf->getUvlc(m_uiPosVect[uiIndex], "SPS: PosVect") );
          m_uiPosVect[uiIndex] = m_uiPosVect[uiIndex] + m_uiPosVect[uiIndex-1] + 1;
        }
        uiNumPosVector = m_uiPosVect[uiIndex];
        uiIndex++;
      }
    }
  }


  SpsMVC = NULL; // Nov. 30
  if( m_eProfileIdc == MULTI_VIEW_PROFILE ) 
  {
    SpsMVC = new SpsMvcExtension;	// Nov. 30
    int i,j, vcOrder;
	
    // seq_parameter_set_mvc_extension()
    RNOK  ( pcReadIf->getUvlc( (UInt &)SpsMVC->m_num_views_minus_1,                   "SPS: num_views_minus_1" ) ); // ue(v)
    SpsMVC->initViewSPSMemory_num_refs_for_lists(SpsMVC->getNumViewMinus1());

#if JMVM_ONLY // JVT-Y042
	RNOK ( pcReadIf->getFlag( SpsMVC->non_anchor_single_loop_decoding_flag,     "SPS: non_anchor_single_loop_decoding_flag" ) );  // u(1)
#endif    

    //JVT-V054
    SpsMVC->setInitDone(false);
    printf("ViewCodingOrder: ");
    for (i=0;i<= SpsMVC->m_num_views_minus_1; i++)
    {
      RNOK  ( pcReadIf->getUvlc( SpsMVC->m_uiViewCodingOrder[i], "SPS: view_id[i]")); //ue(v)
      printf("%d ", SpsMVC->m_uiViewCodingOrder[i]);
    }	  
    printf ("\n");

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

      RNOK  ( pcReadIf->getUvlc( (UInt &)SpsMVC->m_num_anchor_refs_list0[vcOrder],                   "SPS: num_anchor_refs_l0[i]" ) ); // ue(v)
      SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,0,0);
      for (j=0; j<SpsMVC->m_num_anchor_refs_list0[vcOrder]; j++)
        RNOK  ( pcReadIf->getUvlc( SpsMVC->m_anchor_ref_list0[vcOrder][j],      "SPS: anchor_ref_l0[i][j]" ) ); // ue(v)
			
      RNOK  ( pcReadIf->getUvlc( (UInt &)SpsMVC->m_num_anchor_refs_list1[vcOrder],                   "SPS: num_anchor_refs_l1[i]" ) ); // ue(v)
      SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,1,0);
      for (j=0; j<SpsMVC->m_num_anchor_refs_list1[vcOrder]; j++)
        RNOK  ( pcReadIf->getUvlc( SpsMVC->m_anchor_ref_list1[vcOrder][j],      "SPS: anchor_ref_l1[vcOrder][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  ( pcReadIf->getUvlc( (UInt&)SpsMVC->m_num_non_anchor_refs_sld_list0[vcOrder],               "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
		  SpsMVC->setNumNonAnchorRefsForListX(vcOrder,0,0);			
		  SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,0,1);
		  for (j=0; j<SpsMVC->m_num_non_anchor_refs_sld_list0[vcOrder]; j++)
			  RNOK  ( pcReadIf->getUvlc( SpsMVC->m_non_anchor_ref_list0[vcOrder][j],      "SPS: non_anchor_ref_l0[i][j]" ) ); // ue(v)
	  }
	  else
	  {
		  RNOK  ( pcReadIf->getUvlc( (UInt&)SpsMVC->m_num_non_anchor_refs_list0[vcOrder],                   "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
		  SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,0,1);
		  for (j=0; j<SpsMVC->m_num_non_anchor_refs_list0[vcOrder]; j++)
			  RNOK  ( pcReadIf->getUvlc( SpsMVC->m_non_anchor_ref_list0[vcOrder][j],      "SPS: non_anchor_ref_l0[i][j]" ) ); // ue(v)
	  }
#else
      RNOK  ( pcReadIf->getUvlc( (UInt &)SpsMVC->m_num_non_anchor_refs_list0[vcOrder],                   "SPS: num_non_anchor_refs_l0[i]" ) ); // ue(v)
      SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,0,1);
      for (j=0; j<SpsMVC->m_num_non_anchor_refs_list0[vcOrder]; j++)
		  RNOK  ( pcReadIf->getUvlc( 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  ( pcReadIf->getUvlc( (UInt&)SpsMVC->m_num_non_anchor_refs_sld_list1[vcOrder],                   "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
		  SpsMVC->setNumNonAnchorRefsForListX(vcOrder,1,0);
		  SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,1,1);
		  for (j=0; j<SpsMVC->m_num_non_anchor_refs_sld_list1[vcOrder]; j++)
			  RNOK  ( pcReadIf->getUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j],      "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
	  }
	  else
	  {
		  RNOK  ( pcReadIf->getUvlc( (UInt&)SpsMVC->m_num_non_anchor_refs_list1[vcOrder],                   "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
		  SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,1,1);
		  for (j=0; j<SpsMVC->m_num_non_anchor_refs_list1[vcOrder]; j++)
			  RNOK  ( pcReadIf->getUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j],      "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
	  }
#else
      RNOK  ( pcReadIf->getUvlc( (UInt &)SpsMVC->m_num_non_anchor_refs_list1[vcOrder],                   "SPS: num_non_anchor_refs_l1[i]" ) ); // ue(v)
      SpsMVC->initViewSPSMemory_ref_for_lists(SpsMVC->getNumViewMinus1(),vcOrder,1,1);
      for (j=0; j<SpsMVC->m_num_non_anchor_refs_list1[vcOrder]; j++)
		  RNOK  ( pcReadIf->getUvlc( SpsMVC->m_non_anchor_ref_list1[vcOrder][j],      "SPS: non_anchor_ref_l1[i][j]" ) ); // ue(v)
#endif
    }
  }


  //--- 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  ( pcReadIf->getUvlc( m_uiPicOrderCntType,                         "SPS: pic_order_cnt_type" ) );
  if( m_uiPicOrderCntType == 0 )
  {
    RNOK( pcReadIf->getUvlc( m_uiLog2MaxPicOrderCntLsb,                   "SPS: log2_max_pic_order_cnt_lsb_minus4" ) );
    m_uiLog2MaxPicOrderCntLsb += 4;
  }
  else if( getPicOrderCntType() == 1 )
  {
    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" ) );
    for( UInt uiIndex = 0; uiIndex < m_uiNumRefFramesInPicOrderCntCycle; uiIndex++ )
    {
      RNOK( pcReadIf->getSvlc( m_aiOffsetForRefFrame[uiIndex],            "SPS: offset_for_ref_frame" ) );
    }
  }
  RNOK( pcReadIf->getUvlc( m_uiNumRefFrames,                              "SPS: num_ref_frames" ) );
  RNOK( pcReadIf->getFlag( m_bRequiredFrameNumUpdateBehaviourFlag,        "SPS: required_frame_num_update_behaviour_flag" ) );
  RNOK( pcReadIf->getUvlc( uiTmp,                                         "SPS: pic_width_in_mbs_minus_1" ) );
  setFrameWidthInMbs ( 1 + uiTmp );
  RNOK( pcReadIf->getUvlc( uiTmp,                                         "SPS: pic_height_in_map_units_minus_1" ) );
  setFrameHeightInMbs( 1 + uiTmp );
  RNOK( pcReadIf->getFlag( bTmp,                                          "SPS: frame_mbs_only_flag" ) );
  ROF ( bTmp );
  RNOK( pcReadIf->getFlag( m_bDirect8x8InferenceFlag,                     "SPS: direct_8x8_inference_flag" ) );
  RNOK( pcReadIf->getFlag( bTmp,                                          "SPS: frame_cropping_flag" ) );
  ROT ( bTmp );
  
  RNOK( pcReadIf->getFlag( bTmp,                                          "SPS: vui_parameters_present_flag" ) );
  ROT ( bTmp );

  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 != MULTI_VIEW_PROFILE &&
         m_eProfileIdc != SCALABLE_PROFILE, Err::m_nOK );

  RNOK  ( pcWriteIf->writeUvlc( 1,                              "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"  ) );
  
  ROTRS ( ! 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 != MULTI_VIEW_PROFILE &&
         m_eProfileIdc != SCALABLE_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") );
  
  ROTRS ( ! m_bSeqScalingMatrixPresentFlag, Err::m_nOK );
  RNOK  ( m_cSeqScalingMatrix.read( pcReadIf, true ) );

  return Err::m_nOK;
}


// TMM_ESS {
Void SequenceParameterSet::setResizeParameters ( const ResizeParameters * params )
{
  m_uiExtendedSpatialScalability = (UInt)params->m_iExtendedSpatialScalability;

  m_uiChromaPhaseXPlus1 = (UInt)(params->m_iChromaPhaseX+1);
  m_uiChromaPhaseYPlus1 = (UInt)(params->m_iChromaPhaseY+1);

  if (m_uiExtendedSpatialScalability == ESS_SEQ)
  {
    m_iScaledBaseLeftOffset   = params->m_iPosX /2;
    m_iScaledBaseTopOffset    = params->m_iPosY /2;
    m_iScaledBaseRightOffset  = (params->m_iGlobWidth - params->m_iPosX - params->m_iOutWidth) /2;
    m_iScaledBaseBottomOffset = (params->m_iGlobHeight - params->m_iPosY - params->m_iOutHeight) /2;
    printf("offset: %d,%d %d,%d\n", m_iScaledBaseLeftOffset<<1, m_iScaledBaseTopOffset<<1, m_iScaledBaseRightOffset<<1, m_iScaledBaseBottomOffset<<1);
  }
  else
  {
    m_iScaledBaseBottomOffset = 0;
    m_iScaledBaseLeftOffset = 0;
    m_iScaledBaseRightOffset = 0;
    m_iScaledBaseTopOffset = 0;
  }
 }

Void SequenceParameterSet::getResizeParameters ( ResizeParameters * params ) const
{
  params->m_iExtendedSpatialScalability = m_uiExtendedSpatialScalability;

  params->m_bCrop = (m_uiExtendedSpatialScalability != ESS_NONE);

  int w = m_uiFrameWidthInMbs * 16;
  int h = m_uiFrameHeightInMbs * 16;
  params->m_iGlobWidth  = w;
  params->m_iGlobHeight = h;

  params->m_iChromaPhaseX = (Int)m_uiChromaPhaseXPlus1 - 1;
  params->m_iChromaPhaseY = (Int)m_uiChromaPhaseYPlus1 - 1;


  if (m_uiExtendedSpatialScalability == ESS_SEQ)
  {
    params->m_iPosX       = m_iScaledBaseLeftOffset *2;
    params->m_iPosY       = m_iScaledBaseTopOffset *2;
    params->m_iOutWidth   = w - params->m_iPosX - (m_iScaledBaseRightOffset *2);
    params->m_iOutHeight  = h - params->m_iPosY - (m_iScaledBaseBottomOffset *2);
  }
  else
  {
    params->m_iOutWidth   = w;
    params->m_iOutHeight  = h;
    params->m_iPosX       = 0;
    params->m_iPosY       = 0;
  }
}
// TMM_ESS }


H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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