jpegデコーダーを作成しましたが、リスタートマーカーロジックを実装していません。これが、私のプログラムが一部の画像(たとえば、Photoshopで保存された画像:[ファイル]->[名前を付けて保存]->[jpeg])で機能しない理由です。リスタートマーカーロジックを実装したいのですが、リスタートマーカーロジックがどのように機能するかについての詳細なオンライン説明がありません。誰かがリスタートマーカーについてもっと教えてくれますか、それについてもっと読むことができるオンラインリソースを私に提案してください。どうも!
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スレッドに分割し、データを再起動マーカーで「接着」できるようになりました。デコーダーの場合、それはそれほど簡単ではありません。再起動マーカーが存在する場合は、各間隔を異なるスレッドに割り当てることができます。存在しない場合でも、いくつかの事前デコードのトリックを実行して、ジョブを複数のスレッドに分割できます。