为什么libjpeg的Huffman解码中“没有代码可以全部为”?

时间:2015-10-03 01:17:58

标签: huffman-code libjpeg libjpeg-turbo

我正在努力让自己满意,我从他们的FTP服务器获得的METEOSAT图像实际上是有效的图像。我怀疑是因为我到目前为止使用的所有工具都抱怨“Bogus Huffman表定义” - 但当我只是注释掉该错误信息时,图像看起来很合理(地球光盘的灰度段)。

来自https://github.com/libjpeg-turbo/libjpeg-turbo/blob/jpeg-8d/jdhuff.c#L379

while (huffsize[p]) {
  while (((int) huffsize[p]) == si) {
    huffcode[p++] = code;
    code++;
  }
  /* code is now 1 more than the last code used for codelength si; but
   * it must still fit in si bits, since no code is allowed to be all ones.
   */
  if (((INT32) code) >= (((INT32) 1) << si))
    ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
  code <<= 1;
  si++;
}

如果我只是注释掉检查,或者将huffsize[p]的检查添加为非零(如在包含循环的控制表达式中),则djpeg设法将图像转换为BMP,我可以看到几个问题。

为什么评论声称不允许所有代码?

1 个答案:

答案 0 :(得分:1)

它声称因为不允许这样做。这并不意味着那里的图像不符合标准。

他们不被允许的原因是这个(来自标准):

  

执行熵编码的段整数个字节   如下:对于霍夫曼编码,如果需要,使用1比特来填充   压缩数据的结尾完成a的最后一个字节   段。

如果允许所有1的代码,那么你可能会在压缩数据的最后一个字节中出现歧义,其中填充的1可能是另一个编码符号。