1

我正在使用 OpenH264 编解码器。OpenH264 正在使用 Exp-Golomb 编码来获取标头相关信息。我研究了几个网站并收集了一些关于 Exp-Golomb 编码的信息。OpenH264 使用 4 种 Exp-Golomb 编码方法。他们是:

  • Ue [当值仅是非负数时]
  • Te [当值只有 1 或 0 时]
  • Se [当值既是负数又是正数时]
  • [当值为值定义标准代码映射时]

我已经学会了如何通过 Method Ue构造或解析。

Exp-Golomb(Ue) = [M-Zeros][1][INFO] 的语法格式。

构造:假设我们有一个 Code_Num = 226。
现在,
M = floor(log2(Code_Num)) = floor(log2(226)) = 7
INFO = Code_Num + 1 - pow(2,M) = 226 + 1 - 128 = 99 = (1100011) in Binary
So,
CodeWord = 0000000 1 1100011 [M-zeros, 1 ignoring bit, INFO]

解析: 假设我们有一个 CodeWord = 000000011100011
Code_Num = pow(2,M) + INFO - 1 = 128 + 99 - 1 = 226

现在我可以计算 Exp-Golomb(Ue)。但我想学习所有与 Se、Te 和 Me 相关的理论。但我找不到其他方法的任何资源。请帮我。

4

1 回答 1

1

OpenH264 是 H.264/AVC 视频编解码器的实现。

AVC 在其各种标头中使用 Exp-Golomb 编码,所有兼容的编码器也必须如此。

此外,te(v) 代表截断指数哥伦布编码。

无论如何,您可以在wiki 页面上找到有关阅读已签名指数哥伦布代码的信息:

但真正快速的 tl;dr 是 0 = 1、1 = 010、-1 = 011 等。

至于这个烂摊子:

M = floor(log2(Code_Num)) = floor(log2(226)) = 7 INFO = Code_Num + 1 - pow(2,M) = 226 + 1 - 128 = 99 = (1100011) in Binary So, CodeWord = 0000000 1 1100011 [M-zeros, 1 ignoring bit, INFO]

这根本不准确,您应该在编码期间加 1,在解码期间减 1(仅适用于无符号 Exp-Golomb),有符号 Exp-Golomb 使用完全不同的系统。

编辑:

Mapped Exp-Golomb 与 Unsigned Exp-Golomb 完全相同,加上一个表查找。

截断的 Exp-Golomb 与标准 RICE aka 一​​元编码相同,除了停止位为 0。

如果您不想创建自己的解码器/编码器,请查看我的项目 BitIO,因为我已经编写了它们,尤其是 ReadRICE/WriteRICE 和 ReadExpGolomb/WriteExpGolomb 函数,Github 上的 BitIO

于 2017-01-09T16:36:15.473 回答