【问题标题】:SHLD+BSR decoder?SHLD+BSR解码器?
【发布时间】:2012-08-03 20:51:37
【问题描述】:

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

【问题讨论】:

  • 我刚刚花了半个小时查看了2个jpeg解码器的来源,但我没有找到任何相关的东西。
  • 好吧,我刚刚在 VirtualDub 的 HuffYuv 解码器中点击了 paydirt(参见 Meia\source\decode_huffyuv.cpp)。我会尽力理解它,以便回答您的​​问题。

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


【解决方案1】:

我还没有真正成功地理解这种解码霍夫曼代码的方法,但是这里的相关“内循环”包含类似这样的内容(稍微编辑以使 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 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2014-10-30
    • 2019-08-29
    • 1970-01-01
    • 2019-12-29
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多