天天看點

JPEG圖像編碼詳解-轉載

原文位址:http://blog.chinaunix.net/uid-12567959-id-165693.html

Annex B

Compressed data formats

(This annex forms an integral part of this Recommendation | International Standard)

T本附錄介紹三種壓縮資料格式:

a) 交換格式,在B.2和B.3中介紹;

b) 壓縮圖像資料的縮略格式,在B.4中介紹;

c) 表規範資料的縮略格式,在B.5中介紹。

B.1  描述這些格式的構成部分。B.1.3和B.1.4給出了格式規範中使用到的插圖和符号的約定。

B.1 壓縮資料規範的基本層面

在結構上,壓縮資料格式包含一個由參數、标記和熵編碼資料段組成的有序集合。參數和标記往往又形成标記段。由于所有這些組成部分是由位元組對齊的代碼表示的,是以每一個壓縮資料格式由一個8-bits位元組的有序序列組成。對于每一個位元組,都定義了一個最高有效位(MSB)和一個最低有效位(LSB)。

B.1.1 組成部分

這個小節給出了壓縮資料格式每一個部分的概述。

B.1.1.1 參數

參數是整數,其值特定于具體的編碼過程,源圖像的特點,和應用程式可選的其他特性。參數由4-bit,1位元組或2位元組的代碼指派。除了某些可選的參數組,參數都編碼重要的資訊,如果沒有這些資訊,解碼過程就無法正确的重建圖像。

一個參數的代碼應該是一個無符号整數,該整數具有以位為機關的規定長度,并具有特定的參數值。

對于長度2位元組(16位)的參數,則在壓縮資料位元組的有序序列中,最高位位元組應該在前。長度為4位的參數成對出現,并且這一對參數應被編碼為一個單獨的位元組。參數對中的第一個4-bit參數應該占據位元組的高4位。對于任何的16-,8-,或4-bit參數,MSB應該在前,LSB在後。

B.1.1.2 标記

标記用于辨別壓縮資料格式的各個不同結構部分。大多數标記開啟了一個标記段,而标記段則包含了一個相關的參數組。所有的标記均被配置設定一個2位元組的代碼:一個X’FF位元組後跟一個不為0或X’FF’位元組(參見表B.1)。所有的标記前面可以有一些可選的代碼為X’FF的填充位元組。

注意 – 由于這種特别的代碼配置設定結構,是以标記使解碼器可以在不解碼圖像資料的其他段的情況下,而解析壓縮資料并定位它的各個部分。

B.1.1.3 标記配置設定

所有的标記均被配置設定一個兩位元組的代碼:一個X’FF’,及其後跟着的一個不為0或X’FF的第二個位元組。每一個定義的标記的第二個位元組在表B.1中指定。一個星号(*)表示一個标記是獨立的,即,它不是一個标記段的開始。

JPEG圖像編碼詳解-轉載
JPEG圖像編碼詳解-轉載

Table B.1 – Marker code assignments

B.1.1.4 标記段

 一個标記段由一個标記和該标記後面跟着的一個相關參數的序列組成。标記段中的第一個參數是2位元組的長度參數。該長度參數編碼了标記段以位元組為機關的長度,包括長度參數,但不包括2位元組的标記。以SOF和SOS标記碼辨別的标記段被稱為頭:分别為幀頭和掃描頭。

B.1.1.5  熵編碼資料段

一個熵編碼資料段包含了一個熵編碼過程的輸出。無論熵編碼過程使用的是霍夫曼編碼還是算術編碼,它都由整數個自己組成。

注意

1按下面方法執行以使熵編碼資料段具有整數個位元組:對于霍夫曼編碼,如果需要,則在壓縮資料的最後填充值為1的位值來補齊段的最後一個位元組。對于算術編碼,位元組對齊在終止熵編碼段的過程中進行(參見D.1.8)。

2 為了確定一個标記不會出現在一個熵編碼段中,則任何一個由霍夫曼編碼或算術編碼産生的X’FF’位元組,或如上面注意1中所述,由值為1的位填充而得的一個X’FF’位元組,其後要緊跟一個“填塞”0位元組(參見D.1.6和F.1.2.3)。

B.1.2 文法

B.2和B.3中詳述了交換格式的文法。就本規範的目的,文法規範的組成為:

– 要求的标記,參數和熵編碼段的順序;

– 可選的和有條件的組成部分的識别;

– 每一個标記和參數的名稱、符号和識别;

– 每一個參數的允許值;

– 以上各條特定于各種編碼過程的所有限制。

各組成部分的次序及可選的和有條件的部分的識别在文法插圖B.2和B.3中示出。名稱、符号、定義、允許值、條件和限制很快将在下面的各個文法插圖中示出。

B.1.3 文法插圖約定

B.2和B.3中的文法插圖是交換格式規範的一部分。在圖B.1中闡明的,下面的約定,應用于這些插圖:

– 參數/标記訓示符:一個細線的盒子包圍一個标記或一個單獨的參數;

– 段訓示符:一個細線的盒子包圍一個标記段、一個熵編碼段或他們的結合;

– 參數長度訓示符:一個細線的盒子的寬度與标記的參數長度(4,8或16位,如圖B.1中的E,B和D所示)或它包圍的參數成比例;多個細線包圍的盒子的寬度是無意義的;

– 可選的/有條件的訓示符:方括号标明,在壓縮資料中,一個标記段或标記隻是可選的或有條件的。

– 次序:交換格式中,圖中所示的參數或标記都先于其右邊所示的參數或标記,并跟在它左邊的參數後面。

–    熵編碼資料訓示符:尖括号标明,其包圍的内容是已經經過了熵編碼的。

JPEG圖像編碼詳解-轉載

B.1.4 符号,代碼長度和值約定

在下面的B.2和B.3中的每一個文法插圖,圖中所示的每一個标記和參數符号、名稱和定義都描述過了。對于每一個參數,長度和允許值也在表格中詳述。

下面的約定應用于标記和參數的符号:

– 所有的标記符号有三個大寫字母,而某些則還具有下标。如:SOI,SOFn;

– 所有的參數符号有一個大寫字母;某些還具有一個小寫字母和一些下标。如:Y,Nf,Hi,Tqi。

B.2 普通的順序和增量文法

這一章說明了應用于所有的編碼過程的交換格式文法,包括基于DCT的順序操作模式,基于DCT的增量操作模式和無損操作模式

B.2.1 高層次文法

圖B.2說明了用于本規範中詳述的所有的非層次式(non-hierarchical)編碼過程的交換格式的高層次組成部分的順序。

JPEG圖像編碼詳解-轉載

圖B.2所示的三個标記定義如下:

SOI: 圖像開始标記 – 出現于交換格式或縮寫格式中,标記一幅壓縮圖像的開始。

EOI: 圖像結束标記 - 出現于交換格式或縮寫格式中,标記一幅壓縮圖像的結束。

RSTm: 重新開始标記 – 隻有重新開始使能時,放在熵編碼段之間的一個有條件的标記。有8個唯一的重新開始标記(m = 0 - 7),他們從0到7順序的重複,每一個掃描的以0開始,以此來提供一個模8的重新開始間隔計數。

圖B.2的最頂層說明了非層次式交換格式應該以SOI标記作為開始,包含一個幀,并以一個EOI标記結束。

圖B.2的第二層說明一個幀應該以一個幀頭開始并包含一個或多個掃描。一個幀頭前面也許有一個或多個表規範或B.2.4中說明的多種标記段。如果有一個DNL段(參見B.2.5),那麼它應該緊跟在第一掃描的後面。

對于基于DCT的順序操作模式和無損過程,每一個掃描應該包含一到四個圖像成分。如果一個掃描中2到4個成分,那麼,它們應該在掃描中交替出現。對于基于DCT的增進式過程,每一個圖像成分隻是部分的包含于任何一個掃描中。隻有成分(隻包含DC系數資料)的第一個掃描可能是交替的。

圖B.2的第三層說明了一個掃描應該以一個掃描頭開始,并包含一個或多個熵編碼資料段。每一個掃描頭前面可能有一個或多個表規範或多種标記段。如果重新開始沒有被使能,則應該隻有一個熵編碼段(标記為“last”的那個),并且沒有重新開始标記。如果使能了重新開始,則熵編碼段有圖像的大小和DRI定義。這種情況下,一個重新開始标記應該跟在除了最後一個熵編碼段之外的熵編碼段之後。

圖B.2的第四層說明每一個熵編碼段由一系列熵編碼MCUs組成。如果使能了重新開始,并且重新開始間隔被定義為Ri,則除了最後一個之外的每一個熵編碼段應該包含Ri個MCUs,最後一個應該包含掃描的剩餘的MCUs

圖B.2說明了表規範可能出現的位置。然而,這裡的規範特指交換格式應該包含的用于解碼壓縮圖像的所有的表規範資料。是以,需要的表規範資料應該出現于一個或多個允許的位置。

B.2.2 幀頭文法

圖B.3說明了應該出現在一個幀的開始處的幀頭。這個頭說明了源圖像特性(參見A.1),包括包含于幀中的成分,每一個成分的采樣因子,以及恢複每一個成分所使用的目标量化表。

JPEG圖像編碼詳解-轉載

圖B.3中所示的标記和參數定義如下。每一個參數的大小和允許的值由表B.2給出。在表B.2(以及随後類似的表)中,可選的值由逗号隔開(e.g. 8, 12),範圍值的邊界由破折号隔開(e.g. 0 - 3)。

SOFn: 幀标記的開始 – 标記幀參數的開始。下标n辨別編碼過程為基線順序編碼,擴充順序編碼,增量式編碼,或無損編碼,也辨別使用了哪個熵編碼過程。

SOF0: 基線DCT

SOF1: 擴充順序DCT,霍夫曼編碼

SOF2: 增量式DCT,霍夫曼編碼

SOF3: 無損(順序)的,霍夫曼編碼

SOF9: 擴充順序DCT, 算術編碼

SOF10: 增量式DCT, 算術編碼

SOF11: 無損(順序)的,算術編碼

Lf:  幀頭的長度 – 說明了圖B.3中所示的幀頭的長度(參見B.1.1.4)。

P:  采樣精度 – 以位為機關說明了幀中的成分的采樣精度。

Y:  行數 – 說明了源圖像的最大行數。它應該等于成分中具有最大垂直采樣數的成分的行數(參見A.1.1)。值為0則表明行數應該由DNL标記定義,并且參數在第一個掃描的結尾(參見B.2.5)。

X:  每一行的采樣數 - 說明了源圖像中每一行的最大采樣數。它應該等于成分中具有最大的水準采樣數的成分的每一行的采樣數。(參見A.1.1).

Nf:  幀中的圖像成分數 – 指定了幀中源圖像的成分數。Nf的值應該與出現在幀頭中幀成分規範參數(Ci, Hi, Vi,and Tqi)的個數。

Ci:  成分辨別符 – 順序的為幀成分規範參數中的第i個參數配置設定一個唯一的标記。這些值應該被用于掃描頭中來識别掃描中的成分Ci應該不同于C1到Ci − 1。

Hi:  水準采樣因子 – 說明了成分的水準尺寸和最大的圖像尺寸X之間的關系(參見A.1.1);當一個掃描中編碼了多于一個成分時,也指定了每一MCU中成分Ci的水準資料單元數。

Vi:  垂直采樣因子 – 說明了成分的垂直尺寸和最大的圖像尺寸Y之間的關系(參見A.1.1);當一個掃描中編碼了多于一個成分時,也指定了每一MCU中成分Ci的垂直資料單元數。

Tqi:  量化表目的選擇子 – 指定了用于恢複成分Ci而對DCT系數反量化的四個可能的量化表中的一個。如果解碼過程使用反量化例程,則在解碼器已經準備好去解碼掃描中包含的成分Ci時,這個表應該已經被安裝在了目标位置。目标位置不應該被重新指定,或者改變它的内容,直到包含Ci的所有掃描均被解碼完成。

JPEG圖像編碼詳解-轉載

B.2.3 掃描頭文法

圖B.4詳細說明了應該出現在一個掃描的開始位置的掃描頭。這個頭指定掃描中包含哪些成分,恢複每一個成分時使用的熵編碼表,和(用于增量式DCT)掃描中包含哪些量化後的DCT系數資料。對于無損過程,掃描參數指定預測值和點轉換。

注意 – 如果掃描中隻有一個圖像成分,根據定義,那個成分時非交替的。如果掃描中有多個圖像成分,根據定義,這些成分要交替出現。

JPEG圖像編碼詳解-轉載

圖B.4中所示的标記和參數定義如下。每一個參數大小和允許的值由表B.3給出。

SOS:  掃描标記的開始 – 标記掃描參數的開始。

Ls:  掃描頭的長度 – 說明了圖B.4中所示的掃描頭的長度(參見B.1.1.4)。

Ns: 掃描中圖象成分的個數 – 說明了掃描中源圖像成分的個數。Ns的值應該等于出現于掃描頭中的掃描成分規範參數(Csj,Tdj,和Taj)的個數。

Csj:  掃描成分選擇子 – 選擇幀參數中詳述的Nf個圖像成分中的哪一個應該是掃描中的第j個成分。每一個Csj應該與幀頭中詳述的Ci值中的一個相對應,并且順序應該與在幀頭中的相同。如果Ns > 1,則MCU中交替的成分的順序為Cs1第一,Cs2第二,等等。Ns > 1,則以下限制應該被施加于掃描中包含的圖像成分上:

JPEG圖像編碼詳解-轉載

其中Hj和Vj是掃描成分j的水準和垂直采樣因子。在幀頭中這些采樣因子被指定給成分i,其中i是幀成分規範索引,幀成分辨別Ci對應于掃描成分選擇子Csj。

例如,考慮一幅圖像具有3個成分,最大尺寸為512行,每行512個采樣值,并且采樣因子如下:

JPEG圖像編碼詳解-轉載

然後求和

JPEG圖像編碼詳解-轉載

Csj的值應該不同于Cs1到Csj–1的值。

Tdj:  DC熵編碼表目标選擇子 –指定四個可能的DC熵編碼表中的一個,以滿足恢複成分Csj的DC系數的需要。當解碼器準備好解碼目前的掃描時,DC熵編碼表應該已經被安裝在了這個目标位置(參見B.2.4.2和B.2.4.3)。對于無損過程,這個參數指定了熵編碼表。

Taj:  AC熵編碼表目标選擇子 - 指定四個可能的AC熵編碼表中的一個,以滿足恢複成分Csj的AC系數的需要。解碼器準備好解碼目前的掃描時,被選擇的AC熵編碼表應該已經被安裝在了這個目标位置(參見B.2.4.2和B.2.4.3)。對于無損過程,這個參數為0.

Ss:  頻譜或預測值選擇的開始 – 在DCT操作模式中,這個參數指定了應該被編碼進掃描中的每一個zig-zag序列的塊的第一個DCT系數。對于順序DCT過程,這個參數應該被設為0。在無損操作模式中,這個參數用于選擇預測值。

Se:  頻譜選擇的結束 – 指定應該被編碼進掃描中的每一個zig-zag序列的塊的最後一個DCT系數。對于順序DCT過程,這個參數應該被設為63。在無損操作模式中,這個參數無意義,它應該被設為0.

Ah:  逐次逼近位位置高 – 這個參數為由Ss和Se說明的系數的頻帶指定了用于前掃描的點轉換(比如,在前掃描中逐次逼近位位置低)。對于系數的每一個頻帶的第一個掃描,這個參數應被設為0。在無損操作模式中,這個參數無意義,它應該被設為0.

Al:  逐次逼近位位置低或點轉換 – 在DCT操作模式中,這個參數指定點轉換,比如,位位置低,在編碼由Ss和Se說明的系數的頻帶前使用。對于順序DCT過程,這個參數應被設為0。在無損操作模式中,這個參數指定點轉換,Pt。

熵編碼表目标選擇子,Tdj和Taj,指定霍夫曼表(幀中使用霍夫曼編碼)或者算術編碼表(幀中使用算術編碼)。在後一種情況中,熵編碼表目标選擇子指定一個算術編碼調節表目标和一個相關的統計區域。

JPEG圖像編碼詳解-轉載

B.2.4 表規範和各種标記段文法

Figure B.5 specifies that, at the places indicated in Figure B.2, any of the table-specification segments or miscellaneous marker segments specified in B.2.4.1 through B.2.4.6 may be present in any order and with no limit on the number of segments.

如果任何一個為了特定目的的表規範出現在壓縮資料中,那麼它應該取代為了相同目的而指定的前面的表,并且,無論何時幀中剩餘的掃描或者随後在壓縮圖像資料的縮略格式中出現的圖像指定了這個目的,則都應該使用這個表規範。如果對于一個給定的目的有多餘一個的表規範出現在壓縮圖像資料中,則每一個規範都應該取代前面的規範。量化表規範在一個給定成分的增量式DCT掃描之間不應該發生改變。

JPEG圖像編碼詳解-轉載

B.2.4.1 量化表規範文法

圖B.6詳述了定義了一個或多個量化表的标記段。

JPEG圖像編碼詳解-轉載

圖B.6所示的标記和參數定義如下。各個參數的大小和允許的值在表B.4中給出。

DQT:  定義量化表标記 – 标記量化表規範參數的開始。

Lq:  量化表定義的長度 – 說明了圖B.6中所示的全部的量化表參數的長度(參見 B.1.1.4)。

Pq:  量化表元素精度 – 指定Qk值的精度。值0表示Qk 為8-bit;值1表示Qk為16-bit。對于8位采樣精度P,Pq應該為0(參見B.2.2)。

Tq:  量化表目标辨別 –為量化表将被安裝到的解碼器指定4個可能的目标中的一個。

Qk:  量化表元素 – 詳述64個元素中的第k個元素,其中k是在DCT系數的zig-zag序列中的索引。量化元素應該以zig-zag掃描的順序來制定。

JPEG圖像編碼詳解-轉載

表B.4中的值n是DQT标記段描述的量化表的個數

如果已經為一個特定的目的定義了一個量化表,則它應該替代為那個目的而存儲的先前的表,并且,在目前圖像的剩餘的掃描中,和随後在壓縮圖像資料的縮略格式中出現的圖像中,需要引用該目的的表時,那個量化表應該得到使用。如果為了特定目的的表從來沒有定義過,但在幀頭中指定了這個目的時,則結果是不可預測的。

一個使用8-bit精度量化表的基于DCT的程式不應該使用一個16-bit精度的量化表。

B.2.4.2 霍夫曼表規範文法

圖B.7說明了用于定義一個或多個霍夫曼表規範的标記段。

JPEG圖像編碼詳解-轉載

圖B.7中所示的标記和參數如下面定義。每一個參數的大小和允許的值有表B.5給出。

DHT:  定義霍夫曼表标記 – 标記霍夫曼表定義參數的開始。

Lh:  霍夫曼表定義的長度 – 指定了圖B.7中所示的所有霍夫曼表參數的長度(參見B.1.1.4)。

Tc:  表類 - 0 = DC表或無損的表,1 = AC表

Th:  霍夫曼表目标辨別 – 在霍夫曼表應該被安裝到的解碼器中指定四個可能的目标之一。

Li:  霍夫曼編碼長度為i的碼字的個數 – 說明本規範允許的霍夫曼編碼的16個可能長度中的每一個的碼字的個數。Li是表BITS的元素。

Vi,j:  與每一個霍夫曼編碼相關的值 – 對于每一個i,指定與長度為i的每一個霍夫曼編碼相關聯的值。每一個值的含義由霍夫曼編碼模型決定。Vi,j是表HUFFVAL的元素。

JPEG圖像編碼詳解-轉載

表B.5中的值n是DHT标記段中描述的霍夫曼表的個數。mt是霍夫曼表t中緊跟在16個Li(t)參數後面的參數的個數,其值由下式給出:

JPEG圖像編碼詳解-轉載

通常情況下,每一個表的mt值是不同的。

一旦已經為一個特定目标定義了一個霍夫曼表,則它應該取代前面的為了相同目的而定義的表,并且,在目前圖像剩餘的掃描中,和随後在壓縮圖像資料的縮略格式中出現的圖像中,需要引用該目的的表時,那個量化表應該得到使用。如果為了特定目的的表從來沒有定義過,但在幀頭中指定了這個目的,則結果是不可預測的。

B.2.4.3 算術調節表規範文法

圖B.8說明了用于定義一個或多個算術調節表規範的标記段。他們替代由SOI标記為算術編碼過程建立的算術編碼調節表。參見(F.1.4.4.1.4和F.1.4.4.2.1)

JPEG圖像編碼詳解-轉載

圖B.8所示的标記和參數在下面定義。各個參數的大小和允許的值在表B.6中給出。

DAC:  定義算術編碼調節标記 – 标記算術編碼調節參數定義的開始。

La:  算術編碼調節定義長度 – 說明圖B.8所示的所有算術編碼調節參數的長度(參見B.1.1.4)

Tc:  表類 - 0 = DC表或無損的表,1 = AC表。

Tb:  算術編碼調節表目的辨別 - 在算術編碼調節表應該被安裝到的解碼器中指定四個可能的目标之一。

Cs:  調節表值 – 在AC或DC(和無損的)調節表中的值。Cs的一個單個的值應該跟在Tb的每一個值之後。對于AC調節表,Tc應該為1,并且Cs應該包含一個在範圍1 ≤ Kx ≤ 63内的Kx值。對于DC(或無損的)調節表Tc應該為0,并且Cs應該包含兩個4-bit參數,U和L。U和L應該在0 ≤ L ≤ U ≤ 15範圍内,并且Cs的值應該為L + 16 × U

表B.6中的值n是DAC标記段中描述的算術編碼調節表的個數。參數L和U是為DC系數編碼和無損編碼定義的在算術編碼過程中使用的下部和上部調節邊界。為DCT編碼列出的範圍在1-63的單獨的值是用于AC系數編碼的Kx調整。

JPEG圖像編碼詳解-轉載

B.2.4.4 重新開始間隔定義文法

圖B.9說明了用于定義重新開始間隔的标記段。

JPEG圖像編碼詳解-轉載

圖B.9所示的标記和參數在下面定義。各個參數的大小和允許的值在表B.7中給出。

DRI:  重新開始間隔定義标記 – 标記了重新開始間隔定義參數的開始。

Lr:  重新開始間隔定義短長度 - 說明了圖B.9中所示的DRI段中的參數的長度(參見B.1.1.4)

Ri:  重新開始間隔 – 指定了以MCU為機關的重新開始間隔。

表B.7中的值n是重新開始間隔中的MCU行數。MCUR值是掃描中構成每一個成分的一行采樣值所需的MCU個數。SOI标記禁用重新開始标記。一個具有非零的Ri值的DRI标記段将出現以為接下來的掃描打開重新開始間隔過程。一個Ri值為0的DRI标記段将為接下來的掃描禁用重新開始間隔。

JPEG圖像編碼詳解-轉載

B.2.4.5 注釋文法

圖B.10描述了用于一個注釋段的标記段結構

JPEG圖像編碼詳解-轉載

圖B.10所示的标記和參數在下面定義。各個參數的大小和允許的值在表B.8中給出。

COM:  注釋标記 – 标記一個注釋的開始。

Lc:  注釋段長度 – 說明了圖B.10中所示的注釋段的長度(參見B.1.1.4)。

Cmi:  注釋位元組 – 對注釋的解釋留給應用程式。

JPEG圖像編碼詳解-轉載

B.2.4.6 應用程式資料文法

圖B.11詳述了一個應用程式資料段的标記段結構。

JPEG圖像編碼詳解-轉載

圖B.11所示的标記和參數在下面定義。各個參數的大小和允許的值在表B.9中給出。

APPn: 應用程式資料标記 – 标記一個應用程式資料資料段的開始

Lp: 應用程式資料段長度 – 說明了圖B.11中所示的應用程式資料段的長度(參見B.1.1.4)。

Api: 應用程式資料位元組 – 解釋權留給應用程式。

APPn(應用)段留給應用程式使用。由于這些段在不同的應用程式中可能有不同的定義,則當資料在應用環境之間交換式,他們應該被移除。

JPEG圖像編碼詳解-轉載

B.2.5 行數定義文法

圖B.12詳述了用于定義行數的标記段。DNL(Define Number of Lines)段為在第一個掃描結尾處定義或重新定義幀中行數(幀頭中的Y參數)提供了一種機制。指定的值應該與第一個掃描中編碼的MCU行數一緻。如果使用了這個段,則它應該隻出現在第一個掃描的結尾處,并且在編碼了一個整數的MCU行之後使用。如果幀頭中行數(Y)已經被指定為0,則這個标記段是必須的

JPEG圖像編碼詳解-轉載

圖B.12所示的标記和參數在下面定義。各個參數的大小和允許的值在表B.10中給出。

DNL:  行數定義标記 – 标記行數定義段的開始。

Ld:  行數定義段長度 – 說明了圖B.12中所示的行數定義段的長度(參見B.1.1.4)

NL:  行數 – 指定了幀中的行數(參見B.2.2中的Y的定義)。

JPEG圖像編碼詳解-轉載

Annex B

Compressed data formats

(This annex forms an integral part of this Recommendation | International Standard)

T本附錄介紹三種壓縮資料格式:

a) 交換格式,在B.2和B.3中介紹;

b) 壓縮圖像資料的縮略格式,在B.4中介紹;

c) 表規範資料的縮略格式,在B.5中介紹。

B.1  描述這些格式的構成部分。B.1.3和B.1.4給出了格式規範中使用到的插圖和符号的約定。

B.1 壓縮資料規範的基本層面

在結構上,壓縮資料格式包含一個由參數、标記和熵編碼資料段組成的有序集合。參數和标記往往又形成标記段。由于所有這些組成部分是由位元組對齊的代碼表示的,是以每一個壓縮資料格式由一個8-bits位元組的有序序列組成。對于每一個位元組,都定義了一個最高有效位(MSB)和一個最低有效位(LSB)。

B.1.1 組成部分

這個小節給出了壓縮資料格式每一個部分的概述。

B.1.1.1 參數

參數是整數,其值特定于具體的編碼過程,源圖像的特點,和應用程式可選的其他特性。參數由4-bit,1位元組或2位元組的代碼指派。除了某些可選的參數組,參數都編碼重要的資訊,如果沒有這些資訊,解碼過程就無法正确的重建圖像。

一個參數的代碼應該是一個無符号整數,該整數具有以位為機關的規定長度,并具有特定的參數值。

對于長度2位元組(16位)的參數,則在壓縮資料位元組的有序序列中,最高位位元組應該在前。長度為4位的參數成對出現,并且這一對參數應被編碼為一個單獨的位元組。參數對中的第一個4-bit參數應該占據位元組的高4位。對于任何的16-,8-,或4-bit參數,MSB應該在前,LSB在後。

B.1.1.2 标記

标記用于辨別壓縮資料格式的各個不同結構部分。大多數标記開啟了一個标記段,而标記段則包含了一個相關的參數組。所有的标記均被配置設定一個2位元組的代碼:一個X’FF位元組後跟一個不為0或X’FF’位元組(參見表B.1)。所有的标記前面可以有一些可選的代碼為X’FF的填充位元組。

注意 – 由于這種特别的代碼配置設定結構,是以标記使解碼器可以在不解碼圖像資料的其他段的情況下,而解析壓縮資料并定位它的各個部分。

B.1.1.3 标記配置設定

所有的标記均被配置設定一個兩位元組的代碼:一個X’FF’,及其後跟着的一個不為0或X’FF的第二個位元組。每一個定義的标記的第二個位元組在表B.1中指定。一個星号(*)表示一個标記是獨立的,即,它不是一個标記段的開始。

JPEG圖像編碼詳解-轉載
JPEG圖像編碼詳解-轉載

Table B.1 – Marker code assignments

B.1.1.4 标記段

 一個标記段由一個标記和該标記後面跟着的一個相關參數的序列組成。标記段中的第一個參數是2位元組的長度參數。該長度參數編碼了标記段以位元組為機關的長度,包括長度參數,但不包括2位元組的标記。以SOF和SOS标記碼辨別的标記段被稱為頭:分别為幀頭和掃描頭。

B.1.1.5  熵編碼資料段

一個熵編碼資料段包含了一個熵編碼過程的輸出。無論熵編碼過程使用的是霍夫曼編碼還是算術編碼,它都由整數個自己組成。

注意

1按下面方法執行以使熵編碼資料段具有整數個位元組:對于霍夫曼編碼,如果需要,則在壓縮資料的最後填充值為1的位值來補齊段的最後一個位元組。對于算術編碼,位元組對齊在終止熵編碼段的過程中進行(參見D.1.8)。

2 為了確定一個标記不會出現在一個熵編碼段中,則任何一個由霍夫曼編碼或算術編碼産生的X’FF’位元組,或如上面注意1中所述,由值為1的位填充而得的一個X’FF’位元組,其後要緊跟一個“填塞”0位元組(參見D.1.6和F.1.2.3)。

B.1.2 文法

B.2和B.3中詳述了交換格式的文法。就本規範的目的,文法規範的組成為:

– 要求的标記,參數和熵編碼段的順序;

– 可選的和有條件的組成部分的識别;

– 每一個标記和參數的名稱、符号和識别;

– 每一個參數的允許值;

– 以上各條特定于各種編碼過程的所有限制。

各組成部分的次序及可選的和有條件的部分的識别在文法插圖B.2和B.3中示出。名稱、符号、定義、允許值、條件和限制很快将在下面的各個文法插圖中示出。

B.1.3 文法插圖約定

B.2和B.3中的文法插圖是交換格式規範的一部分。在圖B.1中闡明的,下面的約定,應用于這些插圖:

– 參數/标記訓示符:一個細線的盒子包圍一個标記或一個單獨的參數;

– 段訓示符:一個細線的盒子包圍一個标記段、一個熵編碼段或他們的結合;

– 參數長度訓示符:一個細線的盒子的寬度與标記的參數長度(4,8或16位,如圖B.1中的E,B和D所示)或它包圍的參數成比例;多個細線包圍的盒子的寬度是無意義的;

– 可選的/有條件的訓示符:方括号标明,在壓縮資料中,一個标記段或标記隻是可選的或有條件的。

– 次序:交換格式中,圖中所示的參數或标記都先于其右邊所示的參數或标記,并跟在它左邊的參數後面。

–    熵編碼資料訓示符:尖括号标明,其包圍的内容是已經經過了熵編碼的。

JPEG圖像編碼詳解-轉載

B.1.4 符号,代碼長度和值約定

在下面的B.2和B.3中的每一個文法插圖,圖中所示的每一個标記和參數符号、名稱和定義都描述過了。對于每一個參數,長度和允許值也在表格中詳述。

下面的約定應用于标記和參數的符号:

– 所有的标記符号有三個大寫字母,而某些則還具有下标。如:SOI,SOFn;

– 所有的參數符号有一個大寫字母;某些還具有一個小寫字母和一些下标。如:Y,Nf,Hi,Tqi。

B.2 普通的順序和增量文法

這一章說明了應用于所有的編碼過程的交換格式文法,包括基于DCT的順序操作模式,基于DCT的增量操作模式和無損操作模式

B.2.1 高層次文法

圖B.2說明了用于本規範中詳述的所有的非層次式(non-hierarchical)編碼過程的交換格式的高層次組成部分的順序。

JPEG圖像編碼詳解-轉載

圖B.2所示的三個标記定義如下:

SOI: 圖像開始标記 – 出現于交換格式或縮寫格式中,标記一幅壓縮圖像的開始。

EOI: 圖像結束标記 - 出現于交換格式或縮寫格式中,标記一幅壓縮圖像的結束。

RSTm: 重新開始标記 – 隻有重新開始使能時,放在熵編碼段之間的一個有條件的标記。有8個唯一的重新開始标記(m = 0 - 7),他們從0到7順序的重複,每一個掃描的以0開始,以此來提供一個模8的重新開始間隔計數。

圖B.2的最頂層說明了非層次式交換格式應該以SOI标記作為開始,包含一個幀,并以一個EOI标記結束。

圖B.2的第二層說明一個幀應該以一個幀頭開始并包含一個或多個掃描。一個幀頭前面也許有一個或多個表規範或B.2.4中說明的多種标記段。如果有一個DNL段(參見B.2.5),那麼它應該緊跟在第一掃描的後面。

對于基于DCT的順序操作模式和無損過程,每一個掃描應該包含一到四個圖像成分。如果一個掃描中2到4個成分,那麼,它們應該在掃描中交替出現。對于基于DCT的增進式過程,每一個圖像成分隻是部分的包含于任何一個掃描中。隻有成分(隻包含DC系數資料)的第一個掃描可能是交替的。

圖B.2的第三層說明了一個掃描應該以一個掃描頭開始,并包含一個或多個熵編碼資料段。每一個掃描頭前面可能有一個或多個表規範或多種标記段。如果重新開始沒有被使能,則應該隻有一個熵編碼段(标記為“last”的那個),并且沒有重新開始标記。如果使能了重新開始,則熵編碼段有圖像的大小和DRI定義。這種情況下,一個重新開始标記應該跟在除了最後一個熵編碼段之外的熵編碼段之後。

圖B.2的第四層說明每一個熵編碼段由一系列熵編碼MCUs組成。如果使能了重新開始,并且重新開始間隔被定義為Ri,則除了最後一個之外的每一個熵編碼段應該包含Ri個MCUs,最後一個應該包含掃描的剩餘的MCUs

圖B.2說明了表規範可能出現的位置。然而,這裡的規範特指交換格式應該包含的用于解碼壓縮圖像的所有的表規範資料。是以,需要的表規範資料應該出現于一個或多個允許的位置。

B.2.2 幀頭文法

圖B.3說明了應該出現在一個幀的開始處的幀頭。這個頭說明了源圖像特性(參見A.1),包括包含于幀中的成分,每一個成分的采樣因子,以及恢複每一個成分所使用的目标量化表。

JPEG圖像編碼詳解-轉載

圖B.3中所示的标記和參數定義如下。每一個參數的大小和允許的值由表B.2給出。在表B.2(以及随後類似的表)中,可選的值由逗号隔開(e.g. 8, 12),範圍值的邊界由破折号隔開(e.g. 0 - 3)。

SOFn: 幀标記的開始 – 标記幀參數的開始。下标n辨別編碼過程為基線順序編碼,擴充順序編碼,增量式編碼,或無損編碼,也辨別使用了哪個熵編碼過程。

SOF0: 基線DCT

SOF1: 擴充順序DCT,霍夫曼編碼

SOF2: 增量式DCT,霍夫曼編碼

SOF3: 無損(順序)的,霍夫曼編碼

SOF9: 擴充順序DCT, 算術編碼

SOF10: 增量式DCT, 算術編碼

SOF11: 無損(順序)的,算術編碼

Lf:  幀頭的長度 – 說明了圖B.3中所示的幀頭的長度(參見B.1.1.4)。

P:  采樣精度 – 以位為機關說明了幀中的成分的采樣精度。

Y:  行數 – 說明了源圖像的最大行數。它應該等于成分中具有最大垂直采樣數的成分的行數(參見A.1.1)。值為0則表明行數應該由DNL标記定義,并且參數在第一個掃描的結尾(參見B.2.5)。

X:  每一行的采樣數 - 說明了源圖像中每一行的最大采樣數。它應該等于成分中具有最大的水準采樣數的成分的每一行的采樣數。(參見A.1.1).

Nf:  幀中的圖像成分數 – 指定了幀中源圖像的成分數。Nf的值應該與出現在幀頭中幀成分規範參數(Ci, Hi, Vi,and Tqi)的個數。

Ci:  成分辨別符 – 順序的為幀成分規範參數中的第i個參數配置設定一個唯一的标記。這些值應該被用于掃描頭中來識别掃描中的成分Ci應該不同于C1到Ci − 1。

Hi:  水準采樣因子 – 說明了成分的水準尺寸和最大的圖像尺寸X之間的關系(參見A.1.1);當一個掃描中編碼了多于一個成分時,也指定了每一MCU中成分Ci的水準資料單元數。

Vi:  垂直采樣因子 – 說明了成分的垂直尺寸和最大的圖像尺寸Y之間的關系(參見A.1.1);當一個掃描中編碼了多于一個成分時,也指定了每一MCU中成分Ci的垂直資料單元數。

Tqi:  量化表目的選擇子 – 指定了用于恢複成分Ci而對DCT系數反量化的四個可能的量化表中的一個。如果解碼過程使用反量化例程,則在解碼器已經準備好去解碼掃描中包含的成分Ci時,這個表應該已經被安裝在了目标位置。目标位置不應該被重新指定,或者改變它的内容,直到包含Ci的所有掃描均被解碼完成。

JPEG圖像編碼詳解-轉載

B.2.3 掃描頭文法

圖B.4詳細說明了應該出現在一個掃描的開始位置的掃描頭。這個頭指定掃描中包含哪些成分,恢複每一個成分時使用的熵編碼表,和(用于增量式DCT)掃描中包含哪些量化後的DCT系數資料。對于無損過程,掃描參數指定預測值和點轉換。

注意 – 如果掃描中隻有一個圖像成分,根據定義,那個成分時非交替的。如果掃描中有多個圖像成分,根據定義,這些成分要交替出現。

JPEG圖像編碼詳解-轉載

圖B.4中所示的标記和參數定義如下。每一個參數大小和允許的值由表B.3給出。

SOS:  掃描标記的開始 – 标記掃描參數的開始。

Ls:  掃描頭的長度 – 說明了圖B.4中所示的掃描頭的長度(參見B.1.1.4)。

Ns: 掃描中圖象成分的個數 – 說明了掃描中源圖像成分的個數。Ns的值應該等于出現于掃描頭中的掃描成分規範參數(Csj,Tdj,和Taj)的個數。

Csj:  掃描成分選擇子 – 選擇幀參數中詳述的Nf個圖像成分中的哪一個應該是掃描中的第j個成分。每一個Csj應該與幀頭中詳述的Ci值中的一個相對應,并且順序應該與在幀頭中的相同。如果Ns > 1,則MCU中交替的成分的順序為Cs1第一,Cs2第二,等等。Ns > 1,則以下限制應該被施加于掃描中包含的圖像成分上:

JPEG圖像編碼詳解-轉載

其中Hj和Vj是掃描成分j的水準和垂直采樣因子。在幀頭中這些采樣因子被指定給成分i,其中i是幀成分規範索引,幀成分辨別Ci對應于掃描成分選擇子Csj。

例如,考慮一幅圖像具有3個成分,最大尺寸為512行,每行512個采樣值,并且采樣因子如下:

JPEG圖像編碼詳解-轉載

然後求和

JPEG圖像編碼詳解-轉載

Csj的值應該不同于Cs1到Csj–1的值。

Tdj:  DC熵編碼表目标選擇子 –指定四個可能的DC熵編碼表中的一個,以滿足恢複成分Csj的DC系數的需要。當解碼器準備好解碼目前的掃描時,DC熵編碼表應該已經被安裝在了這個目标位置(參見B.2.4.2和B.2.4.3)。對于無損過程,這個參數指定了熵編碼表。

Taj:  AC熵編碼表目标選擇子 - 指定四個可能的AC熵編碼表中的一個,以滿足恢複成分Csj的AC系數的需要。解碼器準備好解碼目前的掃描時,被選擇的AC熵編碼表應該已經被安裝在了這個目标位置(參見B.2.4.2和B.2.4.3)。對于無損過程,這個參數為0.

Ss:  頻譜或預測值選擇的開始 – 在DCT操作模式中,這個參數指定了應該被編碼進掃描中的每一個zig-zag序列的塊的第一個DCT系數。對于順序DCT過程,這個參數應該被設為0。在無損操作模式中,這個參數用于選擇預測值。

Se:  頻譜選擇的結束 – 指定應該被編碼進掃描中的每一個zig-zag序列的塊的最後一個DCT系數。對于順序DCT過程,這個參數應該被設為63。在無損操作模式中,這個參數無意義,它應該被設為0.

Ah:  逐次逼近位位置高 – 這個參數為由Ss和Se說明的系數的頻帶指定了用于前掃描的點轉換(比如,在前掃描中逐次逼近位位置低)。對于系數的每一個頻帶的第一個掃描,這個參數應被設為0。在無損操作模式中,這個參數無意義,它應該被設為0.

Al:  逐次逼近位位置低或點轉換 – 在DCT操作模式中,這個參數指定點轉換,比如,位位置低,在編碼由Ss和Se說明的系數的頻帶前使用。對于順序DCT過程,這個參數應被設為0。在無損操作模式中,這個參數指定點轉換,Pt。

熵編碼表目标選擇子,Tdj和Taj,指定霍夫曼表(幀中使用霍夫曼編碼)或者算術編碼表(幀中使用算術編碼)。在後一種情況中,熵編碼表目标選擇子指定一個算術編碼調節表目标和一個相關的統計區域。

JPEG圖像編碼詳解-轉載

B.2.4 表規範和各種标記段文法

Figure B.5 specifies that, at the places indicated in Figure B.2, any of the table-specification segments or miscellaneous marker segments specified in B.2.4.1 through B.2.4.6 may be present in any order and with no limit on the number of segments.

如果任何一個為了特定目的的表規範出現在壓縮資料中,那麼它應該取代為了相同目的而指定的前面的表,并且,無論何時幀中剩餘的掃描或者随後在壓縮圖像資料的縮略格式中出現的圖像指定了這個目的,則都應該使用這個表規範。如果對于一個給定的目的有多餘一個的表規範出現在壓縮圖像資料中,則每一個規範都應該取代前面的規範。量化表規範在一個給定成分的增量式DCT掃描之間不應該發生改變。

JPEG圖像編碼詳解-轉載

B.2.4.1 量化表規範文法

圖B.6詳述了定義了一個或多個量化表的标記段。

JPEG圖像編碼詳解-轉載

圖B.6所示的标記和參數定義如下。各個參數的大小和允許的值在表B.4中給出。

DQT:  定義量化表标記 – 标記量化表規範參數的開始。

Lq:  量化表定義的長度 – 說明了圖B.6中所示的全部的量化表參數的長度(參見 B.1.1.4)。

Pq:  量化表元素精度 – 指定Qk值的精度。值0表示Qk 為8-bit;值1表示Qk為16-bit。對于8位采樣精度P,Pq應該為0(參見B.2.2)。

Tq:  量化表目标辨別 –為量化表将被安裝到的解碼器指定4個可能的目标中的一個。

Qk:  量化表元素 – 詳述64個元素中的第k個元素,其中k是在DCT系數的zig-zag序列中的索引。量化元素應該以zig-zag掃描的順序來制定。

JPEG圖像編碼詳解-轉載

表B.4中的值n是DQT标記段描述的量化表的個數

如果已經為一個特定的目的定義了一個量化表,則它應該替代為那個目的而存儲的先前的表,并且,在目前圖像的剩餘的掃描中,和随後在壓縮圖像資料的縮略格式中出現的圖像中,需要引用該目的的表時,那個量化表應該得到使用。如果為了特定目的的表從來沒有定義過,但在幀頭中指定了這個目的時,則結果是不可預測的。

一個使用8-bit精度量化表的基于DCT的程式不應該使用一個16-bit精度的量化表。

B.2.4.2 霍夫曼表規範文法

圖B.7說明了用于定義一個或多個霍夫曼表規範的标記段。

JPEG圖像編碼詳解-轉載

圖B.7中所示的标記和參數如下面定義。每一個參數的大小和允許的值有表B.5給出。

DHT:  定義霍夫曼表标記 – 标記霍夫曼表定義參數的開始。

Lh:  霍夫曼表定義的長度 – 指定了圖B.7中所示的所有霍夫曼表參數的長度(參見B.1.1.4)。

Tc:  表類 - 0 = DC表或無損的表,1 = AC表

Th:  霍夫曼表目标辨別 – 在霍夫曼表應該被安裝到的解碼器中指定四個可能的目标之一。

Li:  霍夫曼編碼長度為i的碼字的個數 – 說明本規範允許的霍夫曼編碼的16個可能長度中的每一個的碼字的個數。Li是表BITS的元素。

Vi,j:  與每一個霍夫曼編碼相關的值 – 對于每一個i,指定與長度為i的每一個霍夫曼編碼相關聯的值。每一個值的含義由霍夫曼編碼模型決定。Vi,j是表HUFFVAL的元素。

JPEG圖像編碼詳解-轉載

表B.5中的值n是DHT标記段中描述的霍夫曼表的個數。mt是霍夫曼表t中緊跟在16個Li(t)參數後面的參數的個數,其值由下式給出:

JPEG圖像編碼詳解-轉載

通常情況下,每一個表的mt值是不同的。

一旦已經為一個特定目标定義了一個霍夫曼表,則它應該取代前面的為了相同目的而定義的表,并且,在目前圖像剩餘的掃描中,和随後在壓縮圖像資料的縮略格式中出現的圖像中,需要引用該目的的表時,那個量化表應該得到使用。如果為了特定目的的表從來沒有定義過,但在幀頭中指定了這個目的,則結果是不可預測的。

B.2.4.3 算術調節表規範文法

圖B.8說明了用于定義一個或多個算術調節表規範的标記段。他們替代由SOI标記為算術編碼過程建立的算術編碼調節表。參見(F.1.4.4.1.4和F.1.4.4.2.1)

JPEG圖像編碼詳解-轉載

圖B.8所示的标記和參數在下面定義。各個參數的大小和允許的值在表B.6中給出。

DAC:  定義算術編碼調節标記 – 标記算術編碼調節參數定義的開始。

La:  算術編碼調節定義長度 – 說明圖B.8所示的所有算術編碼調節參數的長度(參見B.1.1.4)

Tc:  表類 - 0 = DC表或無損的表,1 = AC表。

Tb:  算術編碼調節表目的辨別 - 在算術編碼調節表應該被安裝到的解碼器中指定四個可能的目标之一。

Cs:  調節表值 – 在AC或DC(和無損的)調節表中的值。Cs的一個單個的值應該跟在Tb的每一個值之後。對于AC調節表,Tc應該為1,并且Cs應該包含一個在範圍1 ≤ Kx ≤ 63内的Kx值。對于DC(或無損的)調節表Tc應該為0,并且Cs應該包含兩個4-bit參數,U和L。U和L應該在0 ≤ L ≤ U ≤ 15範圍内,并且Cs的值應該為L + 16 × U

表B.6中的值n是DAC标記段中描述的算術編碼調節表的個數。參數L和U是為DC系數編碼和無損編碼定義的在算術編碼過程中使用的下部和上部調節邊界。為DCT編碼列出的範圍在1-63的單獨的值是用于AC系數編碼的Kx調整。

JPEG圖像編碼詳解-轉載

B.2.4.4 重新開始間隔定義文法

圖B.9說明了用于定義重新開始間隔的标記段。

JPEG圖像編碼詳解-轉載

圖B.9所示的标記和參數在下面定義。各個參數的大小和允許的值在表B.7中給出。

DRI:  重新開始間隔定義标記 – 标記了重新開始間隔定義參數的開始。

Lr:  重新開始間隔定義短長度 - 說明了圖B.9中所示的DRI段中的參數的長度(參見B.1.1.4)

Ri:  重新開始間隔 – 指定了以MCU為機關的重新開始間隔。

表B.7中的值n是重新開始間隔中的MCU行數。MCUR值是掃描中構成每一個成分的一行采樣值所需的MCU個數。SOI标記禁用重新開始标記。一個具有非零的Ri值的DRI标記段将出現以為接下來的掃描打開重新開始間隔過程。一個Ri值為0的DRI标記段将為接下來的掃描禁用重新開始間隔。

JPEG圖像編碼詳解-轉載

B.2.4.5 注釋文法

圖B.10描述了用于一個注釋段的标記段結構

JPEG圖像編碼詳解-轉載

圖B.10所示的标記和參數在下面定義。各個參數的大小和允許的值在表B.8中給出。

COM:  注釋标記 – 标記一個注釋的開始。

Lc:  注釋段長度 – 說明了圖B.10中所示的注釋段的長度(參見B.1.1.4)。

Cmi:  注釋位元組 – 對注釋的解釋留給應用程式。

JPEG圖像編碼詳解-轉載

B.2.4.6 應用程式資料文法

圖B.11詳述了一個應用程式資料段的标記段結構。

JPEG圖像編碼詳解-轉載

圖B.11所示的标記和參數在下面定義。各個參數的大小和允許的值在表B.9中給出。

APPn: 應用程式資料标記 – 标記一個應用程式資料資料段的開始

Lp: 應用程式資料段長度 – 說明了圖B.11中所示的應用程式資料段的長度(參見B.1.1.4)。

Api: 應用程式資料位元組 – 解釋權留給應用程式。

APPn(應用)段留給應用程式使用。由于這些段在不同的應用程式中可能有不同的定義,則當資料在應用環境之間交換式,他們應該被移除。

JPEG圖像編碼詳解-轉載

B.2.5 行數定義文法

圖B.12詳述了用于定義行數的标記段。DNL(Define Number of Lines)段為在第一個掃描結尾處定義或重新定義幀中行數(幀頭中的Y參數)提供了一種機制。指定的值應該與第一個掃描中編碼的MCU行數一緻。如果使用了這個段,則它應該隻出現在第一個掃描的結尾處,并且在編碼了一個整數的MCU行之後使用。如果幀頭中行數(Y)已經被指定為0,則這個标記段是必須的

JPEG圖像編碼詳解-轉載

圖B.12所示的标記和參數在下面定義。各個參數的大小和允許的值在表B.10中給出。

DNL:  行數定義标記 – 标記行數定義段的開始。

Ld:  行數定義段長度 – 說明了圖B.12中所示的行數定義段的長度(參見B.1.1.4)

NL:  行數 – 指定了幀中的行數(參見B.2.2中的Y的定義)。

JPEG圖像編碼詳解-轉載

繼續閱讀