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

📄 sliceheaderbase.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  {
  RNOK(     pcReadIf->getCode( m_uiPicOrderCntLsb,
                               getSPS().getLog2MaxPicOrderCntLsb(),          "SH: pic_order_cnt_lsb" ) );
    if( getPPS().getPicOrderPresentFlag() && ! m_bFieldPicFlag )
    {
      RNOK( pcReadIf->getSvlc( m_iDeltaPicOrderCntBottom,                    "SH: delta_pic_order_cnt_bottom" ) );
    }
  }

  if( (1 == getSPS().getPicOrderCntType()) && ( ! getSPS().getDeltaPicOrderAlwaysZeroFlag()))
  {
     RNOKS( pcReadIf->getSvlc( m_aiDeltaPicOrderCnt[LIST_0],                 "SH: delta_pic_order_cnt[0]" ) );
     if (getPPS().getPicOrderPresentFlag() && (!m_bFieldPicFlag))
    {
      RNOK( pcReadIf->getSvlc( m_aiDeltaPicOrderCnt[1],                      "SH: delta_pic_order_cnt[1]" ) );
    }
  }

    if ( getPPS().getRedundantPicCntPresentFlag())
    {
      RNOK( pcReadIf->getUvlc( m_uiRedundantPicCnt,                            "SH: redundant_pic_cnt") );
    }
  if( m_eSliceType == B_SLICE )
  {
    RNOK(   pcReadIf->getFlag( m_bDirectSpatialMvPredFlag,                   "SH: direct_spatial_mv_pred_flag" ) );
  }

  if( getSPS().getAVCAdaptiveRewriteFlag() == true )
    RNOK( pcReadIf->getFlag( m_bAVCRewriteFlag,                            "SH: AVC_rewrite_flag" ) );
  
  if( m_eSliceType != F_SLICE )
  {
    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]++;
        if( m_eSliceType == B_SLICE )
        {
          RNOK( pcReadIf->getUvlc( m_auiNumRefIdxActive[LIST_1],             "SH: num_ref_idx_l1_active_minus1" ) );
          m_auiNumRefIdxActive[LIST_1]++;
        }
      }
    }
    if( m_eSliceType != B_SLICE )
    {
      m_auiNumRefIdxActive[LIST_1] = 0;
    }

    if( m_eSliceType == P_SLICE || m_eSliceType == B_SLICE )
    {
      RNOK( getRplrBuffer( LIST_0 ).read( pcReadIf, getNumRefIdxActive( LIST_0 ) ) );
    }
    if( m_eSliceType == B_SLICE )
    {
      RNOK( getRplrBuffer( LIST_1 ).read( pcReadIf, getNumRefIdxActive( LIST_1 ) ) );
    }

    RNOK( m_acPredWeightTable[LIST_0].init( 64 ) );
    RNOK( m_acPredWeightTable[LIST_1].init( 64 ) );

    if ( !m_bLayerBaseFlag )
    {
      RNOK(   pcReadIf->getUvlc( m_uiBaseLayerId,                            "SH: base_id" ) );
      m_uiBaseFragmentOrder = m_uiBaseLayerId & 0x03;
      m_uiBaseQualityLevel = (m_uiBaseLayerId >> 2) & 0x03;
	    m_uiBaseLayerId = m_uiBaseLayerId >> 4;

      RNOK( pcReadIf->getFlag( m_bAdaptivePredictionFlag,                    "SH: adaptive_prediction_flag" ) );
     // JVT-U160 LMI {
      if ( !m_bAdaptivePredictionFlag ) 
      {
          RNOK( pcReadIf->getFlag( m_bDefaultBaseModeFlag,                    "SH: default_base_mode_flag" ) );
	      if( !m_bDefaultBaseModeFlag ) 
          {
            RNOK( pcReadIf->getFlag( m_bAdaptiveMotPredictionFlag,                    "SH: adaptive_motion_prediction_flag" ) );
		    if ( !m_bAdaptiveMotPredictionFlag )
                RNOK( pcReadIf->getFlag( m_bDefaultMotPredictionFlag,                    "SH: default_motion_prediction_flag" ) );
          }
      }
      RNOK( pcReadIf->getFlag( m_bAdaptiveResPredictionFlag,                    "SH: adaptive_residual_prediction_flag" ) );
      // JVT-U160 LMI }
      RNOK( pcReadIf->getFlag( m_bUseSmoothedRef,                           "SH: use_smoothed_ref_flag") );
    }
    else
    {
      m_uiBaseFragmentOrder = 0;
      m_uiBaseQualityLevel  = 0;
      m_uiBaseLayerId       = MSYS_UINT_MAX;
      m_bAdaptivePredictionFlag = 0;
    }
 
    if( ( getPPS().getWeightedPredFlag ()      && ( m_eSliceType == P_SLICE ) ) ||
        ( getPPS().getWeightedBiPredIdc() == 1 && ( m_eSliceType == B_SLICE ) ) )
    {
      if( m_bAdaptivePredictionFlag)
      {
        RNOK( pcReadIf->getFlag( m_bBasePredWeightTableFlag,                "PWT: base_pred_weight_table_flag" ) );
      }

      if( m_bLayerBaseFlag || ! m_bBasePredWeightTableFlag )
      {
        RNOK( pcReadIf->getUvlc( m_uiLumaLog2WeightDenom,                   "PWT: luma_log_weight_denom" ) );
        RNOK( pcReadIf->getUvlc( m_uiChromaLog2WeightDenom,                 "PWT: chroma_log_weight_denom" ) );
        ROTR( m_uiLumaLog2WeightDenom   > 7, Err::m_nInvalidParameter );
        ROTR( m_uiChromaLog2WeightDenom > 7, Err::m_nInvalidParameter );

        RNOK( m_acPredWeightTable[LIST_0].initDefaults( m_uiLumaLog2WeightDenom, m_uiChromaLog2WeightDenom ) );
        RNOK( m_acPredWeightTable[LIST_0].read( pcReadIf, getNumRefIdxActive( LIST_0 ) ) );
        if( m_eSliceType == B_SLICE )
        {
          RNOK( m_acPredWeightTable[LIST_1].initDefaults( m_uiLumaLog2WeightDenom, m_uiChromaLog2WeightDenom ) );
          RNOK( m_acPredWeightTable[LIST_1].read( pcReadIf, getNumRefIdxActive( LIST_1) ) );
        }
      }
    }

    if( getNalRefIdc() )
    {
      if( isIdrNalUnit() )
      {
        RNOK( pcReadIf->getFlag( m_bNoOutputOfPriorPicsFlag,                 "DRPM: no_output_of_prior_pics_flag" ) );
        RNOK( pcReadIf->getFlag( bTmp,                                       "DRPM: long_term_reference_flag" ) );
        ROT ( bTmp );
      }
      else
      {
        RNOK( pcReadIf->getFlag( m_bAdaptiveRefPicBufferingModeFlag,         "DRPM: adaptive_ref_pic_buffering_mode_flag" ) );
        if( m_bAdaptiveRefPicBufferingModeFlag )
        {
          RNOK( getMmcoBuffer().read( pcReadIf ) );
        }
      }
	//JVT-S036 lsj start
	  if( m_bUseBasePredictionFlag && getNalUnitType() != NAL_UNIT_CODED_SLICE_IDR_SCALABLE )
	  {
		  RNOK(pcReadIf->getFlag( m_bAdaptiveRefPicMarkingModeFlag,			"DRPM: adaptive_ref_pic_marking_mode_flag"));
		  if(m_bAdaptiveRefPicMarkingModeFlag)
		  {
			  RNOK( getMmcoBaseBuffer().read( pcReadIf ) );
		  }		  
	  }
	//JVT-S036 lsj end
    }

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

  if( m_uiFragmentOrder == 0 || m_eSliceType != F_SLICE )
  {
  RNOK( pcReadIf->getSvlc( m_iSliceQpDelta,                                  "SH: slice_qp_delta" ) );
  }
  if( m_eSliceType != F_SLICE )
  {
   if( getPPS().getDeblockingFilterParametersPresentFlag() )
   {
    RNOK( getDeblockingFilterParameterScalable().getDeblockingFilterParameter().read( pcReadIf, true ) ); //V032, added enhanced layer indicator "true"
   }
   if ( getSPS().getInterlayerDeblockingPresent() )
   {
    RNOK( getDeblockingFilterParameterScalable().getDeblockingFilterParameter().read( pcReadIf, true ) ); //V032, added enhanced layer indicator "true"
   }
	//JVT-U106 Behaviour at slice boundaries{
	RNOK (pcReadIf->getFlag( m_bCIUFlag, "SH: constrained_intra_upsampling_flag"));
	//JVT-U106 Behaviour at slice boundaries}
  }
  UInt uiSliceGroupChangeCycle;
  if( getPPS().getNumSliceGroupsMinus1()> 0  && getPPS().getSliceGroupMapType() >= 3  &&  getPPS().getSliceGroupMapType() <= 5)
  {
	  UInt pictureSizeInMB = getSPS().getFrameHeightInMbs()*getSPS().getFrameWidthInMbs();
	  RNOK(     pcReadIf->getCode( uiSliceGroupChangeCycle, getLog2MaxSliceGroupChangeCycle(pictureSizeInMB), "SH: slice_group_change_cycle" ) ); 
	  setSliceGroupChangeCycle(uiSliceGroupChangeCycle);
  }

// TMM_ESS {
  if ((m_eSliceType != F_SLICE) && (getSPS().getExtendedSpatialScalability() > ESS_NONE))
  {
    //if ( 1 /* chroma_format_idc */ > 0 )
    {
      RNOK( pcReadIf->getCode( m_uiBaseChromaPhaseXPlus1, 2,                 "SH: BaseChromaPhaseXPlus1" ) );
      RNOK( pcReadIf->getCode( m_uiBaseChromaPhaseYPlus1, 2,                 "SH: BaseChromaPhaseYPlus1" ) );
    }

    if (getSPS().getExtendedSpatialScalability() == ESS_PICT)
    {
      Int iYScale = 2 - getSPS().getFrameMbsOnlyFlag();
      RNOK( pcReadIf->getSvlc( m_iScaledBaseLeftOffset,                          "SH: ScaledBaseLeftOffset" ) );
      RNOK( pcReadIf->getSvlc( m_iScaledBaseTopOffset,                           "SH: ScaledBaseTopOffset" ) );
      RNOK( pcReadIf->getSvlc( m_iScaledBaseRightOffset,                         "SH: ScaledBaseRightOffset" ) );
      RNOK( pcReadIf->getSvlc( m_iScaledBaseBottomOffset,                        "SH: ScaledBaseBottomOffset" ) );
      m_iScaledBaseTopOffset    *= iYScale;
      m_iScaledBaseBottomOffset *= iYScale;
    }
  }
#ifdef _JVTV074_
  if ((m_eSliceType != F_SLICE))
  {
    m_uiResampleFilterIdx = 0;
    if (getSPS().getNumResampleFiltersMinus1())
    {
      RNOK( pcReadIf->getUvlc( m_uiResampleFilterIdx,                          "SH: ResampleFilterIdx" ) );
    }
  }
#endif //_JVTV074_
// TMM_ESS }

  if( m_eSliceType == F_SLICE && m_uiFragmentOrder == 0)
  {
    RNOK( pcReadIf    ->getUvlc( m_uiNumMbsInSlice,                           "SH: num_mbs_in_slice_minus1" ) );
    m_uiNumMbsInSlice++;
    RNOK( pcReadIf    ->getFlag( m_bFgsComponentSep,                          "SH: luma_chroma_sep_flag" ) );
    if ( m_bUseBasePredictionFlag )
    {
	  RNOK( pcReadIf    ->getFlag( m_bStoreBaseRepresentationFlag,              "SH: store_base_rep_flag" ) );
      RNOK( pcReadIf->getFlag( m_bArFgsUsageFlag,                             "SH: adaptive_ref_fgs_flag" ) );
    if( m_bArFgsUsageFlag ) 
    {
      // send other information conditionally
      RNOK( pcReadIf->getCode( m_uiBaseWeightZeroBaseBlock, 5,                "SH: base_ref_weight_for_zero_base_block" ) );
      if( m_uiBaseWeightZeroBaseBlock != 0 )
        m_uiBaseWeightZeroBaseBlock += 1;

      RNOK( pcReadIf->getCode( m_uiBaseWeightZeroBaseCoeff, 5,                "SH: base_ref_weight_for_zero_base_coeff" ) );
      if( m_uiBaseWeightZeroBaseCoeff != 0 )
        m_uiBaseWeightZeroBaseCoeff += 1;

      RNOK( pcReadIf->getFlag( m_bFgsEntropyOrderFlag,                               "SH: fgs_order_flag" ) );
    }
    else
    {
      m_uiBaseWeightZeroBaseBlock = AR_FGS_DEFAULT_BASE_WEIGHT_ZERO_BLOCK;
      m_uiBaseWeightZeroBaseCoeff = AR_FGS_DEFAULT_BASE_WEIGHT_ZERO_COEFF;
      m_bFgsEntropyOrderFlag = 0;
    }
    }
    RNOK( pcReadIf->getFlag( m_bAdaptivePredictionFlag,                       "SH: motion_refinement_flag" ) );

    m_uiVectorModeIndex = 0;
    if( this->getSPS().getNumFGSVectModes() > 1 )
    {
      if( this->getSPS().getNumFGSVectModes() == 2)
      {
        RNOK ( pcReadIf->getFlag( bTmp,                                      "SH: vector_mode_index"     ) );
        m_uiVectorModeIndex = 1-bTmp; 
      }
      else
        RNOK ( pcReadIf->getUvlc( m_uiVectorModeIndex,                        "SH: vector_mode_index"     ) );
    }

    m_bFGSCycleAlignedFragment  = this->getSPS().getFGSCycleAlignedFragment(); 
    m_bFGSCodingMode            = this->getSPS().getFGSCodingMode( m_uiVectorModeIndex );
    if( m_bFGSCodingMode == false )
    {
      m_uiGroupingSize             = this->getSPS().getGroupingSize( m_uiVectorModeIndex );
    }
    else
    {
      m_uiGroupingSize            = 1; 

      m_uiNumPosVectors           = this->getSPS().getNumPosVectors( m_uiVectorModeIndex ); 

      UInt uiIndex; 
      for( uiIndex = 0; uiIndex < m_uiNumPosVectors ; uiIndex ++ )
      {
          m_uiPosVect[uiIndex] = this->getSPS().getPosVect( m_uiVectorModeIndex, uiIndex ); 
      }
    }
  }
  return Err::m_nOK;
}



ErrVal
SliceHeaderBase::xReadH264AVCCompatible( HeaderSymbolReadIf* pcReadIf )
{
  const Bool bL0InfoPresent = ! ( m_eSliceType == I_SLICE );
  const Bool bL1InfoPresent =  m_eSliceType == B_SLICE;
  Bool  bTmp;
 
  RNOK(     pcReadIf->getCode( m_uiFrameNum,
                               getSPS().getLog2MaxFrameNum(),                "SH: frame_num" ) );
	ROT( isIdrNalUnit() && (0 != m_uiFrameNum) );

	if( ! getSPS().getFrameMbsOnlyFlag() )
  {
    RNOKS(   pcReadIf->getFlag( m_bFieldPicFlag,                             "SH: field_pic_flag" ) );
    if( m_bFieldPicFlag )
    {
      RNOKS( pcReadIf->getFlag( m_bBottomFieldFlag,                          "SH: bottom_field_flag" ) );
    }
  }

  if( m_eNalUnitType == NAL_UNIT_CODED_SLICE_IDR )
  {
    RNOK(   pcReadIf->getUvlc( m_uiIdrPicId,                                 "SH: idr_pic_id" ) );
  }
  
  if( 0 == getSPS().getPicOrderCntType() )
  {
  RNOK(     pcReadIf->getCode( m_uiPicOrderCntLsb,
                               getSPS().getLog2MaxPicOrderCntLsb(),          "SH: pic_order_cnt_lsb" ) );
    if( getPPS().getPicOrderPresentFlag() && ! m_bFieldPicFlag )
    {
      RNOK( pcReadIf->getSvlc( m_iDeltaPicOrderCntBottom,                    "SH: delta_pic_order_cnt_bottom" ) );
    }
  }
  if( getSPS().getPicOrderCntType() == 1 && ! getSPS().getDeltaPicOrderAlwaysZeroFlag() )
  {
    RNOK(   pcReadIf->getSvlc( m_aiDeltaPicOrderCnt[LIST_0],                      "SH: delta_pic_order_cnt[0]" ) );
    if( getPPS().getPicOrderPresentFlag() && ! m_bFieldPicFlag )
  {
      RNOK( pcReadIf->getSvlc( m_aiDeltaPicOrderCnt[LIST_1],                      "SH: delta_pic_order_cnt[1]" ) );
    }
  }
  //JVT-Q054 Red. Picture {
  if ( getPPS().getRedundantPicCntPresentFlag())
  {
    RNOK( pcReadIf->getUvlc( m_uiRedundantPicCnt,                            "SH: redundant_pic_cnt") );
  }

⌨️ 快捷键说明

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