2012-01-05 35 views
6

jpegデコーダを作ったが、リスタートマーカロジックを実装しなかった。それが私のプログラムがいくつかの画像(例えば、Photoshopで保存された画像:File-> Save As-> jpeg)上で動作しない理由です。私はリスタートマーカロジックを実装したいが、リスタートマーカロジックがどのように動作するかについての詳細なオンライン説明はない。誰でも私にリスタートマーカーの詳細を教えてもらえますか、それについてもっと読むことができるオンラインリソースを私に示唆してください。どうも!Jpegリスタートマーカ

答えて

13

再起動マーカーは非常に簡単です。エラー後に再同期化できるように設計されています。ほとんどの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個のスレッドに任意に分割し、再スタートマーカーとともにデータを「接着」することができます。デコーダにとっては、それほど簡単ではありません。再起動マーカーが存在する場合は、各インターバルを別のスレッドに割り当てることができます。存在しない場合でも、ジョブを複数のスレッドに分割するためのプリデコードトリックを行うことができます。

+0

実装の詳細とロジックを教えてください。 – MrD

+0

インターリーブ付きのマルチコンポーネント画像の場合はどうなりますか? – adikshit

+0

@adikshit - 私が見た限りでは、どのような構成でも、再起動間隔はMCU(最小符号化単位)を参照します。 3成分カラー画像(Y/Cb/Cr)の場合、再開間隔は3つのDCTブロックのグループを参照します。たとえば、100の間隔は300個のDCTブロック(100個のMCU)を意味します。 – BitBank

関連する問題