JM8.6中对cofAC及相关数组的探讨

关于 int ****cofAC变量的理解

对cofAC, cofAC8x8, cofDC, cofAC4x4, cofAC4x4intern的探讨

我要在这儿解释一下红框内的一些变量的含义:

我在JM86的代码中搜索了一下,发现cofAC4x4intern使用的地方没有几处:

再看,我觉得貌似cofAC4x4intern没有什么用处, 只是为了通过get_memACcoeff来对cofAC4x4进行分配内存空间,可能懒得再写一个单独为cofAC4x4分配空间的函数了吧。

对于cofAC4x4这个容易理解了,就是一个4x4小块的AC系数

cofDC是包括色度块在内的6个8x8大小块(亮度有4个8x8,2个色度8x8)的DC系数

cofAC与cofDC是对应的,应该是相应的AC系数

201141017:36:37

JM代码中几个变换系数数组

下载 (11.62 KB)

2011-3-23 09:22 AM

上图中的这几个数组有什么区别?
特别是cofAC4x4intern指的是什么东西啊?

下面4幅是在Understand中的搜索结果:

其实通过上面的4幅图, 我们可以发现这4AC系数数组的区别与联系.

下面4幅是在VS2008中查找引用结果,比较来说下面的更精确:

  1. 首先对于int****cofAC这个数组, 作为rdopt.c的一个全局变量, 它是一个4维数组,它保存了一个宏块中的所有AC系数:16x16宏块分为48x8,然后将48x8块分为44x4,然后根据level/run的不同存储4x415AC系数的值. 这个数组主要是在函数store_macroblock_parameters过程中使用的, 由于img结构中有cofAC这个数组, 所以这儿,rodpt.c这个文件中cofAC主要是在中间过程中对img->cofAC进行一些保存.

  2. 对于int****cofAC8x8这个数组, 也是一个全局变量, 它和cofAC是一样的, 只不过它主要是在帧间的亚宏块模式选择中存储每一个8x8(48x8)的相应的AC系数, RDO和非RDO下都有应用, 其实主要的原因是因为模式选择中要进行编码,所以才有了要保存AC系数.

  3. 对于int**cofAC4x4这个数组很好理解, 它主要是保存一个4x4块的AC系数, 其中第一维是level/run, 第二维是scan_pos, 这个数组主要是在4x4块的9种帧内模式的选择时作为一个中间量使用, 保存AC系数, 然后进行编码

  4. int****cofAC4x4intern这个数组其实没有什么实质的用处, 通过看代码我们可以发现, 其实这个数组主要是为了给二维数组cofAC4x4服务的, 因为在代码中,利用函数get_mem_ACcoeff函数对cofAC4x4intern进行分配内存后, 我们把cofACintern[0][0]中的二维指针赋给了cofAC4x4, 仅此而已

通过上面的比较我们可以发现其实前三个数组cofAC, cofAC8x8, cofAC4x4比较类似, 都是一个中间量, 由于需要进行帧间帧内模式选择的过程中需要进行编码, 所以为了保存编码过程中img->cofAc的值, 使用了上面的三个数组.

cofAC是在store_macroblock_parameters函数中为了保存一下宏块参数时使用的.

cofAC8x8是在帧间亚宏块模式进行选择的过程中为了保存48x8宏块的一些AC系数而使用的.

cofAC4x4是在帧内9种模式间进行选择时为了保存一个4x4块的AC系数而使用的.

总结:

下面是在rdopt.c文件中定义,

下面是在结构体ImageParameters中的定义:

首先, cofAC4维数组, cofDC是三维数组, cofAC8x8也是4维数组,其实可以这样理解:

ImageParameters结构体中的cofAC是用于保存一个宏块(亮度和色度)中所有的AC系数,是以游程编码的方式保存的,对应的cofDCyuvDC系数

rdopt.c文件中的cofACcofAC8x8都是用于保存img->cofACimg->cofDC的变量, cofAC4x4则是一个4x4块的AC系数,用于保存img->cofAC的后两维(Mode_Decision_for_4x4IntraBlocks中的用法)

 

posted @ 2012-07-27 18:57  Mr.Rico  阅读(...)  评论(...编辑  收藏