JM8.6中三个RDCost函数的对比分析

摘要:
在代码中在函数最后摘自:JM8.6核心代码研究对于计算SSD来说,有时程序只考虑了亮度分量,例如RDCost_for_8x8blocks()函数,有时候,程序同时考虑了亮度分量和两个色度分量,例如RDCost_for_macroblock()函数。Rate表示编码所需要的比特数。程序将调用熵编码函数进行熵编码操作以确定Rate值。在不同情况下,Rate有不同的含义。在Rdcost_for_8x8blocks()函数中,为了进行帧间的模式选择,Rate的计算过程将编码下列的信息:模式,运动矢量和亮度残差数据。

在JM代码中共有3个方法进行RDCost的计算,主要为:

  1. RDCost_for_4x4IntraBlocks,

    JM8.6中三个RDCost函数的对比分析第1张

    RDCost_for_4x4IntraBlocks被调用的函数

JM8.6中三个RDCost函数的对比分析第2张

可以发现, RDCost_for_4x4IntraBlocks只被一个函数直接调用, 从调用流程我们就可精确的知道RDCost_for_4x4IntraBlocks的用处:帧内模式I4MB在RDO方式下的计算函数, 主要是计算一个4x4块的RDO代价

  1. RDCost_for_8x8blocks,

    JM8.6中三个RDCost函数的对比分析第3张

    JM8.6中三个RDCost函数的对比分析第4张

    该函数一个宏块的4个8x8块在亚宏块模式下进行模式选择的时候, 计算其RDO代价, 根据求得的代价对当前的8x8块选择最佳的P8x8模式

  2. RDCost_for_macroblocks

JM8.6中三个RDCost函数的对比分析第5张

这个函数很好理解, 对于一个宏块,分别计算在16x16,16x8, 8x16,P8x8,I4MB,I16MB模式下的RDO代价,然后选择最佳的模式, 由于包括的帧内和帧间的所有模式, 所以这个函数可以实现帧内和帧间模式的选择

JM8.6中三个RDCost函数的对比分析第6张

2011年4月24日9:31:52

JM8.6中的RDO代价函数的分析: RDCost_for_8x8blocks, RDCost_for_macroblocks, RDCost_for_4x4IntraBlocks

在JM8.6中有三种计算RDO模式下代价的函数,分别为RDCost_for_8x8blocks, RDCost_for_macroblocks和RDCost_for_4x4IntraBlocks

帧内:RDCost_for_4x4Intrablocks是用于帧内I4MB模式的选择,

这个函数是在函数Mode_Decision_for_4x4IntraBlocks

中进行调用的,Mode_Decision_for_4x4IntraBlocks函数就是为了对于4x4块进行帧内9种模式的选择.在这个函数中.首先利用函数intrapred_luma计算出了9种模式下对应的预测值,存储在数组img->mprr[9*16*16],然后对9种模式进行for循环,在该for循环中,在进行9种模式的代价比较计算的时候,RDO和非RDO两种情况,

在非RDO模式下,只考虑了SATD,最后的最优代价保存在min_cost变量中,

RDO模式下,由于考虑了到了rate,所以在函数RDCost_for_4x4Intrablocks中进行计算.在进入RDCost_for_4x4Intrablocks之前,先保存当前的编码状态,因为在RDCost_for_4x4Intrablocks函数中要进行编码,解码(重构)的过程.在RDCost_for_4x4Intrablocks函数中,因为是为了进行帧内9种模式的选择,所以Rate计算的时候只会考虑到了模式和亮度残差系数的编码比特数.并且对于distortion利用的是SSD,并且是只考虑了亮度分量

在代码中的表现如下:

JM8.6中三个RDCost函数的对比分析第7张

JM8.6中三个RDCost函数的对比分析第8张

JM8.6中三个RDCost函数的对比分析第9张

在函数的最后利用公式计算出RDO下的代价:

JM8.6中三个RDCost函数的对比分析第10张

帧间:RDCost_for_8x8blocks 计算的是P8x8 的最优模式代价,用于与其他 inter 模式比较得出最佳 inter 模式,

该函数在encode_one_macroblock函数中的计算亚宏块模式下的一个8x8块的rdcost代价

//+++RDCost_for_8x8blocks是在4种亚宏块模式中选择最佳的模式(代价)
//+++
准确来说RDCost_for_8x8blocks主要是得到编号为block8x8,mode模式下的代价

//+++RDCost包括SSDrate两部分:
//+++(1)SSD,
在此处只计算了亮度分量的失真
//+++(2)rate,
由于是在帧间的亚宏块模式中进行选择,所以在这儿包括了模式(b8value),运动矢量(writeReferenceFramewriteMotionVector8x8)和亮度残差

具体的代码中如下:

JM8.6中三个RDCost函数的对比分析第11张

JM8.6中三个RDCost函数的对比分析第12张JM8.6中三个RDCost函数的对比分析第13张

在函数的最后JM8.6中三个RDCost函数的对比分析第14张

帧内与帧间比较:RDCost_for_macroblocks 是在最佳 inter 与 intra 之间选择。

这个函数是在encode_one_macroblock函数中进行调用的.主要是在帧间16x16, 16x8, 8x16, P8x8, 帧内Intra4x4, Intra16x16这些模式间进行代价的计算

//+++为了计算代价rdcost,需要计算distortionrate两部分:
//+++(1)
这个函数中对应distortion的计算使用了亮度分量和色度分量
//+++(2)
由于这儿是在帧内和帧间模式间进行选择,所以rate考虑了宏块头数据,模式,运动向量,亮度残差数据以及色度残差数据。

在代码中

JM8.6中三个RDCost函数的对比分析第15张

JM8.6中三个RDCost函数的对比分析第16张

JM8.6中三个RDCost函数的对比分析第17张JM8.6中三个RDCost函数的对比分析第18张

在函数最后

JM8.6中三个RDCost函数的对比分析第19张

摘自:JM8.6核心代码研究

对于计算SSD来说, 有时程序只考虑了亮度分量, 例如RDCost_for_8x8blocks()函数, 有时候, 程序同时考虑了亮度分量和两个色度分量, 例如RDCost_for_macroblock()函数。Rate 表示编码所需要的比特数。程序将调用熵编码函数进行熵编码操作以确定Rate 值。在不同情况下, Rate 有不同的含义。在 Rdcost_for_8x8blocks()函数中, 为了进行帧间的模式选择, Rate的计算过程将编码下列的信息: 模式, 运动矢量和亮度残差数据。在RDCost_for_4x4IntraBlocks()函数中, 为了进行亮度帧内预测模式的选择, Rate只包括模式和亮度残差系数的编码比特数。 而在RDCost_for_macroblock()函数中, 由于同时进行了帧内, 帧间, 亮度和色度的模式选择, Rate 将同时包含以下部分: 宏块头数据, 模式, 运动向量, 亮度残差数据以及色度残差数据。

免责声明:文章转载自《JM8.6中三个RDCost函数的对比分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇idea中springboot部署常见问题Ubuntu20.04安装Docker时摊上的那些事儿下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

如何在linux下安装idea

[通过正式安装包安装]http://www.jetbrains.com/在官方网站上下载相应版本。终极旗舰社区版本,将其解压缩到本地对应目录,然后执行/idea.sh命令。安装后,可以在启动程序中找到创意图标。...

RPi 树莓派 DSI 接口研究 MIPI raspberry pi

我已经玩树莓派很久了。我发现尚未使用DSI显示界面。经过一些研究,我发现它很有趣。我稍后会记录相关信息。(更新1:目前,整个网络上有很多方案来研究hdmi和mipi之间的相互转换方案:a.)mipi屏幕+hdmi界面:大多数都是因为有很多mipi屏幕和漂亮的参数而被研究的。详细信息:谷歌,得益于包括智汇在内的各种大神的研发,如Pocket LCD方案。最困难...

Innodb_large_prefix

但是,索引列的总长度不能超过3072字节的限制仍然存在...

iReport制作报表,字数过多换行问题

1.当字段中显示的数据太长而无法放入表中时,需要自动换行。选择要更改的表(显示动态内容的字段),并将Stretchwithoverflow属性设置为选中。未选中前:选中后:2.然而,桌子坏了,非常难看。此时,我们需要设置一个属性,使同一行中的其他字段保持与换行字段相同的高度。此时,我们需要框选要显示在整行中的动态字段和表;将属性StretchType设置为R...

ES基本查询总结

ES与数据库比较查询操作Elasticsearch中当我们设置Mapping完毕后,就可以按照设定的方式导入数据。以下内容的原文需要参考ES官方文档1、结构化检索针对字段类型:日期、时间、数字类型,以及精确的文本匹配。结构化检索特点:*1)结构化查询,我们得到的结果总是非是即否,要么存于集合之中,要么存在集合之外。term查询是简单的,它接受一个字段名以及我...

安装pygame

在python3中安装pygame库。一段时间后,您可以看到安装成功,并且可以导入pygame...