オペレーター Library: Compression
このオペレーターは、8ビットグレースケール画像のJPEG圧縮を実行します。JPEGベースラインアルゴリズムを使用します。オペレーターの出力はハフマンストリームです。オプションで、JPEGヘッダーを出力に含めることができます(パラメーター化可能)。ヘッダーを含める場合、出力フォーマットはJFIF(JPEG File Interchange Format)バージョン1.2となります。
圧縮率(ひいては出力ストリームサイズ)は、次の2つの要因によって決まります。
-
実行時に変更可能な、選択された量子化テーブル。
-
入力画像。
オペレーター JPEG_Encoder は、リンクパラメータ設定で指定されたフル入力データレートを処理できます。入力 Parallelism を介してスループットレートを定義できます。なお、 Parallelism を高くすると、FPGAリソースの消費量が増加することにご注意ください。
最大画像高さは65,535ピクセルです。画像高さが8の倍数でない場合、オペレーターは内部でダミーラインを追加します。この動作により、全体の入力データレートが低下します。
このオペレーターでは、量子化テーブルを定義することができます。テーブルの設定には、次の2つのオプションがあります。
-
Quality 値(パーセント)に基づいて、量子化テーブルを自動的に計算できます。計算には、標準輝度量子化テーブル(下記参照)が使用されます。自動計算を設定するには、パラメータ Quality (パーセント)を使用します。自動計算は、オペレーターのデフォルト設定です。
-
または、量子化テーブルの各値を個別に設定することもできます。値を入力するには、パラメータ LuminanceQuantization を使用します。この場合、パラメータ Quality は自動的に無効化され、値が -1 に設定されます。
標準輝度量子化テーブル(デフォルト設定)は次のとおりです。
デフォルトモード(つまり、パラメータ Quality によって設定された標準輝度量子化テーブルからの自動計算)では、量子化テーブルは次の式で計算されます。
上記のように、オペレーターの出力はエンコードされた画像データのハフマンストリームです。ハフマン符号化には、DCおよびAC係数の標準輝度テーブルが使用されます。これらのテーブルは固定されており、W. P. PennbakerおよびJ. L. Mitchell著『JPEG Still Image Data Compression Standard』(Van Nostrand Rheinhold、1993年)などの文献から取得されています。エンコーダーによって生成されるハフマンストリームには、パラメータ IncludeHeader が YES に設定されている場合、JPEGヘッダーが含まれます。生成されたデータストリームは、複数のバイト(8ビットブロック)のパラレル出力で構成され、 Parallelism はスループット要件から自動的に導出されます。
Operator Restrictions
-
このオペレーターは、空の画像、つまりピクセルを持たない画像をサポートしていません。
-
行の長さが異なる入力画像は許可されません。
-
このオペレーターには、入力 Parallelism に依存する最小入力画像幅があります。最小入力画像幅は、少なくとも入力 Parallelism の2倍です。最小入力画像幅は次のように計算されます。
-
入力 Parallelism を基準にして、入力 Parallelism 以上である最初の8の倍数を特定します。
-
この8の倍数に値 1 を加算します。
-
ステップ2の結果を基準にして、入力画像幅を入力 Parallelism の倍数にする必要があるため、ステップ2の結果より大きい input parallelism の最初の倍数を特定します。
ステップ3の結果が、オペレーターの最小入力画像幅となります。
たとえば、入力 Parallelism が 4 の場合、最小入力画像幅は 12 です。
入力 Parallelism が 12 の場合、最小入力画像幅は 24 です。
-
![]() |
オペータースループットの最適化 |
|---|---|
|
入力 Parallelism が 8 より大きい場合、データスループットは入力画像のサイズに依存します。最大データスループットは、次の画像サイズ(OptimalSize)で達成できます。
内部的に、オペレーターは常に 8 の倍数である Parallelism を使用します。入力される Parallelism に応じて、内部の Parallelism 変換によって帯域幅の損失の一部を補うことができます。帯域幅の損失は、フレームの終了時にのみ発生します。 |
圧縮された画像データのサイズは予測できないため、圧縮フレームの最後の出力データバイトは、出力の Parallelism に整列せずに発生する可能性があります。その結果、フレームの最後のデータベクターには、ランダムなダミー値が含まれる可能性があります。フレームの実際の終了を示すために、JPEG 標準で定義されている EOI(End of Image)マーカーが使用されます。EOI マーカーは 2 バイトで構成されます。各フレームの上から 2 番目のバイトは 0xFF であり、各フレームの最後のバイトは 0xD9 です。
画像スループットレート(帯域幅)を最適化するために、オペレーターは、画像データがオペレーターの入力に到着する前であっても、ヘッダー生成が有効になるとすぐにヘッダーを出力します。このようにして、ヘッダーは事前に転送されるため、ヘッダーデータの転送が画像データの転送を中断することはありません。この方式の欠点は、オペレーターの出力転送が実際の画像データ転送よりも早く開始されることです。これにより、特定の状況下で問題が発生する可能性があります:
-
JPEG_Encoder の直後に SourceSelector オペレーターを使用する: SourceSelector オペレーターは、ヘッダーデータを取得するとすぐに、部分的に処理されたフレームを登録します。したがって、SourceSelector が JPEG_Encoder から画像データを取得するように切り替えられている場合、未完了のフレームを常に検知するため、SourceSelector を他のソースに切り替えることはできません。さらに、ヘッダー生成が有効になっていて、SourceSelector が別のソースから JPEG_Encoder チャネルに切り替わると、最初の画像が失われます。
-
レイテンシを測定するには、(FrameStartToSignal および SignalToDelay の代わりに)FrameEndToSignal オペレーターを使用します。
InfiniteSource によるオーバーフロー管理
ペインの InfiniteSource モードでは、 JPEG_Encoder モジュールまたは後続のモジュールのいずれかが帯域幅を処理できないため、画像が失われたり破損したりする可能性があります。部分画像がすでにオペレーターによって受け入れられている間にオーバーフローが発生した場合、それ以降に入力されたすべての画像データは破棄され、オペレーター内の切り捨てられた画像が切り捨てられ、部分的な出力画像が生成されます。フレームの開始が到着したときにオペレーターがオーバーフロー状態にある場合、フレーム全体が破棄され、フレームが失われます。切り捨てられたまたは失われたフレームごとに、VA イベントが生成されます(TruncatedEvent および LostEvent)。 JPEG_Encoder イベントは、それぞれ 2 バイトの 3 つのパケットで構成されます。最初の 2 つの VA イベントパケットはフレーム ID を構成します。これは、 JPEG_Encoder 入力に到着する各フレームの Counter です。フレーム ID は、失われたまたは切り捨てられた正確なフレームを特定します。3 番目のパケットは、発生したエラーの種類を示します。ビット 0 は、フレームが失われた(Bit0 = 1)か切り捨てられた(Bit0 = 0)かを示します。3 番目のパケットの他の 15 ビットは、イベントが失われた場合にのみ使用されます。これは、CPU に対してイベントの発生が速すぎる場合にのみ発生する可能性があります。3 番目のパケットの Bit1 は、 TruncatedEvent の消失が発生したことを示し、同じパケットの Bit2 は、 LostEvent の消失が発生したことを示します。さらに、 LostEvents が失われた場合、Bit[15:3] は失われた LostEvents の数を保持する Counter を形成します。Counter 値がゼロの場合、消失LostEvent-Counter JPEG_Encoder がオーバーフローしています。切り捨てられたフレームは LostEvents.
| Quality | |
|---|---|
| タイプ | static/dynamic write parameter |
| Default | 50.00 |
| 範囲 | [1.00〜100.00 %]、{-1}、ステップサイズ = 0.01% |
|
このパラメーターを使用して、JPEG圧縮のQualityを変更できます。量子化マトリックスは、上記の式からパーセンテージ値に基づいて決定されます。決定された量子化値は、パラメーター quantization_matrix から読み取ることができます。このパラメーターは動的であり、アプレットのアイドル時にのみ変更する必要があります。 1から100までの間のQuality設定を定義できます。このパラメーターに書き込むと、パラメーター LuminanceQuantization によって行われた量子化マトリックスの手動変更が上書きされます。Quality から -1 が読み取られた場合は、量子化マトリックスの手動変更が行われています。 Qualityパラメーターは、エンコーダーの圧縮率を定義するための主要なソースです。輝度テーブルは指定されたQualityから自動計算され、読み戻すことができます。ただし、輝度テーブルを直接変更することも可能です。これが発生した場合、Qualityパラメーターは、パラメーターが無効になったこと、およびテーブルの手動上書きモードが使用されていることを示すために、自動的に -1 に変更されます。リソース使用量を最適化したい場合、Qualityおよび量子化テーブルを静的モードに設定できます。静的変更と動的変更は、Qualityパラメーターに対してのみ実行できます。量子化テーブルの設定は、Qualityタイプに自動的に従うため、手動で上書きすることはできません。Qualityが静的に設定されている場合、オペレーターはQuality設定から出力Parallelismを決定します。ほとんどの場合、出力Parallelismは動的モードと比較して削減され、実行時に圧縮率を変更する柔軟性を犠牲にして、大幅なFPGAリソースの削減を意味する可能性があります。 |
|
| LuminanceQuantization | |
|---|---|
| タイプ | Qualityタイプ(動的または静的)の書き込みパラメーターに従います |
| Default | なし |
| 範囲 | [1〜255] |
|
範囲 [1.00〜100.00] のQualityに対して自動計算されます。手動で設定した場合、Qualityは無効化されて -1 になります。 |
|
| IncludeHeader | |
|---|---|
| タイプ | static write parameter |
| Default | YES |
| 範囲 | [YES,NO] |
|
JPEGヘッダーはデフォルトで圧縮ストリームに含まれます。ただし、この機能を無効にすることもできます。パラメーター IncludeHeader を NO に設定すると、JPEGパラメーター ImageHeight および ImageWidth は非アクティブになります。パラメーター IncludeHeader を YES に設定すると、ヘッダーが含まれ、ヘッダーパラメーターを静的にするか動的にする必要があるかを決定できます。静的に設定した場合、画像幅と画像高さの値はヘッダーに静的に埋め込まれ、入力画像のサイズに関係なく変更できません。動的に設定した場合、実行時に画像幅と画像高さの値を変更できます。これらのヘッダーパラメーターは、入力画像サイズに自動的に更新されないことに注意してください。実行時にサイズが動的に変化する画像でオペレーターを使用する場合は、生成されたヘッダーを後からパッチする必要があります。ImageHeight と ImageWidth の両方を「static」に設定すると、FPGAリソースの使用量をわずかに削減できます。 |
|
| ImageWidth | |
|---|---|
| タイプ | static/dynamic write parameter |
| Default | 1024 |
| 範囲 | 1〜2^16-1 |
|
このパラメーターは、パラメーター IncludeHeader が YES に設定されている場合にのみ使用できます。 パラメーター ImageWidth は、パラメーター IncludeHeader で説明されているように、JPEG画像ヘッダーを生成するためだけに使用されます。 |
|
| ImageHeight | |
|---|---|
| タイプ | static/dynamic write parameter |
| Default | 1024 |
| 範囲 | 1〜2^16-1 |
|
このパラメーターは、パラメーター IncludeHeader が YES に設定されている場合にのみ使用できます。 パラメーター ImageHeight は、パラメーター IncludeHeader で説明されているように、JPEG画像ヘッダーを生成するためだけに使用されます。 |
|
| InfiniteSource | |
|---|---|
| タイプ | static write parameter |
| Default | DISABLED |
| 範囲 | {ENABLED, DISABLED} |
|
オペレーターは、カメラオペレーターの直後にプラグインできます。この場合、InfiniteSource パラメーターを ENABLED に設定する必要があります。その後、オペレーターはアクティブなオーバーフロー管理を実行し、VAイベントシステムを介してソフトウェアにオーバーフロー状態を報告します。オーバーフローは、オペレーターの背後にあるシンクが送信を停止/一時停止するか、入力画像の高さが8行の倍数ではないという2つの状況でのみ発生します。後者の場合、JPEG規格で要求されているように、オペレーターは不足している行をパディングして最後の行のJPEGブロックを完成させる必要があります。 詳細については、「Infinite Sources / Connecting Cameras」を参照してください。 |
|
オペレーター JPEG_Encoder の使用法を以下の例に示します。
-
「オペレーター JPEG_Encoder を使用したJPEG圧縮」
例 - オペレーター JPEG_Encoder の使用法を示す簡単な例。
次のハフマン DC および AC 係数が使用されます。
typedef char DCHuffTableType[12][17]; // Huffman table for
luminance DC coefficients DCHuffTableType Lum_DC_HuffmanTable= { "00", "010", "011", "100",
"101", "110", "1110", "11110", "111110", "1111110", "11111110", "111111110" }; typedef char
ACHuffTableType[16][11][17]; // Huffman table for luminance AC coefficients ACHuffTableType
Lum_AC_HuffmanTable= { { //Run == 0 "1010",//EOB "00", "01", "100", "1011", "11010",
"1111000", "11111000", "1111110110", "1111111110000010", "1111111110000011" }, { //Run == 1
"1010",//EOB "1100", "11011", "1111001", "111110110", "11111110110", "1111111110000100",
"1111111110000101", "1111111110000110", "1111111110000111", "1111111110001000" }, { //Run == 2
"1010",//EOB "11100", "11111001", "1111110111", "111111110100", "1111111110001001",
"1111111110001010", "1111111110001011", "1111111110001100", "1111111110001101",
"1111111110001110" }, { //Run == 3 "1010",//EOB "111010", "111110111", "111111110101",
"1111111110001111", "1111111110010000", "1111111110010001", "1111111110010010",
"1111111110010011", "1111111110010100", "1111111110010101" }, { //Run == 4 "1010",//EOB
"111011", "1111111000", "1111111110010110", "1111111110010111", "1111111110011000",
"1111111110011001", "1111111110011010", "1111111110011011", "1111111110011100",
"1111111110011101", }, { //Run == 5 "1010",//EOB "1111010", "11111110111", "1111111110011110",
"1111111110011111", "1111111110100000", "1111111110100001", "1111111110100010",
"1111111110100011", "1111111110100100", "1111111110100101" }, { //Run == 6 "1010",//EOB
"1111011", "111111110110", "1111111110100110", "1111111110100111", "1111111110101000",
"1111111110101001", "1111111110101010", "1111111110101011", "1111111110101100",
"1111111110101101" }, { //Run == 7 "1010",//EOB "11111010", "111111110111",
"1111111110101110", "1111111110101111", "1111111110110000", "1111111110110001",
"1111111110110010", "1111111110110011", "1111111110110100", "1111111110110101", }, { //Run ==
8 "1010",//EOB "111111000", "111111111000000", "1111111110110110", "1111111110110111",
"1111111110111000", "1111111110111001", "1111111110111010", "1111111110111011",
"1111111110111100", "1111111110111101" }, { //Run == 9 "1010",//EOB "111111001",
"1111111110111110", "1111111110111111", "1111111111000000", "1111111111000001",
"1111111111000010", "1111111111000011", "1111111111000100", "1111111111000101",
"1111111111000110" }, { //Run == 0xA "1010",//EOB "111111010", "1111111111000111",
"1111111111001000", "1111111111001001", "1111111111001010", "1111111111001011",
"1111111111001100", "1111111111001101", "1111111111001110", "1111111111001111" }, { //Run ==
0xB "1010",//EOB "1111111001", "1111111111010000", "1111111111010001", "1111111111010010",
"1111111111010011", "1111111111010100", "1111111111010101", "1111111111010110",
"1111111111010111", "1111111111011000" }, { //Run == 0xC "1010",//EOB "1111111010",
"1111111111011001", "1111111111011010", "1111111111011011", "1111111111011100",
"1111111111011101", "1111111111011110", "1111111111011111", "1111111111100000",
"1111111111100001" }, { //Run == 0xD "1010",//EOB "11111111000", "1111111111100010",
"1111111111100011", "1111111111100100", "1111111111100101", "1111111111100110",
"1111111111100111", "1111111111101000", "1111111111101001", "1111111111101010" }, { //Run ==
0xE "1010",//EOB "1111111111101011", "1111111111101100", "1111111111101101",
"1111111111101110", "1111111111101111", "1111111111110000", "1111111111110001",
"1111111111110010", "1111111111110011", "1111111111110100" }, { //Run == 0xF "11111111001",
//ZRL "1111111111110101", "1111111111110110", "1111111111110111", "1111111111111000",
"1111111111111001", "1111111111111010", "1111111111111011", "1111111111111100",
"1111111111111101", "1111111111111110" } }; 

![[ヒント]](../common/images/admon/tip.png)



前へ

