Exp-Golomb CodeWord构造和解析的方法

时间:2016-08-17 09:11:00

标签: encoding compression decoding lossless-compression openh264

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

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

我已经学会了如何通过方法构建或解析 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)
所以,
CodeWord = 0000000 1 1100011 [M-0,1忽略位,INFO]

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

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

1 个答案:

答案 0 :(得分:1)

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

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

此外,te(v)代表Truncated Exponential-golomb编码。

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

但真正的快速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),Signed Exp-Golomb使用完全不同的系统。 / p>

编辑:

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

截断的Exp-Golomb与标准RICE又称一元编码相同,但停止位为0。

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