【问题标题】:Jpeg restart markersJpeg 重新启动标记
【发布时间】:2012-02-03 15:23:50
【问题描述】:

我制作了 jpeg 解码器,但我没有实现重启标记逻辑。这就是为什么我的程序不能处理某些图像的原因(例如用 Photoshop 保存的图像:文件->另存为->jpeg)。我想实现重启标记逻辑,但是没有详细的在线解释重启标记逻辑是如何工作的。请任何人都可以告诉我更多关于重启标记的信息,或者建议我在线资源,我可以在其中阅读更多相关信息。谢谢!

【问题讨论】:

    标签: file jpeg huffman-code decoder


    【解决方案1】:

    重启标记非常简单。它们被设计为允许在发生错误后重新同步。由于大多数 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
    

    更新:重新启动标记现在有一个新用途 - 允许多线程 JPEG 编码器和解码器。由于 MCU 的每个“条带”在每个重启间隔开始时都会重置其 DC 值并从字节边界开始,因此每个重启间隔可以由不同的线程独立编码或解码。编码器现在可以将任务任意划分为 N 个线程,然后将数据与重新启动标记“粘合”在一起。对于解码器来说,这并不容易。如果存在重新启动标记,则可以将每个间隔分配给不同的线程。如果不存在,您仍然可以执行一些预解码技巧将作业拆分为多个线程。

    【讨论】:

    • 能否告诉我更多的实现细节和逻辑?
    • 如果是交错的多分量图像呢?
    • @adikshit - 据我所知,无论配置如何,重启间隔都是指 MCU(最小编码单元)。对于 3 分量彩色图像 (Y/Cb/Cr),重新启动间隔是指 3 个 DCT 块的组。例如,100 的间隔意味着 300 个 DCT 块(100 个 MCU)。
    • 糟糕。你是对的,价值是一些 MCU。然而,尽管 MCU 尺寸是固定的(即 8x8 块等),但编码位数(在运行长度和霍夫曼编码之后)仍然因块而异,所以解码器如何知道从哪里开始(除非你的意思是首先解码整个流,然后并行执行 IDCT)。
    • @afuna 当然对于可变长度编码数据,您不知道每个 MCU 的确切字节偏移量,但由于所有标记字节都以 FF 开头,因此可以快速轻松地向前扫描以找到它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多