【问题标题】:JPEG Huffman "DECODE" ProcedureJPEG 霍夫曼“解码”程序
【发布时间】:2018-06-14 10:00:28
【问题描述】:

JPEG 标准定义了如下所示的解码过程。我对一些部分感到困惑。

  1. CODE > MAXCODE(I),如果为真,则进入循环并将左移 (

    可能我没看懂图

  2. + NEXTBIT 是什么意思?例如,如果 CODE 位是 10101,NEXTBIT 是 00000001,那么结果将是 101011(如字符串附加),对吗?

  3. HUFFVAL 列表是否与 DHT 标记中定义的相同(Vi,j 值)。我需要建立额外的查找表或其他东西吗?因为似乎程序直接使用了该列表

感谢您的澄清

编辑:

我的解码代码 (C):

uint8_t
jpg_decode(ImScan    * __restrict scan,
           ImHuffTbl * __restrict huff) {
  int32_t i, j, code;

  i    = 1;
  code = jpg_nextbit(scan);

  /* TODO: infinite loop ? */
  while (code > huff->maxcode[i]) {
    i++;
    code = (code << 1) | jpg_nextbit(scan);
  }

  j = huff->valptr[i];
  j = code + huff->delta[i]; /* delta = j - mincode[i] */

  return huff->huffval[j];
}

【问题讨论】:

    标签: jpeg huffman-code


    【解决方案1】:
    1. 不是MAXCODE,而是MAXCODE(I),每次I递增时都是不同的值。

    2. +NEXTBIT 的字面意思是从输入中添加下一位,即 0 或 1。(NEXTBIT 不是 00000001。它只有一位。)

      李>
    3. 一旦你找到了当前代码的长度,你就会得到Vi,j索引到HUFFVAL解码表。

    【讨论】:

    • 通过 MAXCODE 我的意思是 MAXCODE(I) 并且 nextbit 过程返回 uint8_t 这就是我使用 00000001 的原因。我仍然感到困惑,因为当 CODE > MAXCODE(I) 为真时,CODE 会向左移动,所以每次我将 CODE 的位向左移动时,该条件总是会像无限循环一样为真 :( 也许 SLL 不是我在想的?
    • 另外,当 CODE 向左移动时,我是否应该将 NEXTBIT 写入/替换为 CODE 的最右位,如果这不是真的,那么我需要知道“字面添加”的含义:/
    • 不,它并不总是正确的,也不会是一个无限循环,因为 MAXCODE(I) 对于每个 I 来说都是一个不同的值,每次在循环。
    • SLL 是逻辑左移,相当于乘以 2。用下一位 (NEXTBIT)、0 或 1“替换”最低有效零位与添加 0 或 1完全相同
    • 感谢 cmets,“这并不总是正确的,也不会是无限循环”,所以我可以安全地忽略代码中的无限循环?我通过编辑 QA 添加了我的代码。目前它没有检查无限循环,它可能会在 16 次迭代后中断,但如果保证它不会是无限的那就太好了(即使是错误的 DHT 表)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多