我制作了 jpeg 解码器,但没有实现重启标记逻辑。这就是为什么我的程序无法处理某些图像(例如使用 Photoshop 保存的图像:文件->另存为->jpeg)的原因。我想实现重启标记逻辑,但是网上没有详细的解释重启标记逻辑如何工作。请任何人告诉我有关重新启动标记的更多信息,或者建议我在线资源,我可以在其中阅读更多相关信息。谢谢!
重新启动标记非常简单。它们的设计目的是允许在发生错误后重新同步。由于大多数 JPEG 图像都是通过无差错通道传输的,因此很少需要它们。重新启动间隔由 FFDD 标记定义为 2 字节数字。这表明重启标记之间有多少个 MCU。当遇到重新启动标记 (FFD0-FFD7) 时,将 DC 值 (Y,Cr,Cb) 重置为 0,并且比特流在字节边界上开始(在 FFDx 之后)。只需在解码图像时一遍又一遍地计算重新启动间隔即可。重新启动标记值将从 FFD0 递增到 FFD7,然后从 FFD0 重新开始。标记值本身并不是非常重要,但它可以指示是否丢失了大块数据。这是我如何在解码器中执行此操作的示例。我扔掉了比特流阅读器中的重启标记。
iRestartCount = iRestartInterval;
for (y=0; y<Height_in_MCUs; y++)
{
for (x=0; x<Width_in_MCUs; x++)
{
<decode an MCU>
if (iRestartInterval) // if there is a restart interval defined
{
if (--iRestartCount == 0)
{
iRestartCount = iRestartInterval; // reset restart inverval counter
iDCPred0 = iDCPred1 = iDCPred2 = 0; // reset DC predictors
if (*iBit & 7) // adjust bitstream to start on the next byte boundary
{
*iBit += (8 - (*iBit & 7));
}
} // if restart interval expired
} // if restart interval defined
} // for x
} // for y
Update:重新启动标记现在有一个新用途 - 允许多线程 JPEG 编码器和解码器。由于 MCU 的每个“条带”的 DC 值在每个重启间隔开始时重置,并在字节边界上开始,因此每个重启间隔可以由不同的线程独立编码或解码。编码器现在可以将任务任意划分为 N 个线程,然后将数据与重新启动标记“粘合”在一起。对于解码器来说,事情就没那么容易了。如果存在重新启动标记,则每个间隔可以分配给不同的线程。如果不存在,您仍然可以执行一些预解码技巧,将作业拆分为多个线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)