SHLD+BSR decoder?
SHLD+BSR decoder?
阅读以下博客文章。提到了一个所谓的"SHLD+BSR"霍夫曼解码器,然后将其进一步扩展到MOV, MOV, SHLD, OR, BSR, MOV, SHR, MOV, OR, ADD, ADC
,但我没有找到任何描述这种解码的参考或源代码。有人知道这是指什么解码方法吗?
我还没有真正成功地理解这种解码huffman代码的方法,但这里的相关"内部循环"包含这样的内容(经过轻微编辑以使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.19.11.32842/virtualdub--1.9.11-src.7z查找文件srcMeiasourcedecode_huffyuv.cpp
,它从初始化表开始,实际解码在一个名为DECODE
的宏中,大约200行。