锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

VVC代码阅读 compressSlice()

时间:2023-05-02 20:37:01 dqp9051多参变送器

void EncSlice::compressSlice( Picture* pcPic, const bool bCompressEntireSlice, const bool bFastDeltaQP ) {   // if bCompressEntireSlice is true, then the entire slice (not slice segment) is compressed,   //   effectively disabling the slice-segment-mode.    Slice* const pcSlice    = pcPic->slices[getSliceSegmentIdx()];    if (pcSlice->getSPS()->getSpsRangeExtension().getRrcRiceExtensionEnableFlag())   {     int bitDepth = pcSlice->getSPS()->getBitDepth(CHANNEL_TYPE_LUMA);     int baseLevel = (bitDepth > 12) ? (pcSlice->isIntra() ? (pcSlice->isIntra() ? 5 : 2 * 5 ) : (pcSlice->isIntra() ? 2 * 5 : 3 * 5);     pcSlice->setRiceBaseLevel(baseLevel);   }   else   {     pcSlice->setRiceBaseLevel(4);   }    // initialize cost values - these are used by precompressSlice (they should be parameters).   m_uiPicTotalBits  = 0; //图像的总比比特数   m_uiPicDist       = 0; //图像失真参数    pcSlice->setSliceQpBase( pcSlice->getSliceQp() );    m_CABACEstimator->initCtxModels( *pcSlice );    m_pcCuEncoder->getModeCtrl()->setFastDeltaQp(bFastDeltaQP);

【笔记】HEVC 编码标准(6)-量化_lock。的博客-CSDN博客

compressSlice为什么要有?encodeCtu_小柴的博客-CSDN博客

HEVC代码学习34:compressSlice函数_博客在岳麓吹雪-CSDN博客

bCompressEntireSlice:如果为true,则conpress整个slice,而不是ss(slice segment)

bFastDeltaQP:快速deltaQP模式,只有2Nx2N使用帧间模式。默认关闭

根据定义ss(slice segment)分为独立型和依赖型,独立型ss只有一个,是的Slice开始SS一些信息可以自由独立SS推导得出。1个独立的slice segment然后是多个非独立的slice segment组成slice,SS是NALU传输单位推测只有独立SS需要传输编码

pcPic->slices[getSliceSegmentIdx()]:推测这里将Slice的独立SS传入 并赋给pcSlice。slices是个slice数组,存储slice所有ss序号0代表独立ss。等于将当前slice的信息传入这里有很多猜测,然后确定

第一个if语句:m_rrcRiceExtensionEnableFlag标志,默认false

H.266/VVC技术学习55:熵编码_海洋之心-CSDN博客

设置m_riceBaseLevelValue,使abs_remainder 的baselevel等于4。属于熵编码

setSliceQpBase():量化设置相关

initCtxModels():与CABAC自适应二进制算术熵编码有关。Ctx 为context的缩写

// calculate AC/DC values for current picture   if( pcSlice->getPPS()->getUseWP() || pcSlice->getPPS()->getWPBiPred() )   {     xCalcACDCParamSlice(pcSlice);   } 如果不是P或B帧没有加权预测,则为false   const bool bWp_explicit = (pcSlice->getSliceType()==P_SLICE && pcSlice->getPPS()->getUseWP()) || (pcSlice->getSliceType()==B_SLICE && pcSlice->getPPS()->getWPBiPred());    if ( bWp_explicit )   {      xEstimateWPParamSlice( pcSlice, m_pcCfg->getWeightedPredictionMethod() );     pcSlice->initWpScaling(pcSlice->getSPS());      // check WP on/off     xCheckWPEnable( pcSlice );   }      pcPic->m_prevQP[0] = pcPic->m_prevQP[1] = pcSlice->getSliceQp()///设置图片亮度的色度previous QP    CHECK( pcPic->m_prevQP[0] == std::numeric_limits::max(), "Invalid previous QP" );    CodingStructure&  cs          = *pcPic->cs;   cs.slice    = pcSlice;   cs.pcv      = pcSlice->getPPS()->pcv;///传输一些预参数   cs.fracBits = 0;    if( pcSlice->getFirstCtuRsAddrInSlice() == 0 && ( pcSlice->getPOC() != m_pcCfg->getSwitchPOC() || -1 == m_pcCfg->getDebugCTU() ) )   {     cs.initStructData (pcSlice->getSliceQp());   }  #if ENABLE_QPA   if (m_pcCfg->getUsePerceptQPA() && !m_pcCfg->getUseRateCtrl())   {     if (applyQPAdaptation (pcPic, pcSlice, *cs.pcv, m_pcCfg->getLumaLevelToDeltaQPMapping().mode == LUMALVL_TO_DQP_NUM_MODES,                            (m_pcCfg->getBaseQP() >= 38) || (m_pcCfg->getSourceWidth() <= 512 && m_pcCfg->getSourceHeight() <= 320), m_adaptedLumaQP))    {
      m_CABACEstimator->initCtxModels (*pcSlice);
      pcPic->m_prevQP[0] = pcPic->m_prevQP[1] = pcSlice->getSliceQp();
      if (pcSlice->getFirstCtuRsAddrInSlice() == 0)
      {
        cs.currQP[0] = cs.currQP[1] = pcSlice->getSliceQp(); // cf code above
      }
    }
  }
#endif // ENABLE_QPA

  bool checkPLTRatio = m_pcCfg->getIntraPeriod() != 1 && pcSlice->isIRAP();
  if (checkPLTRatio)
  {
    m_pcCuEncoder->getModeCtrl()->setPltEnc(true);
  }
  else
  {
    bool doPlt = m_pcLib->getPltEnc();
    m_pcCuEncoder->getModeCtrl()->setPltEnc(doPlt);
  }

getUseWP():m_bUseWeightPred,加权预测,P 帧 

getWPBiPred():m_useWeightedBiPred,双加权预测,即B 帧的预测方式(Weighting Bi-Prediction)

xCalcACDCParamSlice():计算AC,DC加权值

getWeightedPredictionMethod():WeightedPredictionMethod是一个枚举函数,里面有加权预测的几种方式选择

xEstimateWPParamSlice():这个之后再看

getSwitchPOC(),getDebugCTU():表示debug poc,debug ctu,默认值都为-1

 initStructData():初始化,之后看

checkPLTRatio:PLT(palette mode coding)调色板编码模式,默认false
doPlt:开启PLT模式
SCC(四):Palette mode_Dillon2015的博客-CSDN博客
if K0149_BLOCK_STATISTICS
  const SPS *sps = pcSlice->getSPS();
  CHECK(sps == 0, "No SPS present");
  writeBlockStatisticsHeader(sps);
#endif
  m_pcInterSearch->resetAffineMVList();
  m_pcInterSearch->resetUniMvList();
  ::memset(g_isReusedUniMVsFilled, 0, sizeof(g_isReusedUniMVsFilled));
  encodeCtus( pcPic, bCompressEntireSlice, bFastDeltaQP, m_pcLib );

encodeCtus():进入compressCtus函数
注意:pcPic->m_prevQP[0] = pcPic->m_prevQP[1];
encoder_intra_vtm.cfg:设定的QP=32,这里的值也为32
encoder_lowdelay_P_vtm.cfg:设定的QP=32,这里的值为31
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章