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