void EncCu::compressCtu( CodingStructure& cs, const UnitArea& area, const unsigned ctuRsAddr, const int prevQP[], const int currQP[] )

VTM3.0代码阅读:compressCtu函数_矛盾统一的博客-CSDN博客

H.266/VVC代码学习13:VTM4.0中的CU层操作(compressCtu 、 xCompressCU)_海洋之心。的博客-CSDN博客

cs:包含之前picture,slice全部的信息,如位置,色度亮度,preQP的设置等。不包括当前CTU的信息。这个之后再确认一下

area,ctuRsAddr,prevQP, currQP:传输过来CTU的位置,ctuRsAddr的值,过去与现在QP的设置,这些都是当前CPU的值。

ctuRsAddr为当前ctu的rs扫描地址。这个之后再确认一下

m_modeCtrl->initCTUEncoding( *cs.slice );cs.treeType = TREE_D;cs.slice->m_mapPltCost[0].clear();cs.slice->m_mapPltCost[1].clear();// init the partitioning managerQTBTPartitioner partitioner;partitioner.initCtu(area, CH_L, *cs.slice);// 用当前area初始化partitioner

initCTUEncoding():进行模式控制类实例的CTU级初始化

enum TreeType
{
  TREE_D = 0, //树的状态设置 (for single-tree slice, TREE_D means joint tree; for dual-tree I slice, TREE_D means TREE_L for luma and TREE_C for chroma)

//single tree应该是对应于dual tree,表明亮度色度都有相同的编码树结构。joint tree应该表示亮色度共用同一种树结构。对于I 帧的dual_tree,不同的变量来表示
  TREE_L = 1, //separate tree only contains luma (may split) 可再分,对single tree和dual tree来说TREE_L 都代表亮度树
  TREE_C = 2, //separate tree only contains chroma (not split), to avoid small chroma block//不可再分,以免出现过小的色度块
};

QTBTPartitioner partitioner:是管理划分的变量,包含划分的栈、CU/PU/TU划分信息(划分深度、UnitArea等信息)、设置划分限制的方法以及划分合理性检查(canSplit)

initCtu():进行划分类实例的初始化,接收传输过来的数据

 if (m_pcEncCfg->getIBCMode()){if (area.lx() == 0 && area.ly() == 0){m_pcInterSearch->resetIbcSearch();}m_pcInterSearch->resetCtuRecord();m_ctuIbcSearchRangeX = m_pcEncCfg->getIBCLocalSearchRangeX();m_ctuIbcSearchRangeY = m_pcEncCfg->getIBCLocalSearchRangeY();}if (m_pcEncCfg->getIBCMode() && m_pcEncCfg->getIBCHashSearch() && (m_pcEncCfg->getIBCFastMethod() & IBC_FAST_METHOD_ADAPTIVE_SEARCHRANGE)){const int hashHitRatio = m_ibcHashMap.getHashHitRatio(area.Y()); // in percentif (hashHitRatio < 5) // 5%{m_ctuIbcSearchRangeX >>= 1;m_ctuIbcSearchRangeY >>= 1;}if (cs.slice->getNumRefIdx(REF_PIC_LIST_0) > 0){m_ctuIbcSearchRangeX >>= 1;m_ctuIbcSearchRangeY >>= 1;}}

IBC:IntraBlockCopy(帧内块复制)模式,默认false,jvetw2002   3.91节有介绍先跳过

// init current context pointer  初始化当前上下文指针m_CurrCtx = m_CtxBuffer.data();CodingStructure *tempCS = m_pTempCS[gp_sizeIdxInfo->idxFrom( area.lumaSize().width )][gp_sizeIdxInfo->idxFrom( area.lumaSize().height )];CodingStructure *bestCS = m_pBestCS[gp_sizeIdxInfo->idxFrom( area.lumaSize().width )][gp_sizeIdxInfo->idxFrom( area.lumaSize().height )];cs.initSubStructure(*tempCS, partitioner.chType, partitioner.currArea(), false);cs.initSubStructure(*bestCS, partitioner.chType, partitioner.currArea(), false);tempCS->currQP[CH_L] = bestCS->currQP[CH_L] =tempCS->baseQP       = bestCS->baseQP       = currQP[CH_L];//把当前亮度QP统一赋给temp和besttempCS->prevQP[CH_L] = bestCS->prevQP[CH_L] = prevQP[CH_L];xCompressCU(tempCS, bestCS, partitioner);

tempCS和bestCS:当前临时的Coding Struct结构和最佳模式的Coding Structure结构,对于每一个尺寸的CU和CTU,都可以根据尺寸在m_pTempCS和m_pBestCS得到对应的CS结构,通过父cs调用initSubStructure将相应信息复制到子cs中(sps、pps等)

gp_sizeIdxInfo->idxFrom():得到当前块的亮度分量的宽度或高度。因为当前area是传输过来的CTUarea,所以此时得到的是当前CTU的宽高
tempCS:得到当前块的宽高后,从m_pTempCS中得到当前块尺寸对应的临时Coding Struct结构(当前待划分CTU的临时Coding Struct结构)

bestCS:得到当前块的宽高后,从m_pBestCS中得到当前块尺寸对应的最佳Coding Struct结构(当前待划分CTU的最佳Coding Struct结构)

VTM3.0代码阅读:xCompressCU函数_矛盾统一的博客-CSDN博客

复制的:tempCS用来存储当前compress区域的各种模式下处理得到的数据,如果tempCS的cost小于bestCS,那么赋给给bestCS;如果差于bestCS,那么丢弃tempCS中数据。bestCS在xCompressCU函数中的任何位置,都用来存储到目前为止所得到的最优划分和最优模式数据。   这个之后看代码再具体理解‘

重要重要:initSubStructure():picture级别的CS通过调用这个函数把SPS,PPS还有preQP等基础参数传给了tempCS和bestCS(CTU级别),注意CS所代表的区域

第一个xCompressCU():因为CTU也可以被看作最大的CU,所以没有encode cu,进入CompressCU()

cs.slice->m_mapPltCost[0].clear();cs.slice->m_mapPltCost[1].clear();// all signals were already copied during compression if the CTU was split - at this point only the structures are copied to the top level CSconst bool copyUnsplitCTUSignals = bestCS->cus.size() == 1;cs.useSubStructure(*bestCS, partitioner.chType, CS::getArea(*bestCS, area, partitioner.chType), copyUnsplitCTUSignals,false, false, copyUnsplitCTUSignals, true);

copyUnsplitCTUSignals:默认为false

 if (CS::isDualITree (cs) && isChromaEnabled (cs.pcv->chrFormat)){m_CABACEstimator->getCtx() = m_CurrCtx->start;partitioner.initCtu(area, CH_C, *cs.slice);cs.initSubStructure(*tempCS, partitioner.chType, partitioner.currArea(), false);cs.initSubStructure(*bestCS, partitioner.chType, partitioner.currArea(), false);tempCS->currQP[CH_C] = bestCS->currQP[CH_C] =tempCS->baseQP       = bestCS->baseQP       = currQP[CH_C];tempCS->prevQP[CH_C] = bestCS->prevQP[CH_C] = prevQP[CH_C];xCompressCU(tempCS, bestCS, partitioner);const bool copyUnsplitCTUSignals = bestCS->cus.size() == 1;cs.useSubStructure(*bestCS, partitioner.chType, CS::getArea(*bestCS, area, partitioner.chType),copyUnsplitCTUSignals, false, false, copyUnsplitCTUSignals, true);}if (m_pcEncCfg->getUseRateCtrl()){(m_pcRateCtrl->getRCPic()->getLCU(ctuRsAddr)).m_actualMSE = (double)bestCS->dist / (double)m_pcRateCtrl->getRCPic()->getLCU(ctuRsAddr).m_numberOfPixel;}// reset context states and uninit context pointerm_CABACEstimator->getCtx() = m_CurrCtx->start;m_CurrCtx                  = 0;// Ensure that a coding was found// Selected mode's RD-cost must be not MAX_DOUBLE.CHECK( bestCS->cus.empty()                                   , "No possible encoding found" );CHECK( bestCS->cus[0]->predMode == NUMBER_OF_PREDICTION_MODES, "No possible encoding found" );CHECK( bestCS->cost             == MAX_DOUBLE                , "No possible encoding found" );
}

if语句:如果当前为dualtree且色度采样格式不为4:0:0,则再对色度进行一次划分。与上面基本相同,只是变为了色度分量

VVC 代码阅读 compressCtu()函数相关推荐

  1. VVC代码阅读 xCheckModeSplit()函数 (中间CABAC还没看)最后代码还没看完

    //当前测试qpconst int qp = encTestMode.qp;//当前sliceconst Slice &slice = *tempCS->slice;// 之前的QPco ...

  2. VVC代码阅读(2)compressGOP函数(2)

    注意:本次代码运用的是encoder_intra_vtm的设置,所以GOP_size  只有一帧 // store sub-picture numbers, sizes, and locations ...

  3. VVC/H.266代码阅读(VTM8.0)(三. Slice到CTU的处理 )

    本文是本系列的第三篇博客,内容是分析从Slice到CTU的处理代码. 该系列相关博客为: VVC/H.266代码阅读(VTM8.0)(一. NALU提取) VVC/H.266代码阅读(VTM8.0)( ...

  4. ORB-SLAM2代码阅读笔记(五):Tracking线程3——Track函数中单目相机初始化

    Table of Contents 1.特征点匹配相关理论简介 2.ORB-SLAM2中特征匹配代码分析 (1)Tracking线程中的状态机 (2)单目相机初始化函数MonocularInitial ...

  5. H.266/VVC代码学习20:角度预测入口 / 特殊模式的PDPC技术(predIntraAng)

    1.predIntraAng函数 predIntraAng是帧内0~66这67种预测的入口.其中可细分为: 模式0:PLANAR模式 模式1:DC模式 模式2~66:角度模式 此函数在亮度预测和色度预 ...

  6. H.266/VVC代码学习21:帧内角度预测的实现 / 近对角模式的PDPC(xPredIntraAng)

    xPredIntraAng函数的作用是对任意大小的块和任意模式,如何将参考像素的值根据其模式的角度填充进每一个像素. 下图是basketball drill的一个16*16的块,其预测模式为10(偏斜 ...

  7. H.266/VVC代码学习17:帧内亮度预测的编解码(intra_luma_pred_modes)

    引--亮度预测:H.266/VVC代码学习5:VTM4.0帧内亮度预测代码(estIntraPredLumaQT) 一.结论: 亮度编解码根据MPM列表的值分为两个阶段: 1 亮度模式在MPM列表中: ...

  8. ORB_SLAM2代码阅读(5)——Bundle Adjustment

    ORB_SLAM2代码阅读(5)--Bundle Adjustment 1. 说明 2. Bundle Adjustment(BA)的物理意义 3. BA的数学表达 4. BA的求解方法 4.1 最速 ...

  9. ORB_SLAM2代码阅读(4)——LoopClosing线程

    ORB_SLAM2代码阅读(4)--LoopClosing线程 1.说明 2.简介 3.检测回环 4.计算Sim3 4.1 为什么在进行回环检测的时候需要计算相似变换矩阵,而不是等距变换? 4.2 累 ...

最新文章

  1. C++ 11 创建和使用 shared_ptr
  2. NTFS的交换数据流ADS应用
  3. 我宣布,这是我找到的史上AI最全论文体系!
  4. datax oracle mysql_从 MySQL 到 Lindorm时序引擎 的数据迁移
  5. 老司机如何找素材,如何找灵感?
  6. JS 正则表达式 手机号码正则
  7. MySQL下载安装新手教程
  8. 分式怎么开根号_如何开根号
  9. Could not connect to appstore: cURL error 28: Operation timed out after 60000 milliseconds with
  10. 苹果鼠标右键怎么按_IOS13.4更新后的鼠标用途在哪?
  11. 虚拟化技术 、 Win系统安装
  12. 将centos7打造成桌面系统centos
  13. python批量将PPT导出成图片集
  14. tomcat启动“成功”,但是浏览器无法访问
  15. 中国智慧商圈建设发展价值调研及投资潜力规划报告2022年版
  16. 并查集——NUIST OJ P1648 炼丹术为例
  17. 思科JABBER显示头像配置文件
  18. 读懂“法定准备金、超额准备金、备付金、超储率”及其政策含义
  19. mini-MBA学习总结一:建设高效团队和决策与执行
  20. 让项目在docker上跑起来

热门文章

  1. Android开发新技术
  2. ettercap+urlsnarf+driftnet+wireshark监听妹子上网
  3. 前端禁用中文半角输入法
  4. 华为又一黑科技:AR高精地图服务即将上线
  5. 天选2出现找不到wlan问题
  6. ST-FOC-02-测量无刷电机参数
  7. adobe pdf 合并文件后提示“无法提取嵌入的字体”问题解决方法
  8. 车速与档位匹配关系_汽车档位与速度的匹配,速度与档位匹配的标准
  9. (PL2303)Prolific usb-to-serial在WIN7, WIN8和WIN10上驱动的问题
  10. c++小游戏(王者荣耀极简)