sliceheaderbase.cpp

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

CPP
1,669
字号
		RNOK( pcWriteIf->writeFlag( m_bArFgsUsageFlag,                               "SH: base_layer_key_pic_flag" ) );
		if( m_bArFgsUsageFlag )
		{
		// send other information conditionally
		UInt uiWeight;

		// AR_FGS_MAX_BASE_WEIGHT - 1 is not allowed
		uiWeight = ( m_uiBaseWeightZeroBaseBlock <= 1 ) ? 0 : ( m_uiBaseWeightZeroBaseBlock - 1 );
		RNOK( pcWriteIf->writeCode( uiWeight, 5,                                   "SH: base_ref_weight_for_zero_base_block" ) );

		// AR_FGS_MAX_BASE_WEIGHT - 1 is not allowed
		uiWeight = ( m_uiBaseWeightZeroBaseCoeff <= 1 ) ? 0 : ( m_uiBaseWeightZeroBaseCoeff - 1 );
		RNOK( pcWriteIf->writeCode( uiWeight, 5,                                   "SH: base_ref_weight_for_zero_base_coeff" ) );

		RNOK( pcWriteIf->writeFlag( m_bFgsEntropyOrderFlag,                               "SH: fgs_order_flag" ) );
		}
		RNOK( pcWriteIf->writeFlag( m_bAdaptivePredictionFlag,                       "SH: motion_refinement_flag" ) );
	}
} //JVT-P031
}//JVT-S036 

#if JMVM_ONLY  // JVT-U052
  if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
    RNOK(     pcWriteIf->writeCode( m_uiIcEnable,        1,               "SH: ic_enable" ) );
  
  // JVT-Z032
  if ( ! m_anchor_pic_flag && (getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (getViewId(), LIST_0)
                               || getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (getViewId(), LIST_1) ) ) 
    RNOK(     pcWriteIf->writeFlag( m_bMotionSkip,      "SH: motion_skip_flag" ) );
#endif

  return Err::m_nOK;
}



ErrVal
SliceHeaderBase::xWriteH264AVCCompatible( HeaderSymbolWriteIf* pcWriteIf ) const
{
  //===== NAL unit header =====

	enum NalUnitType NNalUnitType = m_eNalUnitType; 
	if ( !this->getAVCFlag() ) //JVT-W035
	{
  	NNalUnitType =NAL_UNIT_CODED_SLICE_SCALABLE;

    
	}
	
	RNOK  ( pcWriteIf->writeFlag( 0,                                              "NALU HEADER: forbidden_zero_bit" ) );
	RNOK  ( pcWriteIf->writeCode( m_eNalRefIdc,   2,                              "NALU HEADER: nal_ref_idc" ) );
	RNOK  ( pcWriteIf->writeCode( NNalUnitType, 5,                              "NALU HEADER: nal_unit_type" ) );

    
	
	if ( !this->getAVCFlag() ) //JVT-W035
	{
		RNOK  ( pcWriteIf->writeCode( this->getSvcMvcFlag(),          1,                                "NALU HEADER: svc_mvc_flag" ) );
    RNOK (  pcWriteIf->writeCode( m_uiSimplePriorityId,           6,                                "NALU HEADER: simple_priority_id")); // JVT-W035
		RNOK (  pcWriteIf->writeCode( m_uiTemporalLevel,              3,                                "NALU HEADER: temporal_level"));
		RNOK  ( pcWriteIf->writeCode( this->getAnchorPicFlag(),       1,                                "NALU HEADER: anchor_pic_flag" ) );
		RNOK  ( pcWriteIf->writeCode( this->getViewId(),              10,                               "NALU HEADER: view_id" ) );
    RNOK  ( pcWriteIf->writeCode( this->getIDRFlag(),             1,                                "NALU HEADER: idr_flag" ) );
		RNOK  ( pcWriteIf->writeCode( this->getInterViewFlag(),				1,															  "NALU HEADER: inter_view_flag") ); // JVT-W056 Samsung
		RNOK  ( pcWriteIf->writeCode( this->getReservedZeroBits(),    1,                                "NALU HEADER: reserved_zero_one_bits" ) );
		
	}
	

  //===== slice header =====
  RNOK(     pcWriteIf->writeUvlc( m_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( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR )
  {
    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() /*&& true  ! field_pic_flag */ )
    {
      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() /*&& true  ! field_pic_flag */ )
    {
      RNOK( pcWriteIf->writeSvlc( m_aiDeltaPicOrderCnt[1],                      "SH: delta_pic_order_cnt[1]" ) );
    }
  }
  //JVT-Q054 Red. Picture {
  if ( getPPS().getRedundantPicCntPresentFlag() )
  {
    RNOK( pcWriteIf->writeUvlc( m_uiRedundantPicCnt,                            "SH: redundant_pic_cnt") );
  }
  //JVT-Q054 Red. Picture }
  
  if( m_eSliceType == B_SLICE )
  {
    RNOK(   pcWriteIf->writeFlag( m_bDirectSpatialMvPredFlag,                   "SH: direct_spatial_mv_pred_flag" ) );
  }

  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 JMVM_ONLY  // JVT-W081
  if ( this->getAnchorPicFlag() && !getAVCFlag() )
  {
	  UInt ui;
	  UInt uiNumNonAnchorRefL0 = getSPS().getSpsMVC()->getNumNonAnchorRefsForListX(this->getViewId(), LIST_0);
	  UInt uiNumNonAnchorRefL1 = getSPS().getSpsMVC()->getNumNonAnchorRefsForListX(this->getViewId(), LIST_1);

	  if( m_eSliceType != I_SLICE )	  
	  {
		  for(ui=0; ui<uiNumNonAnchorRefL0; ui++)
		  {
			  RNOK	( pcWriteIf->writeSvlc	( m_iGlobalDisparityL0[ui][0], "SH: global_disparity_L0[i][0]" ) );
			  RNOK	( pcWriteIf->writeSvlc	( m_iGlobalDisparityL0[ui][1], "SH: global_disparity_L0[i][1]" ) );
		  }
	  }
	  if( m_eSliceType != I_SLICE )
	  {
		  for(ui=0; ui<uiNumNonAnchorRefL1; ui++)
		  {
			  RNOK	( pcWriteIf->writeSvlc	( m_iGlobalDisparityL1[ui][0], "SH: global_disparity_L1[i][0]" ) );
			  RNOK	( pcWriteIf->writeSvlc	( m_iGlobalDisparityL1[ui][1], "SH: global_disparity_L1[i][1]" ) );
		  }	
	  }	
  }
#endif  // JVT-W081

  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( ( getPPS().getWeightedPredFlag ()      && ( m_eSliceType == P_SLICE ) ) ||
      ( getPPS().getWeightedBiPredIdc() == 1 && ( m_eSliceType == B_SLICE ) ) )
  {
    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) ) );
    }
  }

  if( getNalRefIdc() )
  {
    if( isIdrNalUnit() )
    {
      RNOK( pcWriteIf->writeFlag( m_bNoOutputOfPriorPicsFlag,                   "DRPM: no_output_of_prior_pics_flag" ) );
      RNOK( pcWriteIf->writeFlag( false,                                        "DRPM: long_term_reference_flag" ) );
    }
    else
    {
      RNOK( pcWriteIf->writeFlag( m_bAdaptiveRefPicBufferingModeFlag,           "DRPM: adaptive_ref_pic_buffering_mode_flag" ) );
      if( m_bAdaptiveRefPicBufferingModeFlag )
      {
        RNOK( getMmcoBuffer().write( pcWriteIf ) );
      }
    }
  }

  if( getPPS().getEntropyCodingModeFlag() && m_eSliceType != I_SLICE )
  {
    RNOK( pcWriteIf->writeUvlc( m_uiCabacInitIdc,                               "SH: cabac_init_idc" ) );
  }


  RNOK( pcWriteIf->writeSvlc( m_iSliceQpDelta,                                  "SH: slice_qp_delta" ) );
  
  if( getPPS().getDeblockingFilterParametersPresentFlag() )
  {
    RNOK( getDeblockingFilterParameter().write( pcWriteIf ) );
  }

  if(getPPS().getNumSliceGroupsMinus1()>0 && getPPS().getSliceGroupMapType() >=3 && getPPS().getSliceGroupMapType() <= 5)
  {    
    RNOK(     pcWriteIf->writeCode( m_uiSliceGroupChangeCycle, getPPS().getLog2MaxSliceGroupChangeCycle(getSPS().getMbInFrame()) ,                "SH: slice_group_change_cycle" ) );
  }

#if JMVM_ONLY  // JVT-U052
  if( ( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE ) && !getAVCFlag() )
    RNOK(     pcWriteIf->writeCode( m_uiIcEnable,        1,               "SH: ic_enable" ) );

  //JVT-Z032
  if (!getAVCFlag() && !m_anchor_pic_flag && (getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (getViewId(), LIST_0)
                    || getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (getViewId(), LIST_1) ) ) 
    RNOK(     pcWriteIf->writeFlag( m_bMotionSkip,      "SH: motion_skip_enable_flag" ) );
#endif

  return Err::m_nOK;
}




ErrVal
SliceHeaderBase::read( HeaderSymbolReadIf* pcReadIf )
{

    if( (m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE || 
         m_eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE ) && m_svc_mvc_flag)
    {
        return xReadMVCCompatible ( pcReadIf );
    }
    else
  if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE || 
      m_eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE       )
  {
    if      ( m_eSliceType == B_SLICE ) m_eSliceType = P_SLICE;
    else if ( m_eSliceType == P_SLICE ) m_eSliceType = B_SLICE;

    return xReadScalable          ( pcReadIf );
  }
  else
  {
    return xReadH264AVCCompatible ( pcReadIf );
  }



}



ErrVal
SliceHeaderBase::xReadScalable( HeaderSymbolReadIf* pcReadIf )
{
  Bool  bTmp;
  UInt  uiTmp;

  /*if( m_eSliceType == F_SLICE ) // HS: coding order changed to match the text
  {
    RNOK(   pcReadIf->getUvlc( m_uiNumMbsInSlice,                            "SH: num_mbs_in_slice" ) );
    RNOK(   pcReadIf->getFlag( m_bFgsComponentSep,                           "SH: fgs_comp_sep" ) );
  }*/
  RNOK(     pcReadIf->getCode( m_uiFrameNum,
                               getSPS().getLog2MaxFrameNum(),                "SH: frame_num" ) );
  //if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ) JVT-W035
  if( getIDRFlag()) //JVT-W035
  {
    RNOK(   pcReadIf->getUvlc( m_uiIdrPicId,                                 "SH: idr_pic_id" ) );
  }
  
  if( getSPS().getPicOrderCntType() == 0 )
  {
  RNOK(     pcReadIf->getCode( m_uiPicOrderCntLsb,
                               getSPS().getLog2MaxPicOrderCntLsb(),          "SH: pic_order_cnt_lsb" ) );
    if( getPPS().getPicOrderPresentFlag() /*&& true  ! field_pic_flag */ )
    {
      RNOK( pcReadIf->getSvlc( m_iDeltaPicOrderCntBottom,                    "SH: delta_pic_order_cnt_bottom" ) );
    }
  }
  if( getSPS().getPicOrderCntType() == 1 && ! getSPS().getDeltaPicOrderAlwaysZeroFlag() )
  {
    RNOK(   pcReadIf->getSvlc( m_aiDeltaPicOrderCnt[0],                      "SH: delta_pic_order_cnt[0]" ) );
    if( getPPS().getPicOrderPresentFlag() /*&& true ! field_pic_flag */ )
    {
      RNOK( pcReadIf->getSvlc( m_aiDeltaPicOrderCnt[1],                      "SH: delta_pic_order_cnt[1]" ) );
    }
  }
//JVT-S036  start
  if( getNalRefIdc() )
  {
	  RNOK( pcReadIf->getFlag( m_bKeyPicFlagScalable,							 "SH: key_pic_flag"));
  }
//JVT-S036  end
  //JVT-Q054 Red. Picture {
  if ( m_eSliceType != F_SLICE )
  {
    if ( getPPS().getRedundantPicCntPresentFlag())
    {
      RNOK( pcReadIf->getUvlc( m_uiRedundantPicCnt,                            "SH: redundant_pic_cnt") );
    }
  }
  //JVT-Q054 Red. Picture }
  
  if( m_eSliceType == B_SLICE )
  {
    RNOK(   pcReadIf->getFlag( m_bDirectSpatialMvPredFlag,                   "SH: direct_spatial_mv_pred_flag" ) );
  }
  
  if( m_eSliceType != F_SLICE )
  {
    RNOK(   pcReadIf->getUvlc( uiTmp,                                        "SH: base_id_plus1" ) );
    m_uiBaseLayerId = uiTmp - 1;
    if( m_uiBaseLayerId != MSYS_UINT_MAX )
    {
	    m_uiBaseFragmentOrder = m_uiBaseLayerId & 0x03;
      m_uiBaseQualityLevel = (m_uiBaseLayerId >> 2) & 0x03;
	    m_uiBaseLayerId = m_uiBaseLayerId >> 4;
    }
    else
    {
      m_uiBaseQualityLevel = 0;
    }

    if( m_uiBaseLayerId != MSYS_UINT_MAX )
    {
      RNOK( pcReadIf->getFlag( m_bAdaptivePredictionFlag,                    "SH: adaptive_prediction_flag" ) );
    }
    
    if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
    {
      RNOK( pcReadIf->getFlag( m_bNumRefIdxActiveOverrideFlag,               "SH: num_ref_idx_active_override_flag" ) );
      if( m_bNumRefIdxActiveOverrideFlag )
      {
        RNOK( pcReadIf->getUvlc( m_auiNumRefIdxActive[LIST_0],               "SH: num_ref_idx_l0_active_minus1" ) );
        m_auiNumRefIdxActive[LIST_0]++;

⌨️ 快捷键说明

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