libavcodec / h263data.h的这两部分究竟做了什么?

时间:2013-04-02 19:19:00

标签: c ffmpeg compression libavcodec video-codecs

以下是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”。

我知道这两个代码块中的名称划分了以下内容:

  1. const 是指只读变量的声明,它仍然可以在其范围之外使用,就像任何其他变量一样。另一种说法是,这个数组中的值不能被任何外部调用的方法改变。

  2. uint8_t 无符号整数具有8个比特的长度是一个C99的标准,这就是所谓的部分“固定宽度整数类型”。这种特定类型的,一个“精确宽度整数,”计算的范围内有符号或无符号的比特为0的最小值和8的最大值,(即,8×8宏块),这保证了跨平台这个比特数,无论是比方说,32位或64位操作系统。 (我在这里研究了这个:“固定宽度整数类型”http://en.wikipedia.org/wiki/Stdint.h#stdint.h

  3. MCBPC 是指Macroblock Type&用于Chrominance的编码块模式,但我不完全理解这些特定数组在文件和libavcodec的方案中的确切作用。我在概念上比我在这些例子中定义的细节/数字值更了解。

  4. 因此,考虑到这一点,我想了解更多信息:

    1. 到目前为止,我的理解是否有任何影响?

    2. 有人可以帮助细分每个代码段的功能吗? 更具体地说,这些数字值在每种情况下表示/做什么?

    3. “填充”是什么意思?

    4. 再次感谢您对此事的任何帮助!

1 个答案:

答案 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向右移动。当您到达叶节点时,您已经解码了一个值。

H.263 intraframe macroblock coded block pattern for chroma VLC table