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