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

📄 sliceheaderbase.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
, m_bInIDRAccess					            ( false ) //EIDR bug-fix
, m_bUseSmoothedRef                   ( true )//JVT-V058
, m_bAVCRewriteFlag                   ( rcSPS.getAVCRewriteFlag() )  // V-035
{
  ::memset(  m_auiNumRefIdxActive        , 0x00, 2*sizeof(UInt));
  ::memset(  m_aiDeltaPicOrderCnt,         0x00, 2*sizeof(Int) );
  //TMM_INTERLACE 
   for(UInt ui=0;ui<MAX_TEMP_LEVELS;ui++)
     ::memset( m_aauiNumRefIdxActiveUpdate[ui] , 0x00, 2*sizeof(UInt));
    
}


SliceHeaderBase::~SliceHeaderBase()
{
  FMOUninit(); //TMM_INTERLACE 

  //--
  ANOK( m_acPredWeightTable[LIST_0].uninit() );
  ANOK( m_acPredWeightTable[LIST_1].uninit() );
}

SliceHeaderBase& SliceHeaderBase::operator = ( const SliceHeaderBase& rcSHB )
{
	m_eNalRefIdc													= rcSHB.m_eNalRefIdc;
  m_eNalUnitType												= rcSHB.m_eNalUnitType;
  m_uiLayerId														= rcSHB.m_uiLayerId;
  m_uiTemporalLevel											= rcSHB.m_uiTemporalLevel;
  m_uiQualityLevel											= rcSHB.m_uiQualityLevel;
  m_uiFirstMbInSlice										= rcSHB.m_uiFirstMbInSlice;
  m_eSliceType													= rcSHB.m_eSliceType;
  m_uiPicParameterSetId									= rcSHB.m_uiPicParameterSetId;
  m_uiFrameNum													= rcSHB.m_uiFrameNum;
  m_uiNumMbsInSlice											= rcSHB.m_uiNumMbsInSlice;
  m_bFgsComponentSep										= rcSHB.m_bFgsComponentSep;
  m_uiIdrPicId													= rcSHB.m_uiIdrPicId;
  m_uiPicOrderCntLsb										= rcSHB.m_uiPicOrderCntLsb;
  m_bDirectSpatialMvPredFlag						= rcSHB.m_bDirectSpatialMvPredFlag;

  m_uiBaseLayerId												= rcSHB.m_uiBaseLayerId;
  m_uiBaseQualityLevel									= rcSHB.m_uiBaseQualityLevel;
  m_bAdaptivePredictionFlag							= rcSHB.m_bAdaptivePredictionFlag;
  m_bNumRefIdxActiveOverrideFlag				= false; //rcSHB.m_bNumRefIdxActiveOverrideFlag;
  m_auiNumRefIdxActive[ LIST_0 ]				= rcSHB.m_auiNumRefIdxActive[ LIST_0 ];
	m_auiNumRefIdxActive[ LIST_1 ]				= rcSHB.m_auiNumRefIdxActive[ LIST_1 ];
  m_acRplrBuffer      [ LIST_0 ]        = rcSHB.m_acRplrBuffer      [ LIST_0 ];
	m_acRplrBuffer      [ LIST_1 ]        = rcSHB.m_acRplrBuffer      [ LIST_1 ];
  //m_aauiNumRefIdxActiveUpdate[MAX_TEMP_LEVELS][2];
  m_bNoOutputOfPriorPicsFlag						= rcSHB.m_bNoOutputOfPriorPicsFlag;
  m_bAdaptiveRefPicBufferingModeFlag		= rcSHB.m_bAdaptiveRefPicBufferingModeFlag;
  m_cMmmcoBuffer												= rcSHB.m_cMmmcoBuffer;
  m_uiCabacInitIdc											= rcSHB.m_uiCabacInitIdc;
  m_iSliceQpDelta												= rcSHB.m_iSliceQpDelta;

  m_cDeblockingFilterParameterScalable					= rcSHB.m_cDeblockingFilterParameterScalable;

  m_bBaseLayerUsesConstrainedIntraPred	= rcSHB.m_bBaseLayerUsesConstrainedIntraPred;
  m_uiPriorityId									      = rcSHB.m_uiPriorityId;
  m_bDiscardableFlag										= rcSHB.m_bDiscardableFlag;

  m_bFieldPicFlag												= rcSHB.m_bFieldPicFlag;
  m_bBottomFieldFlag										= rcSHB.m_bBottomFieldFlag;
	m_iDeltaPicOrderCntBottom							= rcSHB.m_iDeltaPicOrderCntBottom;
  m_aiDeltaPicOrderCnt[0]								= rcSHB.m_aiDeltaPicOrderCnt[0];
	m_aiDeltaPicOrderCnt[1]								= rcSHB.m_aiDeltaPicOrderCnt[1];

  m_uiBaseChromaPhaseXPlus1							= rcSHB.m_uiBaseChromaPhaseXPlus1;
  m_uiBaseChromaPhaseYPlus1							= rcSHB.m_uiBaseChromaPhaseYPlus1;

  m_iScaledBaseLeftOffset								= rcSHB.m_iScaledBaseLeftOffset;
  m_iScaledBaseTopOffset								= rcSHB.m_iScaledBaseTopOffset;
  m_iScaledBaseRightOffset							= rcSHB.m_iScaledBaseRightOffset;
  m_iScaledBaseBottomOffset							= rcSHB.m_iScaledBaseBottomOffset;

  m_bArFgsUsageFlag											= rcSHB.m_bArFgsUsageFlag;
  m_uiLowPassFgsMcFilter								= rcSHB.m_uiLowPassFgsMcFilter;
  m_uiBaseWeightZeroBaseBlock						= rcSHB.m_uiBaseWeightZeroBaseBlock;
  m_uiBaseWeightZeroBaseCoeff						= rcSHB.m_uiBaseWeightZeroBaseCoeff;

  m_bBasePredWeightTableFlag            = rcSHB.m_bBasePredWeightTableFlag;
  m_uiLumaLog2WeightDenom               = rcSHB.m_uiLumaLog2WeightDenom;
  m_uiChromaLog2WeightDenom             = rcSHB.m_uiChromaLog2WeightDenom; 
 
  m_uiBaseFragmentOrder                 = rcSHB.m_uiBaseFragmentOrder;
 
  m_bCIUFlag                            = rcSHB.m_bCIUFlag;
 
  if(m_pcFMO == NULL)
		m_pcFMO = new FMO();
	else
	{
		 FMOUninit(); //TMM_INTERLACE 
		m_pcFMO = new FMO();
	}
	
	*m_pcFMO                               = *(rcSHB.m_pcFMO);
  
  
  return *this;
}

ErrVal
SliceHeaderBase::write( HeaderSymbolWriteIf* pcWriteIf ) const
{
  if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ||
      m_eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE     ||
	  m_eNalUnitType == NAL_UNIT_PREFIX						 ) //prefix unit
  {
    return xWriteScalable         ( pcWriteIf );
  }
  else
  {
    return xWriteH264AVCCompatible( pcWriteIf );
  }
}



ErrVal
SliceHeaderBase::xWriteScalable( HeaderSymbolWriteIf* pcWriteIf ) const
{

  UInt  uiFragmentOrder = m_uiFragmentOrder;

  UInt  uiDependencyId = (m_eSliceType != F_SLICE)?m_uiLayerCGSSNR:m_uiLayerId;
  UInt  uiQualityLevel = (m_eSliceType != F_SLICE)?m_uiQualityLevelCGSSNR:m_uiQualityLevel;

  Bool  bLayerBaseFlag = ( (m_uiBaseLayerId == MSYS_UINT_MAX) && (uiQualityLevel==0) );
  // JVT-V088 LMI {
  // JVT-U116 LMI
  //Bool  bExtensionFlag =   (uiDependencyId == 0 && uiQualityLevel == 0) ? m_bExtensionFlag : false;
  // JVT-V088 LMI }
  //===== NAL unit header =====
  RNOK  ( pcWriteIf->writeFlag( 0,                                              "NALU HEADER: forbidden_zero_bit" ) );
  RNOK  ( pcWriteIf->writeCode( m_eNalRefIdc,   2,                              "NALU HEADER: nal_ref_idc" ) );
  RNOK  ( pcWriteIf->writeCode( m_eNalUnitType, 5,                              "NALU HEADER: nal_unit_type" ) );

  if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ||
      m_eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE	  ||
	  m_eNalUnitType == NAL_UNIT_PREFIX			)//prefix unit
  {
    //{{JVT-T083
    RNOK (pcWriteIf->writeCode( 0             ,  2,                             "NALU HEADER: reserved_zero_two_bits"));
    RNOK (pcWriteIf->writeCode( m_uiPriorityId,  6,                             "NALU HEADER: priority_id"));

	RNOK (pcWriteIf->writeCode( m_uiTemporalLevel,   3,                       "NALU HEADER: temporal_level"));
    RNOK( pcWriteIf->writeCode( uiDependencyId,         3,                      "NALU HEADER: dependency_id" ) );
    RNOK( pcWriteIf->writeCode( uiQualityLevel,    2,                           "NALU HEADER: quality_level" ) );
    // JVT-U116 LMI
    //RNOK (pcWriteIf->writeFlag( 0,                                              "NALU HEADER: reserved_zero_one_bit"));
    RNOK (pcWriteIf->writeFlag( bLayerBaseFlag,                                 "NALU HEADER: layer_base_flag"));
    RNOK (pcWriteIf->writeFlag( m_bUseBasePredictionFlag,                       "NALU HEADER: use_base_prediction_flag"));
    RNOK (pcWriteIf->writeFlag( m_bDiscardableFlag,                             "NALU HEADER: discardable_flag"));
    if ( m_eSliceType == F_SLICE && !m_bFragmentedFlag )
    { // PR_SLICES are allways fragmented (with a single framgment by default)
      uiFragmentOrder = 0;
      RNOK( pcWriteIf->writeFlag( 1,                                            "NALU HEADER: fgs_frag_flag" ) );
      RNOK( pcWriteIf->writeFlag( 1,                                            "NALU HEADER: fgs_last_frag_flag" ) );
    }
    else
    {
      RNOK( pcWriteIf->writeFlag( m_bFragmentedFlag,                            "NALU HEADER: fgs_frag_flag" ) );
      RNOK( pcWriteIf->writeFlag( m_bLastFragmentFlag,                          "NALU HEADER: fgs_last_frag_flag" ) );
     }
    RNOK( pcWriteIf->writeCode( uiFragmentOrder,  2,                            "NALU HEADER: fgs_frag_order" ) );
    //}}JVT-T083   
    // JVT-V088 LMI {
    // JVT-U116 LMI {
    RNOK (pcWriteIf->writeFlag( m_bTl0PicIdxPresentFlag,                      "NALU HEADER: tl0_pic_idx_present_flag"));
    if ( m_bTl0PicIdxPresentFlag )
      RNOK( pcWriteIf->writeCode( m_uiTl0PicIdx,    8,                        "SH: tl0_pic_idx" ) );
    // JVT-U116 LMI }
    // JVT-V088 LMI }
  }

//JVT-S036 lsj start
  if(m_uiLayerId == 0 && m_uiQualityLevel == 0)
 {
    if( getNalRefIdc() )
	  {
      if( m_bUseBasePredictionFlag && m_eNalUnitType != NAL_UNIT_CODED_SLICE_IDR_SCALABLE)
		  {
			   RNOK(pcWriteIf->writeFlag( m_bAdaptiveRefPicMarkingModeFlag,			"DRPM: adaptive_ref_pic_marking_mode_flag"));
			   if(m_bAdaptiveRefPicMarkingModeFlag)
			   {
				   RNOK( getMmcoBaseBuffer().write( pcWriteIf ) );
		       }
		  }
	  }
 }

 else
 {
//JVT-S036 lsj end

  //===== slice header =====
  UInt uiFirstMbInSlice = getFirstMbInSlice();
  if ( !getSPS().getFrameMbsOnlyFlag() && getSPS().getMbAdaptiveFrameFieldFlag() && !getFieldPicFlag())
  {
    uiFirstMbInSlice >>=1;
  }

  
	RNOK(     pcWriteIf->writeUvlc( uiFirstMbInSlice,                           "SH: first_mb_in_slice" ) );
  RNOK(     pcWriteIf->writeUvlc( m_eSliceType,                                 "SH: slice_type" ) );
	RNOK(     pcWriteIf->writeUvlc( m_uiPicParameterSetId,                        "SH: pic_parameter_set_id" ) );
  RNOK(     pcWriteIf->writeCode( m_uiFrameNum,getSPS().getLog2MaxFrameNum(),   "SH: frame_num" ) );

  if( ! getSPS().getFrameMbsOnlyFlag() )
  {
    RNOK(   pcWriteIf->writeFlag( getFieldPicFlag(),                            "SH: field_pic_flag" ) );
    if( getFieldPicFlag() )
    {
      RNOK( pcWriteIf->writeFlag( getBottomFieldFlag(),                         "SH: bottom_field_flag" ) );
    }
  }


	if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE )
	{
		RNOK(   pcWriteIf->writeUvlc( m_uiIdrPicId,                                 "SH: idr_pic_id" ) );
	}
	if( getSPS().getPicOrderCntType() == 0 )
	{
	RNOK(     pcWriteIf->writeCode( m_uiPicOrderCntLsb,
									getSPS().getLog2MaxPicOrderCntLsb(),          "SH: pic_order_cnt_lsb" ) );
		if( getPPS().getPicOrderPresentFlag() && ! m_bFieldPicFlag )
		{
		RNOK( pcWriteIf->writeSvlc( m_iDeltaPicOrderCntBottom,                    "SH: delta_pic_order_cnt_bottom" ) );
		}
	}
	if( getSPS().getPicOrderCntType() == 1 && ! getSPS().getDeltaPicOrderAlwaysZeroFlag() )
	{
		RNOK(   pcWriteIf->writeSvlc( m_aiDeltaPicOrderCnt[0],                      "SH: delta_pic_order_cnt[0]" ) );
		if( getPPS().getPicOrderPresentFlag() && ! m_bFieldPicFlag )
		{
		RNOK( pcWriteIf->writeSvlc( m_aiDeltaPicOrderCnt[1],                      "SH: delta_pic_order_cnt[1]" ) );
		}
	}
		if ( getPPS().getRedundantPicCntPresentFlag() )
		{
		RNOK( pcWriteIf->writeUvlc( m_uiRedundantPicCnt,                          "SH: redundant_pic_cnt") );
		}
	if( m_eSliceType == B_SLICE )
	{
		RNOK(   pcWriteIf->writeFlag( m_bDirectSpatialMvPredFlag,                   "SH: direct_spatial_mv_pred_flag" ) );
	}
	  
	if( m_eSliceType != F_SLICE )
	{
    if( getSPS().getAVCAdaptiveRewriteFlag() == true )
      RNOK( pcWriteIf->writeFlag( m_bAVCRewriteFlag,                        "SH: AVC_rewrite_flag" ) );

      //{{JVT-T083
		if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
		{
		RNOK( pcWriteIf->writeFlag( m_bNumRefIdxActiveOverrideFlag,               "SH: num_ref_idx_active_override_flag" ) );
		if( m_bNumRefIdxActiveOverrideFlag )
		{
			RNOK( pcWriteIf->writeUvlc( m_auiNumRefIdxActive[LIST_0]-1,             "SH: num_ref_idx_l0_active_minus1" ) );
			if( m_eSliceType == B_SLICE )
			{
			RNOK( pcWriteIf->writeUvlc( m_auiNumRefIdxActive[LIST_1]-1,           "SH: num_ref_idx_l1_active_minus1" ) );
			}
		}
		}
		if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
		{
		RNOK( getRplrBuffer( LIST_0 ).write( pcWriteIf ) );
		}
		if( m_eSliceType == B_SLICE )
		{
		RNOK( getRplrBuffer( LIST_1 ).write( pcWriteIf ) );
		}

      if ( !bLayerBaseFlag ) 
      {
        UInt  uiBaseLayerId;

        if(m_uiQualityLevelCGSSNR != m_uiQualityLevel || m_uiLayerCGSSNR != m_uiLayerId)
        {
          uiBaseLayerId = ( (m_uiBaseLayerCGSSNR << 4) + ((m_uiBaseQualityLevelCGSSNR) << 2) + m_uiBaseFragmentOrder );
        }
        else
        {
          // one example (m_uiBaseLayerId, m_uiBaseQualityLevel) -> uiBaseLayerIdPlus1 mapping
          uiBaseLayerId = ( (m_uiBaseLayerId << 4) + (m_uiBaseQualityLevel << 2) + m_uiBaseFragmentOrder );
        }
        RNOK( pcWriteIf->writeUvlc( uiBaseLayerId,                                "SH: base_id" ) );
        RNOK( pcWriteIf->writeFlag( m_bAdaptivePredictionFlag,                    "SH: adaptive_prediction_flag" ) );
        // JVT-U160 LMI {
        if ( !m_bAdaptivePredictionFlag ) 
        {
          RNOK( pcWriteIf->writeFlag( m_bDefaultBaseModeFlag,                    "SH: default_base_mode_flag" ) );
		      if( !m_bDefaultBaseModeFlag) 
          {
            RNOK( pcWriteIf->writeFlag( m_bAdaptiveMotPredictionFlag,                    "SH: adaptive_motion_prediction_flag" ) );
		        if ( !m_bAdaptiveMotPredictionFlag )
              RNOK( pcWriteIf->writeFlag( m_bDefaultMotPredictionFlag,                    "SH: default_motion_prediction_flag" ) );
          }
        }
        RNOK( pcWriteIf->writeFlag( m_bAdaptiveResPredictionFlag,                    "SH: adaptive_residual_prediction_flag" ) );
        // JVT-U160 LMI }
        RNOK( pcWriteIf->writeFlag( m_bUseSmoothedRef,                          "SH: use_smoothed_ref") );
      }

		if( ( getPPS().getWeightedPredFlag ()      && ( m_eSliceType == P_SLICE ) ) ||
			( getPPS().getWeightedBiPredIdc() == 1 && ( m_eSliceType == B_SLICE ) ) )
		{
		if( m_bAdaptivePredictionFlag ) 
		{
			RNOK( pcWriteIf->writeFlag( m_bBasePredWeightTableFlag,                "PWT: base_pred_weight_table_flag" ) );
		}
		if( ! m_bBasePredWeightTableFlag )
		{
			RNOK( pcWriteIf->writeUvlc( m_uiLumaLog2WeightDenom,                   "PWT: luma_log_weight_denom" ) );
			RNOK( pcWriteIf->writeUvlc( m_uiChromaLog2WeightDenom,                 "PWT: chroma_log_weight_denom" ) );

			RNOK( m_acPredWeightTable[LIST_0].write( pcWriteIf, getNumRefIdxActive( LIST_0 ) ) );
			if( m_eSliceType == B_SLICE )
			{
			RNOK( m_acPredWeightTable[LIST_1].write( pcWriteIf, getNumRefIdxActive( LIST_1) ) );
			}
		}
		}

⌨️ 快捷键说明

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