1

阅读以下博客文章。提到了一个所谓的“SHLD+BSR”霍夫曼解码器,然后将其进一步扩展为MOV, MOV, SHLD, OR, BSR, MOV, SHR, MOV, OR, ADD, ADC,但是我没有找到任何描述这种解码的参考或源代码。有谁知道是指什么解码方法?

4

1 回答 1

0

我还没有真正成功地理解这种解码霍夫曼代码的方法,但是这里的相关“内循环”包含这样的内容(稍微编辑以使 SHDL 和 BSR 明显):

uint32 posidx = pos >> 5;
uint32 code = src32[posidx];
uint32 extrabits = src32[posidx + 1];
SHLD(code, extrabits, pos);
code |= 1;
uint32 idx = BSR(code);
uint8 *p = (const uint8 *)(table->mBsrLenTable[idx] + 
                           2*(code >> table->mBsrShiftTable[idx]));
result = p[0];
pos += p[1];

这占了,MOV, MOV, SHLD, OR, BSR, MOV, SHR, MOV但后来我不确定了。我认为ADD指乘以 2,ADC实际上是添加的技巧,p[1]并且pos连接OR条目mBsrLenTable和其余代码,但这似乎顺序错误,然后OR将对应于源中的加法. 也许我不应该在午夜之后做这种事情..

您可能最好自己看一下来源,因为老实说,我的回答是无用的。我在这里得到它:sourceforge.net/projects/virtualdub/files/virtualdub-win/1.9.11.32842/VirtualDub-1.9.11-src.7z查找文件src\Meia\source\decode_huffyuv.cpp,它从表初始化开始,实际解码在宏调用DECODE,大约 200 行下来。

于 2012-08-03T22:26:29.667 回答