SHLD + BSR解码器?

时间:2012-08-03 20:51:38

标签: c++ c assembly decoding huffman-code

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

1 个答案:

答案 0 :(得分: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和{{1}的技巧加入OR条目和其余代码,但这似乎是错误的顺序,然后mBsrLenTable将与源中的添加相对应。也许我不应该在午夜之后做这种事情。

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