Android 音视频指数哥伦布编码

32 阅读2分钟

指数哥伦布编码

指数哥伦布编码是熵编码的一种

作用在 SPS 和 PPS

编解码注意

  • H.264 码流中的操作单位是 bit ,不是 byte ,视频编解码十分在乎体积。

  • 指数哥伦布编码是变长编码,

种类

  • 无符号指数哥伦布熵编码 ue(v)
  • 有符号指数哥伦布熵编码 se(v)
  • 映射哥伦布熵编码 me(v)
  • 截断哥伦布熵编码 te(v)

无符号 ue

  • 先把要编码的数字 +1,假设我们要编码的数字是 4, 那么我们先对 4 + 1 ,就是5
  • 将 +1 之后的数字 5 先转换成二进制,就是:101.
  • 转换成二进制之后,我们看转化成的二进制有多少位,然后在前面补 0 ,例如 101 有3位,那么我们应该在前面补两个 0
  • 4 进行无符号指数哥伦布编码之后得到的二进制码流就是 00101

IMG_0139.JPG

有符号 se

  • 先把要编码的数字取绝对值后转成二进制,-5 取绝对值之后二进制是 101
  • 在最后加一个符号位:1011
  • 转换成二进制之后,我们看转化成的二进制有多少位,然后在前面补 0 ,例如 101 有3位,那么我们应该在前面补两个 0 得到的二进制码流就是 0001011

image.png

映射 me

  • 编码数字5 ,得到的码流就是 00110, 占5个 bit 的空间
  • 编码数字47 , 得到的码流就是 00000110000, 占 11 bit 的空间

指数哥伦布熵编码有个特性,那就是数字越大,占用的空间越大。

为了解决这个问题,就出现了映射指数哥伦布熵编码,就是提供了一个码表,当你遇到一段码流的时候,你要先用无符号和有符号获取到 key ,然后去码表中,找到对应的值。

截断 te

当语法元素以截断指数哥伦布解码时, 首先需要判断的语法元素的取值范围。

  • 截断指数哥伦布熵编码