x265,帧内预测代码分析
- void Analysis::compressIntraCU(const CUData& parentCTU, const CUGeom& cuGeom, uint32_t& zOrder)
- {
- uint32_t depth = cuGeom.depth;//geometric CU几何结构
- ModeDepth& md = m_modeDepth[depth];
- md.bestMode = NULL;
- bool mightSplit = !(cuGeom.flags & CUGeom::LEAF);//为ture非叶子节点,还需继续分裂
- bool mightNotSplit = !(cuGeom.flags & CUGeom::SPLIT_MANDATORY);//
- if (m_param->analysisMode == X265_ANALYSIS_LOAD)
- {
- uint8_t* reuseDepth = &m_reuseIntraDataCTU->depth[parentCTU.m_cuAddr * parentCTU.m_numPartitions];
- uint8_t* reuseModes = &m_reuseIntraDataCTU->modes[parentCTU.m_cuAddr * parentCTU.m_numPartitions];
- char* reusePartSizes = &m_reuseIntraDataCTU->partSizes[parentCTU.m_cuAddr * parentCTU.m_numPartitions];
- if (mightNotSplit && depth == reuseDepth[zOrder] && zOrder == cuGeom.encodeIdx)
- {
- m_quant.setQPforQuant(parentCTU);
- PartSize size = (PartSize)reusePartSizes[zOrder];
- Mode& mode = size == SIZE_2Nx2N ? md.pred[PRED_INTRA] : md.pred[PRED_INTRA_NxN];
- mode.cu.initSubCU(parentCTU, cuGeom);
- checkIntra(mode, cuGeom, size, &reuseModes[zOrder]);
- checkBestMode(mode, depth);
- if (m_bTryLossless)
- tryLossless(cuGeom);
- if (mightSplit)
- addSplitFlagCost(*md.bestMode, cuGeom.depth);
- // increment zOrder offset to point to next best depth in sharedDepth buffer
- zOrder += g_depthInc[g_maxCUDepth - ][reuseDepth[zOrder]];
- mightSplit = false;
- }
- }
- else if (mightNotSplit)
- {
- m_quant.setQPforQuant(parentCTU);
- md.pred[PRED_INTRA].cu.initSubCU(parentCTU, cuGeom);
- checkIntra(md.pred[PRED_INTRA], cuGeom, SIZE_2Nx2N, NULL);//intra2Nx2N 模式
- checkBestMode(md.pred[PRED_INTRA], depth);
- if (depth == g_maxCUDepth)
- {
- md.pred[PRED_INTRA_NxN].cu.initSubCU(parentCTU, cuGeom);
- checkIntra(md.pred[PRED_INTRA_NxN], cuGeom, SIZE_NxN, NULL);//INTRA_NxN 模式
- checkBestMode(md.pred[PRED_INTRA_NxN], depth);
- }
- if (m_bTryLossless)
- tryLossless(cuGeom);
- if (mightSplit)
- addSplitFlagCost(*md.bestMode, cuGeom.depth);
- }
- if (mightSplit)
- {
- Mode* splitPred = &md.pred[PRED_SPLIT];
- splitPred->initCosts();
- CUData* splitCU = &splitPred->cu;
- splitCU->initSubCU(parentCTU, cuGeom);//分裂成4四subCU
- uint32_t nextDepth = depth + ;
- ModeDepth& nd = m_modeDepth[nextDepth];
- invalidateContexts(nextDepth);
- Entropy* nextContext = &m_rqt[depth].cur;
- for (uint32_t subPartIdx = ; subPartIdx < ; subPartIdx++)
- {
- const CUGeom& childGeom = *(&cuGeom + cuGeom.childOffset + subPartIdx);
- if (childGeom.flags & CUGeom::PRESENT)
- {
- m_modeDepth[].fencYuv.copyPartToYuv(nd.fencYuv, childGeom.encodeIdx);
- m_rqt[nextDepth].cur.load(*nextContext);
- compressIntraCU(parentCTU, childGeom, zOrder);//递归
- // Save best CU and pred data for this sub CU
- splitCU->copyPartFrom(nd.bestMode->cu, childGeom, subPartIdx);
- splitPred->addSubCosts(*nd.bestMode);
- nd.bestMode->reconYuv.copyToPartYuv(splitPred->reconYuv, childGeom.numPartitions * subPartIdx);
- nextContext = &nd.bestMode->contexts;
- }
- else
- {
- /* record the depth of this non-present sub-CU */
- splitCU->setEmptyPart(childGeom, subPartIdx);
- zOrder += g_depthInc[g_maxCUDepth - ][nextDepth];
- }
- }
- nextContext->store(splitPred->contexts);
- if (mightNotSplit)
- addSplitFlagCost(*splitPred, cuGeom.depth);
- else
- updateModeCost(*splitPred);
- checkBestMode(*splitPred, depth);
- }
- checkDQP(md.bestMode->cu, cuGeom);
- /* Copy best data to encData CTU and recon */
- md.bestMode->cu.copyToPic(depth);
- if (md.bestMode != &md.pred[PRED_SPLIT])
- md.bestMode->reconYuv.copyToPicYuv(*m_frame->m_reconPic, parentCTU.m_cuAddr, cuGeom.encodeIdx);
- }
x265,帧内预测代码分析的更多相关文章
- x264 亮度信号8x8帧内预测模式
1 该模式的8个预测方向与4x4帧内预测模式一样. 2 该模式只有High profile及更高的Profile的才有可能使用,Baseline.Main Profile.Preset为ultrafa ...
- H.264 White Paper学习笔记(二)帧内预测
为什么要有帧内预测?因为一般来说,对于一幅图像,相邻的两个像素的亮度和色度值之间经常是比较接近的,也就是颜色是逐渐变化的,不会一下子突变成完全不一样的颜色.而进行视频编码,目的就是利用这个相关性,来进 ...
- 【HEVC】2、HM-16.7编码一个CU(帧内部分) 1.帧内预测相邻参考像素获取
HEVC帧内预测的35中预测模式是在PU基础上定义的,实际帧内预测的过程则以TU为单位.PU以四叉树划分TU,一个PU内所有TU共享同一种预测模式.帧内预测分3个步骤: (1) 判断当前TU相邻像素点 ...
- 【HEVC】4、HM-16.7编码一个CU(帧内部分) 3.帧内预测各种模式实现
HEVC中一共定义了35中帧内编码预测模式,编号分别以0-34定义.其中模式0定义为平面模式(INTRA_PLANAR),模式1定义为均值模式(INTRA_DC),模式2~34定义为角度预测模式(IN ...
- [原]H264帧内预测
帧内预测模块大小 说明 4x4(亮度) 预测方式9种 8x8(亮度) 预测方式9种.只有high profile才有 16x16(亮度) 预测方式4种,只依赖左,上数据. 8x8(色度) 预测方式4种 ...
- H264提供了哪些帧内预测?
H.264/AVC 提供了四种帧内预测方式:4x4 亮度块的帧内预测(Intra_4x4).16x16 亮度块的帧内预测(Intra_16x16).8x8 色度块的帧内预测(Intra_chroma) ...
- HM16.0帧内预测重要函数笔记
Void TEncSearch::estIntraPredQT 亮度块的帧内预测入口函数 Void TComPrediction::initAdiPatternChType 获取参考样本点并滤波 ...
- H.264学习笔记2——帧内预测
帧内预测:根据经过反量化和反变换(没有进行去块效应)之后的同一条带内的块进行预测. A.4x4亮度块预测: 用到的像素和预测方向如图: a~f是4x4块中要预测的像素值,A~Q是临块中解码后的参考值. ...
- H264帧内预测模式编号的编码过程
1 本文词汇约定 宏块:H264编码基本单元,16x16像素(或采样)构成 块: 由8x8像素(或采样)构成的单位 子块: 由4x4像素(或采样)构成的单位 2 帧内亮度预测模式 H264规范 ...
随机推荐
- Java总结——文件&流
最近学习了Java的输入输出,脑子里有两点乱,不过比之前的思路好像清晰了很多.脑子刚刚接收这些信息的时候,整个就是懵逼的,又是文件又是流的,文件到底干嘛的,流到底干嘛的?恩,后来,想了想,其实也不难理 ...
- 【原创】我所理解的自动更新-APP发布与后台发布
发布后台 创建渠道:添加新的渠道,设置渠道名称,自动生成渠道id. 查看渠道:查看渠道基本信息,渠道app版本号,资源版本号,是否开启更新. 创建/更新APP:选择打包ios,androi ...
- powerDesigner生成excel版本的数据库文件
今天收到一个需求,要把数据库设计给一个excel版本的,百度出来一个脚本文件,很好用发现,留个纪念 在pd中,shift+ctrl+X,打开脚本运行,脚本如下,附件也留了一份: '********** ...
- Makefile使用库
这篇文章演示了Makefile使用mysqlpp库和lua库的写法. test.cpp: #include <iostream> #include <stdint.h> #in ...
- MySQL乱码问题
JSP的request 默认为ISO8859_1,所以在处理中文的时候, 要显示中文的话,必须转成GBK的,如下 String str=new String(request.getParamete ...
- make phpexcel working with XAMPP7.0.9
Environment XAMPP 7.0.9 (PHP 7.0.9) PHPExcel 1.7.6-1.8.1 not lib_zip.dll Windows 10.1 thinkPHP 5.0.1 ...
- HTTP请求 GET与POST是怎么实现?
1.HTTP请求格式: <request line> <headers> <blank line> [<request-body>] 在HTTP请求中, ...
- web项目开发规范整理总结
一.类.函数.变量名命名: 1.定义类时,全部拼音的首字母必须大写:如Person,ClassDemo:(帕斯卡命名法):也可以用带下斜杆的匈牙利命名法进行命名,如 head_navigatio ...
- jQuery 增加 删除 修改select option .
jQuery获取Select选择的Text和Value: 1. var checkText=jQuery("#select_id").find("option:selec ...
- 20160712001 SQL server R2 更名
use mastergoselect @@servername;select serverproperty('servername') sp_dropserver 'BPM-SERVER'gosp_a ...