私は現在、ロスレス JPEG (DNG、CR2 など) 用の OpenCL-Decoder に取り組んでいます。標準では、コンポーネントのレイアウト方法 (インターリーブと平面) にほとんど制限が課せられていません。これは、かなり柔軟性のない OpenCL カーネルと衝突します。
特に、コンポーネント識別子の概念は不必要に複雑に思えるので、正しく理解できているかどうか疑問に思っています:
SOF3 ヘッダー (フレーム 3 の開始、非差分、ハフマン コーディング、ロスレス (シーケンシャル)) には、各コンポーネントに関する情報が含まれています。それらは:
i
(暗黙的): コンポーネントのインデックスC_i
: コンポーネント識別子H_i
/V_i
: 水平/垂直サンプリング係数Tq_i
:量子化テーブル先セレクタ
各フレームは、少なくとも 1 つの色成分のエンコードされた画像データを含む複数のスキャンで構成されている場合があります。各 SOS ヘッダー (スキャンの開始) は、特定のスキャンの一部となるコンポーネントを宣言します。コンポーネントごとに、以前に宣言された識別子 ( C_i
) の 1 つが後方参照 ( Cs_j
、スキャン コンポーネント セレクター) として使用されます。標準にはほとんど制限がありません (B.2.3 スキャン ヘッダー構文)。
ルール 1:
それぞれがフレーム ヘッダーで指定され
Cs_j
た値の 1 つと一致C_i
し、スキャン ヘッダーの順序はフレーム ヘッダーの順序に従います。> 1 の場合Ns
、MCU 内のインターリーブされたコンポーネントの順序はCs_1
1 番目、Cs_2
2 番目などです。
ルール 2:
の値は~の値と
Cs_j
は異なります。Cs_1
Cs_j-1
私の質問は次のとおりです。
- ルール 1 は、コンポーネントの並べ替えを禁止します (たとえば、フレームでは R|G|B、スキャンでは B|G|R)。scan-R、scan-G、scan-B ではなく、scan-B、scan-G、scan-R の順序で、それぞれが単一のコンポーネント (平面構成) を含む複数のスキャンを作成することはできますか?
- スキャンでコンポーネントをスキップすることはできますか? たとえば、Frame で宣言された R|G|B の後に scan-R|B、次に scan_G が続きますか?
- スキャン内のコンポーネントが、フレーム ヘッダー内の
C_i
インデックス ( ) ではなく、識別子 ( ) によって参照されるのはなぜですか?i
R:C_0=255、G:C_1=3、B:C_2=250 を宣言することは本当に有効ですか?