JPEG 霍夫曼 "DECODE" 程序
JPEG Huffman "DECODE" Procedure
JPEG 标准定义了如下的 DECODE 过程。我对几个部分感到困惑。
CODE > MAXCODE(I),如果为真,则它进入循环并将左移 (<<) 应用于代码。 AFAIK,如果我们对非零数字应用左移,数字将比之前的数字大。这个图中是用了SLL(左移逻辑运算),难道CODE总是大于MAXCODE吗?
可能是我没看对图
+ NEXTBIT
是什么意思?例如,如果 CODE 位是 10101 并且 NEXTBIT 是 00000001 那么结果将是 101011(就像字符串追加),对吗?
HUFFVAL 列表是否与 DHT 标记中定义的相同(Vi,j 值)。我是否需要构建额外的查找 table 或其他东西?因为程序似乎直接使用了那个列表
感谢您的澄清
编辑:
我的解码码(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];
}
不是MAXCODE
,是MAXCODE(I)
,I
每次递增的值都不一样。
+NEXTBIT
字面意思是从输入中添加下一位,即 0 或 1。(NEXTBIT
不是 00000001
。它只是一位。)
一旦找到当前代码的长度,就可以将 Vi,j
索引到 HUFFVAL
解码 table.
JPEG 标准定义了如下的 DECODE 过程。我对几个部分感到困惑。
CODE > MAXCODE(I),如果为真,则它进入循环并将左移 (<<) 应用于代码。 AFAIK,如果我们对非零数字应用左移,数字将比之前的数字大。这个图中是用了SLL(左移逻辑运算),难道CODE总是大于MAXCODE吗?
可能是我没看对图
+ NEXTBIT
是什么意思?例如,如果 CODE 位是 10101 并且 NEXTBIT 是 00000001 那么结果将是 101011(就像字符串追加),对吗?HUFFVAL 列表是否与 DHT 标记中定义的相同(Vi,j 值)。我是否需要构建额外的查找 table 或其他东西?因为程序似乎直接使用了那个列表
感谢您的澄清
编辑:
我的解码码(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];
}
不是
MAXCODE
,是MAXCODE(I)
,I
每次递增的值都不一样。+NEXTBIT
字面意思是从输入中添加下一位,即 0 或 1。(NEXTBIT
不是00000001
。它只是一位。)一旦找到当前代码的长度,就可以将
Vi,j
索引到HUFFVAL
解码 table.