以下是FFMPEG库中的两段代码,具体位于:libavcodec / h263data.h(http://ffmpeg.org/doxygen/0.6/h263data_8h-source.html)。
我想更多地了解这两个段如何在编解码器库的更大上下文中运行。下面,在这些例子之后,我描述了我迄今为止的理解,并提供了两个我想要回答的更清晰的问题。
感谢您的帮助!
示例1
00035 /* intra MCBPC, mb_type = (intra), then (intraq) */
00036 const uint8_t ff_h263_intra_MCBPC_code[9] = { 1, 1, 2, 3, 1, 1, 2, 3, 1 };
00037 const uint8_t ff_h263_intra_MCBPC_bits[9] = { 1, 3, 3, 3, 4, 6, 6, 6, 9 };
和示例2
00039 /* inter MCBPC, mb_type = (inter), (intra), (interq), (intraq), (inter4v) */
00040 /* Changed the tables for interq and inter4v+q, following the standard ** Juanjo ** */
00041 const uint8_t ff_h263_inter_MCBPC_code[28] = {
00042 1, 3, 2, 5,
00043 3, 4, 3, 3,
00044 3, 7, 6, 5,
00045 4, 4, 3, 2,
00046 2, 5, 4, 5,
00047 1, 0, 0, 0, /* Stuffing */
00048 2, 12, 14, 15,
00049 };
据我所知,我们正在研究影响正交方案的较大压缩算法库的一小部分,这些方案预测“正确”或更恰当地放置“原始”运动间或运动内矢量,在这里表示在以名称 “ff_h263_inter_MCBPC_code”, “ff_h263_intra_MCBPC_code” 和 “ff_h263_intra_MCBPC_bits”。
我知道这两个代码块中的名称划分了以下内容:
const 是指只读变量的声明,它仍然可以在其范围之外使用,就像任何其他变量一样。另一种说法是,这个数组中的值不能被任何外部调用的方法改变。
uint8_t 是无符号整数具有8个比特的长度是一个C99的标准,这就是所谓的部分“固定宽度整数类型”。这种特定类型的,一个“精确宽度整数,”计算的范围内有符号或无符号的比特为0的最小值和8的最大值,(即,8×8宏块),这保证了跨平台这个比特数,无论是比方说,32位或64位操作系统。 (我在这里研究了这个:“固定宽度整数类型”http://en.wikipedia.org/wiki/Stdint.h#stdint.h)
MCBPC 是指Macroblock Type&用于Chrominance的编码块模式,但我不完全理解这些特定数组在文件和libavcodec的方案中的确切作用。我在概念上比我在这些例子中定义的细节/数字值更了解。
因此,考虑到这一点,我想了解更多信息:
到目前为止,我的理解是否有任何影响?
有人可以帮助细分每个代码段的功能吗? 更具体地说,这些数字值在每种情况下表示/做什么?
“填充”是什么意思?
再次感谢您对此事的任何帮助!
答案 0 :(得分:1)
让我们从这对数组开始,因为它更短:
const uint8_t ff_h263_intra_MCBPC_code[9] = { 1, 1, 2, 3, 1, 1, 2, 3, 1 };
const uint8_t ff_h263_intra_MCBPC_bits[9] = { 1, 3, 3, 3, 4, 6, 6, 6, 9 };
FFmpeg将这些函数提供给ituh263dec.c中的这个函数:
INIT_VLC_STATIC(&ff_h263_intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
ff_h263_intra_MCBPC_bits, 1, 1,
ff_h263_intra_MCBPC_code, 1, 1, 72);
FFmpeg使用这些位/代码数组来设置可变长度代码(VLC),a.k.a。霍夫曼代码。在这种情况下,该函数将初始化名为ff_h263_intra_MCBPC_vlc
的数据结构。每个数组中有9个项目的事实意味着有9个可能的值(0..8)。第一项是代码1和1位长。第二项也是代码1,但长度为3.这意味着,在二进制中,它是001.让我们展开它:
value code bitcount bits
0 1 1 1
1 1 3 001
2 2 3 010
3 3 3 011
4 1 4 0001
5 1 6 000001
6 2 6 000010
7 3 6 000011
8 1 9 000000001
解码器将能够利用ff_h263_intra_MCBPC_vlc
数据结构,将比特流输入并获取一个值,范围从(0..8),然后消耗在(1..9)之间的某处来自流的比特。
关于你的问题:“填充”是什么意思?,请注意,在代码和位数组中,都有0条目 - 即代码为0且为0比特长。那些是无效的值。由于这些数组有28个值,范围为(0..27)。这意味着无法表示21,22和23。
我希望我已经回答了关于FFmpeg如何处理这些数组的机制的问题(我希望这是你查询的主要内容)。
漂亮的图片时间:
霍夫曼/ VLC代码通常使用树来说明。从顶部开始,0向左移动,1向右移动。当您到达叶节点时,您已经解码了一个值。