VVC 代码阅读 compressCtu()函数
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()函数相关推荐
- VVC代码阅读 xCheckModeSplit()函数 (中间CABAC还没看)最后代码还没看完
//当前测试qpconst int qp = encTestMode.qp;//当前sliceconst Slice &slice = *tempCS->slice;// 之前的QPco ...
- VVC代码阅读(2)compressGOP函数(2)
注意:本次代码运用的是encoder_intra_vtm的设置,所以GOP_size 只有一帧 // store sub-picture numbers, sizes, and locations ...
- VVC/H.266代码阅读(VTM8.0)(三. Slice到CTU的处理 )
本文是本系列的第三篇博客,内容是分析从Slice到CTU的处理代码. 该系列相关博客为: VVC/H.266代码阅读(VTM8.0)(一. NALU提取) VVC/H.266代码阅读(VTM8.0)( ...
- ORB-SLAM2代码阅读笔记(五):Tracking线程3——Track函数中单目相机初始化
Table of Contents 1.特征点匹配相关理论简介 2.ORB-SLAM2中特征匹配代码分析 (1)Tracking线程中的状态机 (2)单目相机初始化函数MonocularInitial ...
- H.266/VVC代码学习20:角度预测入口 / 特殊模式的PDPC技术(predIntraAng)
1.predIntraAng函数 predIntraAng是帧内0~66这67种预测的入口.其中可细分为: 模式0:PLANAR模式 模式1:DC模式 模式2~66:角度模式 此函数在亮度预测和色度预 ...
- H.266/VVC代码学习21:帧内角度预测的实现 / 近对角模式的PDPC(xPredIntraAng)
xPredIntraAng函数的作用是对任意大小的块和任意模式,如何将参考像素的值根据其模式的角度填充进每一个像素. 下图是basketball drill的一个16*16的块,其预测模式为10(偏斜 ...
- H.266/VVC代码学习17:帧内亮度预测的编解码(intra_luma_pred_modes)
引--亮度预测:H.266/VVC代码学习5:VTM4.0帧内亮度预测代码(estIntraPredLumaQT) 一.结论: 亮度编解码根据MPM列表的值分为两个阶段: 1 亮度模式在MPM列表中: ...
- ORB_SLAM2代码阅读(5)——Bundle Adjustment
ORB_SLAM2代码阅读(5)--Bundle Adjustment 1. 说明 2. Bundle Adjustment(BA)的物理意义 3. BA的数学表达 4. BA的求解方法 4.1 最速 ...
- ORB_SLAM2代码阅读(4)——LoopClosing线程
ORB_SLAM2代码阅读(4)--LoopClosing线程 1.说明 2.简介 3.检测回环 4.计算Sim3 4.1 为什么在进行回环检测的时候需要计算相似变换矩阵,而不是等距变换? 4.2 累 ...
最新文章
- C++ 11 创建和使用 shared_ptr
- NTFS的交换数据流ADS应用
- 我宣布,这是我找到的史上AI最全论文体系!
- datax oracle mysql_从 MySQL 到 Lindorm时序引擎 的数据迁移
- 老司机如何找素材,如何找灵感?
- JS 正则表达式 手机号码正则
- MySQL下载安装新手教程
- 分式怎么开根号_如何开根号
- Could not connect to appstore: cURL error 28: Operation timed out after 60000 milliseconds with
- 苹果鼠标右键怎么按_IOS13.4更新后的鼠标用途在哪?
- 虚拟化技术 、 Win系统安装
- 将centos7打造成桌面系统centos
- python批量将PPT导出成图片集
- tomcat启动“成功”,但是浏览器无法访问
- 中国智慧商圈建设发展价值调研及投资潜力规划报告2022年版
- 并查集——NUIST OJ P1648 炼丹术为例
- 思科JABBER显示头像配置文件
- 读懂“法定准备金、超额准备金、备付金、超储率”及其政策含义
- mini-MBA学习总结一:建设高效团队和决策与执行
- 让项目在docker上跑起来
热门文章
- Android开发新技术
- ettercap+urlsnarf+driftnet+wireshark监听妹子上网
- 前端禁用中文半角输入法
- 华为又一黑科技:AR高精地图服务即将上线
- 天选2出现找不到wlan问题
- ST-FOC-02-测量无刷电机参数
- adobe pdf 合并文件后提示“无法提取嵌入的字体”问题解决方法
- 车速与档位匹配关系_汽车档位与速度的匹配,速度与档位匹配的标准
- (PL2303)Prolific usb-to-serial在WIN7, WIN8和WIN10上驱动的问题
- c++小游戏(王者荣耀极简)