MPEG-1流比特層次結構分析總結
1.簡要介紹Mpeg
Mpeg是Motion Picture Expert Group的縮寫。活動圖像專家組是在1988年由ISO和IEC聯合成立的專家組,負責開發電 視圖像數據和聲音數據的編碼,解碼和它們的同步等標準。到目前爲止已經開發和正在開發的MPEG標準有不少,主要包括Mpeg-1,Mpeg- 2,Mpeg-4,和Mpeg-7.
其中的Mpeg-1處理的是標準圖像交換格式(standard interchange format,SIF)或者稱爲源輸入格式 (Source Input Format,SIF)的電視,將模擬的圖像信息,經過編碼成爲數字圖像信息,原始輸入能夠是NTSC制式 352pixels * 240lines * 30frames/second, PAL制 352pixels * 288lines*25frames/second,壓縮後的數字圖像信息的速率爲1.5Mb/s.這個標註是1992年正是的 發佈的,是針對當時具備這種數據傳輸速率的CD-ROM和網絡而開發的,用於在CD-ROM上存儲數字影視和在網絡上傳輸數字影視。
MPEG-1的標準號爲ISO/IEC 11172,標準名:「信息技術——用於數據速率大約高達1.5Mb/s的數字存儲替的電視圖像和伴音編碼」
本文主要是對Mpeg-1Video數據流的結構進行分析,並將怎樣獲得Mpeg-1流中的數據部分進行的闡述。ISO/IEC 11172-2
2.Mpeg-1數據流分析
編碼後的視頻序列是一個如同計算機網絡的OSI模型下的數據序列同樣,數據被分紅不少層的概念。
視頻序列層-畫面組層-畫面層-片層-宏塊層-塊層
層次的關係很明顯,越日後越是底層,越接近實際的數據。
2.1視頻序列層(VideoStream)
視頻序列是以一個序列標題開始,以後能夠跟着一個或者多個畫面組。最後以Sequence_end_code結束。緊挨着每個畫面組以前能夠有一個序列標題。也就是說每一個畫面組,均可以有一個本身的序列標題。
序列標題是一個以sequence_header_code開始,後跟着一系列數據元素的結構。是視頻流中用來解碼的重要的參數之一。其中定義了量化矩陣 (load_intra_quantizer_matrix和 load_non_intra_quantizer_matrix以及可選的 intra_quantizer_matrix和non_intra_quantizer_ matrix)以及其它的一些重要的數據元素,其中量化矩陣 是能夠在視頻流中重複的量化矩陣中變化的,而且在每次變化後,量化矩陣從新定義。其它的元素必須與第一個序列標題中的值相同。
整個視頻序列的結構能夠用下面的代碼表示:
Video_Stream{
unsigned int h_size; /* Horiz. size in pixels. */
unsigned int v_size; /* Vert. size in pixels. */
unsigned int mb_height; /* Vert. size in mblocks. */
unsigned int mb_width; /* Horiz. size in mblocks. */
unsigned char aspect_ratio; /* Code for aspect ratio. */
unsigned char picture_rate; /* Code for picture rate. */
unsigned int bit_rate; /* Bit rate. */
unsigned int vbv_buffer_size; /* Minimum buffer size. */
BOOLEAN const_param_flag; /* Contrained parameter flag. */
unsigned char intra_quant_matrix[8][8]; /* Quantization matrix for
intracoded frames. */
unsigned char non_intra_quant_matrix[8][8]; /* Quanitization matrix for
non intracoded frames. */
char *ext_data; /* Extension data. */
char *user_data; /* User data. */
GoP group; /* Current group of pict. */
Pict picture; /* Current picture. */
Slice slice; /* Current slice. */
Macroblock mblock; /* Current macroblock. */
Block block; /* Current block. */
int state; /* State of decoding. */
int bit_offset; /* Bit offset in stream. */
unsigned int *buffer; /* Pointer to next byte in
buffer. */
int buf_length; /* Length of remaining buffer.*/
unsigned int *buf_start; /* Pointer to buffer start. */
int max_buf_length; /* Max lenght of buffer. */
PictImage *past; /* Past predictive frame. */
PictImage *future; /* Future predictive frame. */
PictImage *current; /* Current frame. */
PictImage *ring[RING_BUF_SIZE]; /* Ring buffer of frames. */
} Video_Stream;
具體的序列標題的結構的部分是這樣的:
序列
sequence_header{
SEQ_START_CODE 0x000001b3; /* 常量 ,做用使用來定位視頻序列的序列頭 */
unsigned int h_size; /* Horiz. size in pixels. */
unsigned int v_size; /* Vert. size in pixels. */
unsigned int mb_height; /* Vert. size in mblocks. */
unsigned int mb_width; /* Horiz. size in mblocks. */
unsigned char aspect_ratio; /* Code for aspect ratio. */
unsigned char picture_rate; /* Code for picture rate. */
unsigned int bit_rate; /* Bit rate. */
unsigned int vbv_buffer_size; /* Minimum buffer size. */
BOOLEAN const_param_flag; /* Contrained parameter flag. */
unsigned char load_intra_quantizer_matrix;
unsigned char intra_quant_matrix[8][8]; /* Quantization matrix for intracoded frames. 這個結構是可選的,要看 load_intra_quantizer_matrix的值,爲真則有這個部分,不然沒有,由於
intra_quant_matrix是量化表的值,而Sequence_header結構在視頻序列中是可重複的,即在每一個畫面組以前都有可能再次給出一個sequence_header,而且能夠在新的sequence_header 中從新定義量化表*/
unsigned char load_non_intra_quantizer_matrix;
unsigned char non_intra_quant_matrix[8] [8]; /* Quanitization matrix for non intracoded frames. 也是可選。願意於 intra_quant_matrix可選的緣由相同。當load_non_intra_quant_matrix的值爲真的時候須要定義。 */
char *ext_data; /* Extension data. */
char *user_data; /* User data. */
}
由上面的分析,能夠看出來的是:
video_sequence()html
{
next_start_code()
do網絡
{
sequence_header();
doide
{
group_of_pictures() ; //畫面組
}while (nextbits()==GROUP_START_CODE)
}while(nextbits()==SEQUENCE_HEADER_CODE)
SEQUENCE_END_CODE
};
正是因爲視頻序列中存在不少開始碼,或者稱之爲定位碼、同步碼。用來告訴解碼器目前數據的區域信息,因此解碼器才能夠正確的處理各個數據區的數據,下面就是視頻序列中的開始碼的羅列:
#define SEQ_END_CODE 0x000001b7
#define SEQ_START_CODE 0x000001b3
#define GOP_START_CODE 0x000001b8
#define PICTURE_START_CODE 0x00000100
#define SLICE_MIN_START_CODE 0x00000101
#define SLICE_MAX_START_CODE 0x000001af
#define EXT_START_CODE 0x000001b5
#define USER_START_CODE 0x000001b2
這些開始碼都是一些特殊的32bits的比特序列,在視頻碼流中不會出現的。他們的起着標誌的做用,具體能夠從名稱上面看出來。
其中EXT_START_CODE和USER_START_CODE在每一個層裏面都會出現,用來標誌擴展數據區和用戶數據區,用來添加任意的數據,直到下一個開始碼結束。
2.2畫面組層(GOP)
在軟件xmplay1.1中的定義
typedef struct GoP {
BOOLEAN drop_flag; /* Flag indicating dropped frame. */
unsigned int tc_hours; /* Hour component of time code. */
unsigned int tc_minutes; /* Minute component of time code. */
unsigned int tc_seconds; /* Second component of time code. */
unsigned int tc_pictures; /* Picture counter of time code. */
BOOLEAN closed_gop; /* Indicates no pred. vectors to
previous group of pictures. */
BOOLEAN broken_link; /* B frame unable to be decoded. */
char *ext_data; /* Extension data. */
char *user_data; /* User data. */
} GoP;
固然每一個畫面組層都是開始與標誌碼:GOP_START_CODE
該層次語法上的定義是
group_of_pictures編碼
{
GOP_START_CODE
Time_code; tc_hours,tc_minutes,tc_seconds,tc_pictures
Closed_gop;
Broken_link;
Next_start_code;
If(nextbits==extension_start_code) spa
{
Extension_start_code;
While(nextbits()==」0000 0000 0000 0000 0000 0001」) 計算機網絡
{
Group_extension_data;
}
next_start_code()
}
if(nextbits==user_data_start_code)code
{
user_data_start_code
while(nextbits()!=’0000 0000 0000 0000 0000 0001’)component
{
user_data;
}
next_start_code()
}
doorm
{
picture()
}while(nextbits==picture_start_code)
}
Mpeg流最終顯示出來是一系列的畫面,而畫面組是mpeg流中能夠獨立編碼的最小的單位,每一個畫面組由一個標題和一系列畫面組成。GOP標題包含了時間和編輯的信息。
Mpeg畫面組中必須至少有一個I幀畫面,能夠有數目可變的B幀和P幀畫面,也能夠沒有P和B幀。畫面組的第一幅編碼畫面是I畫面,該畫面以後跟隨着任意數目的I或P畫面,每對I、P畫面之間能夠插入任意數目的B畫面。
畫面組是畫面的集合,每幅畫面按照顯示的順序相鄰。
畫面組中的畫面有兩種排列順序:
1.按比特流順序 必須以I幀開頭,後面可按任何的次序,跟上任意數目的I,P或B畫面。
2.按顯示順序必須以I或B畫面打頭,且以I或P畫面結束,最小的畫面組由一個I畫面組成。
從編碼角度,能夠精確的陳述的是,畫面組以一個畫面組標題開始,以最早出現的下一個畫面組標題或者下一個序列標題或者序列結束碼結束。
Mepg流中的標誌碼也就是開始碼,對正確的分割和識別碼流的成分起到了相當重要的做用。
2.3畫面層(Pictures)
畫面組層中的一幅幅畫面就是畫面層的數據了。包含了一幅畫面的全部編碼信息。一幅畫面一樣始於畫面的標題。標題以畫面開始碼(PICTURE_START_CODE 0x00000100)打頭。
解析畫面單元的語法結構:
picture()視頻
{
picture_start_code
temprol_reference /*時序編號,一般一組畫面的編號都在1024之內,若是超過那麼在1025幅畫面出復位爲0,從新計數。 */
picture_coding_type
vbv_delay/*對於固定比特率的視頻流,vbv_delay用與解碼過程開始和隨機存取以後,以保證在第一幅畫面被顯示以前,解碼器 已經讀到正確數目的比特數。*/
if((picture_coding_type==2) || picture_coding_type==3)
{
full_pel_foward_vector /*全象素前向矢量,給定前向矢量的精度,在P和B畫面的標題中出現*/
forward_f_code
}
if(picture_coding_type==3)
{
full_pel_backward_vector
back_f_code
}
while(nextbits()==’1’)
{
extra_bit_picture
extra_information_picture
}
extra_bit_picture
next_start_code
if(nextbits()==extension_start_code)
{
extension_start_code
while(nextbits()!=’0000 0000 0000 0000 0000 0001’)
{
picture_extension_data
}
next_start_code()
}
if(nextbits()==user_data_start_code)
{
user_data_start_code
while(nextbits()!=’0000 0000 0000 0000 0000 0001’)
{
user_data
}
next_start_code()
}
do
{
slice()
}while(nextbits()==slice_start_code)
}
整個畫面單元結構是這樣的:
typedef struct pict {
unsigned int temp_ref; /* Temporal reference. */
unsigned int code_type; /* Frame type: P, B, I */
unsigned int vbv_delay; /* Buffer delay. */
BOOLEAN full_pel_forw_vector; /* Forw. vectors specified in full
pixel values flag. */
unsigned int forw_r_size; /* Used for vector decoding. */
unsigned int forw_f; /* Used for vector decoding. */
BOOLEAN full_pel_back_vector; /* Back vectors specified in full
pixel values flag. */
unsigned int back_r_size; /* Used in decoding. */
unsigned int back_f; /* Used in decoding. */
char *extra_info; /* Extra bit picture info. */
char *ext_data; /* Extension data. */
char *user_data; /* User data. */
} Pict;
能夠看出整個pictures層的bit流結構中由標題和pictures數據組成。
標題中提供了必要的畫面信息數據和運動矢量的信息。
2.4片層(Slice)
片是任意數目宏塊組成的序列,其中宏塊必須從畫面的左上位置開始,按照光柵掃描的方向從左到右,從上到下排列。片中至少包涵一個宏塊,片與片之間沒有重疊,也沒有間隙。
片層的解析語法:
首先給出識別出Slice層數據的頭標slice_start_code
『
#define SLICE_MIN_START_CODE 0x00000101
#define SLICE_MAX_START_CODE 0x000001af
』
slice
{
slice_start_code /*從中能夠計算出slice_vertical_position 片中第一個宏塊,以宏塊爲單位的垂直位置*/
quantizer_scale /*設置量化步長尺寸。1-31*/
while(nextbits()==’1’)
{
extra_bit_slice ‘1’
extra_information_slice
}
extra_bit_scale ‘0’
do
{
macroblock()
}while(nextbits()!=’0000 0000 0000 0000 0000 0000’)
next_start_code()
}
typedef struct slice {
unsigned int vert_pos; /* Vertical position of slice. */
unsigned int quant_scale; /* Quantization scale. */
char *extra_info; /* Extra bit slice info. */
} Slice;
每一個片由一個開始碼開始,開始後DC係數和矢量解碼的預測值都被複位,片開始部位的位置的水平位置由片中第一個宏塊的宏塊地址決定。這些措施使得在一幅畫面內任何一片均可以單獨編碼而不須要前一片的信息。當解碼是出現錯誤,便可以從後繼的片從新開始。
因此,當數據在無錯的環境中,能夠一幅畫面就做爲一片,可是若是是有錯的環境,則每行宏塊做爲一片會更加合理。
表2 256×192畫面內的片劃分(每行宏塊做爲一個片,每一個片的高度都是16pixels)
1開始 1結束
2開始 2結束
3開始 3結束
4開始 4結束
5開始 5結束
6開始 6結束
7開始 7結束
8開始 8結束
9開始 9結束
10開始 10結束
11開始 11結束
12開始 12結束
13開始 13結束
實際狀況中片不宜太多,由於片標題,以及新片所須要盡心從新編碼花費的開銷很大。
片始於片標題,片標題又始於片開始碼,片開始碼是能夠在一個範圍中取得得,這個範圍就是
#define SLICE_MIN_START_CODE 0x00000101
#define SLICE_MAX_START_CODE 0x000001af
片開始碼得最後8爲能夠給出片得垂直位置,即以宏塊爲單位從畫面頂部位置爲1開始算起,片中第一個宏塊的垂直位置。宏塊有一個行號能夠做爲它得定位數據,這個行號的計算方法是:片垂直位置-1
宏塊的垂直位置最大爲175。片中第一個宏塊的水平位置,能夠由該宏塊的地址偏移計算出來,因此不須要依賴畫面內的任何其餘的宏塊的信息。
2.5宏塊層(Macroblock)
宏塊是包含16pixels*16lines的亮度份量部分,以及在空間位置上對應的兩個8pixels*8lines的色度份量部分,一個宏塊有4個亮度塊和2個色度塊。宏塊能夠指源圖像或者重構圖像的數據,或者是量化後的DCT係數。
宏塊中塊的順序以下:
表1 宏塊中塊的排列
01
23
4
5
Y份量Cb份量Cr份量
宏塊的數據分析語法描述:
macroblock()
{
while(nextbits()==’0000 0001 111’)
{
macroblock_stuffing /*宏塊填料,爲了防止下溢出,由編碼器填入的數據,有它固定的11位bit格式就 是’0000 0001 111’,固然 解決下溢出的方法還有不少,編碼器能夠在標題以前就加入填料位,或者能夠減少quant_scale得到更多的編碼係數等等*/
}
while(nextbits()==’0000 0001 000’)
{
macroblock_escape /*固定模式的bit串,當macroblock_address與 previous_macroblock_address的差大於33時將用到該碼。 使得後繼的macroblock_increment所表示的值加33。
}
macroblock_address_increment /* 用於表示macroblock_address和previous_macorblock_ address之間的差值。 最大值爲33,當前二者差大於 33時用macroblock_escape補充。 Macroblock_address表示的是宏塊在畫面中的絕對位置,最左上角的宏塊的 macroblock_address爲0,previous_macroblock_address指示片中最後一個非跳空宏塊的位置。*/
macroblock_type
if(macroblock_motion_forward)
{
motion_horizontal_forward_code
if((forward_f!=1) && (motion_horizontal_forward_code!=0))
motion_horizontal_forward_r
motion_vertical_forward_code
if((forward_f!=1) && (motion_vertical_forward_code!=0))
motion_vertical_forward_r
}
if(macroblock_motion_backward)
{
motion_horizontal_backward_code
if((backward_f!=1) && (motion_horizontal_backward_code!=0))
motion_horizontal_backward_r
motion_vertical_backward_code
if((backward_f!=1) && (motion_vertical_backward_code!=0))
motion_vertical_backward_r
}
if(macroblock_pattern)
coded_block_pattern /*能夠獲得宏塊宏塊的pattern_code[i](i=0:5),從而肯定該宏塊接收到的塊的種類有哪些。*/
for(i=0;i<6;i++)
block(i)
if(picture_coding_type==4)
end_of_marcoblock
}
片被分爲16pixels*16lines的象素宏塊。每一個宏塊都有它的標題。包含了宏塊的地址、類型、量化器標尺信息等等。標題以後是該宏塊的6個塊的數據。
在Xmplay代碼中給出的macrblock的定義:
typedef struct macroblock {
int mb_address; /* Macroblock address. */
int past_mb_addr; /* Previous mblock address. */
int motion_h_forw_code; /* Forw. horiz. motion vector code. */
unsigned int motion_h_forw_r; /* Used in decoding vectors. */
int motion_v_forw_code; /* Forw. vert. motion vector code. */
unsigned int motion_v_forw_r; /* Used in decdoinge vectors. */
int motion_h_back_code; /* Back horiz. motion vector code. */
unsigned int motion_h_back_r; /* Used in decoding vectors. */
int motion_v_back_code; /* Back vert. motion vector code. */
unsigned int motion_v_back_r; /* Used in decoding vectors. */
unsigned int cbp; /* Coded block pattern. */
BOOLEAN mb_intra; /* Intracoded mblock flag. */
BOOLEAN bpict_past_forw; /* Past B frame forw. vector flag. */
BOOLEAN bpict_past_back; /* Past B frame back vector flag. */
int past_intra_addr; /* Addr of last intracoded mblock. */
int recon_right_for_prev; /* Past right forw. vector. */
int recon_down_for_prev; /* Past down forw. vector. */
int recon_right_back_prev; /* Past right back vector. */
int recon_down_back_prev; /* Past down back vector. */
} Macroblock;
2.6塊層(Block)
塊是一個正交的8pixels*8lines的亮度或者色度份量,塊能夠指源畫面數據或者相應的編碼數據元素。
8*8單位象素的源畫面數據通過DCT變換後的成爲了相應的DCT係數塊。
塊的具體結構爲(xmplay源碼中的結構定義):
typedef struct block
{
short int dct_recon[8][8]; /* Reconstructed dct coeff matrix. */
short int dct_dc_y_past; /* Past lum. dc dct coefficient. */
short int dct_dc_cr_past; /* Past cr dc dct coefficient. */
short int dct_dc_cb_past; /* Past cb dc dct coefficient. */
} Block;
解析塊的語法結構是:
block(i)
{
if(pattern_code[i])
{
if(macroblock_intra)
{
if(i<4)
{
dct_dc_size_luminance
if(dc_size_luminance!=0)
dct_dc_differential
}
else
{
dct_dc_size_chrominance
if(dc_size_chrominance!=0)
dct_dc_differential
}
}
else
{
dct_coeff_first
}
if(picture_coding_type!=4)
{
while(nextbits()!=’10’)
dct_coeff_next
end_of_block
}
}
}
附錄
文中部分代碼中的數據類型與標準C中數據類型對應關係:
typedef int INT32;
typedef short INT16;
typedef char INT8;
#endif
typedef unsigned int UINT32;
typedef unsigned short UINT16;
typedef unsigned char UINT8;
xmplay-1.1這個播放器的源碼,對幫助理解mpeg1結構頗有幫助,同時這也是一個編碼和解碼器,以及數據分析器,在internet上面能夠搜所到
下面是另外一篇博文中的,和上面結合起來看比較好。(http://blog.sina.com.cn/s/blog_5f5ad6a90100dqzt.html)
MPEG文件格式附表
縮寫 | 全名 | 長度 | 內容 | |
程序層 | SHC | Sequence Header Code | 32 | 程序層開始碼 |
HS | Horizontal Size | 12 | 畫面的橫向像素 | |
VS | Vertical Size | 12 | 像素的縱向掃描條數 | |
PAR | Pel Aspect Ratio | 4 | 像素間的長寬比 | |
PR | Picture Rate | 4 | 畫面顯示的週期 | |
BR | Bit Rate | 18 | 限制產生的位元數量而將 位元速率分割成400bps |
|
MB | Marker Bit | 1 | ||
VBS | VBV ( Video BuFrameering Verifer BuFrameer Size ) |
10 | 制編碼發生量的虛擬 緩衝器大小的參數. VBV=16x1024xBS |
|
CPF | Constrained Parameters Flag | 1 | 各參數在控制量內 | |
LIQM IQM |
Load Intra Quantize Matrix Intra Quantize Matrix |
1 8x64 |
內部MB用量子化矩陣數據 存在的Intra MB用量子化矩陣 |
|
LNIQM NIQM |
Load Non Intra Quantize Matrix Non Intra Quantize Matrix |
1 8x64 |
非內部MB用量子化矩陣數據 存在非Intra MB用量子化矩陣 |
|
ESC SED |
Extension Start Code Sequence Extension Data |
32 8xn |
擴充數據的開始碼 | |
UDSC UD |
User Data Start Code User Data |
32 8xn |
User Data的開始碼 User Data |
|
SEC | Sequence End Code | 32 | 程序終了碼 | |
GOP層 | GSC | Group Start Code | 32 | GOP開始碼 |
TC | Time Code | 25 | 時間碼 | |
CG | Close GOP | 1 | GOP內畫面可自其餘的 GOP作獨立撥放 | |
BL | Broken Link | 1 | 爲前一GOP數據的編輯 而沒法使用 |
|
ESC GED |
Extension Start Code Group Extension Data |
32 8xn |
||
UDSC UD |
User Data Start Code User Data |
32 8xn |
User Data | |
PSC | Picture Start Code | 32 | Picture層的開始碼 | |
TR | Temporal Reference | 10 | 以Picture連續的序號作GOP 的欄重設之0124殘餘值 |
|
畫面層 | PCT | Picture Coding Type | 3 | 表示Picture的型態 |
VD | VBV Dalay | 16 | 隨機存取時 BuFrameer初始狀態的記數 |
|
FPEV | Full pel Forward Vector | 1 | 以整數或半像素單位 作動態向量的單位 |
|
FRAME | Forward f Code | 3 | 順向動態向量的描述範圍 | |
C | ||||
FPBV | Full Pel Backward | 1 | 以整數或半像素單位 作動態向量的精度 |
|
BFC | Vector | |||
Backward Code | 3 | 反向動態向量的技術範圍 | ||
EBP | Extra Bit Picture | 1xn | 其餘畫面資訊 | |
EIP | Extra information Picture | 8xn | 未來 | |
EBP | Extra Bit Picture | 1 | 無EIP時以'0'表示 | |
ESC | Extra Start Code | 32 | 未來 | |
PED | Picture Extension Code | 8xn | User Data | |
UDSC | User Data Start Code | 32 | ||
UD | User Data | 8xn | ||
切面層 | SSC QS |
Start Code Quantizer Scale |
32 5 |
切片開始時以該切片層作量子化 |
EBS EIS |
Extra Bit Extra Information |
1xn 8xn |
表示其餘切片層的資訊 | |
EBS | 16 | 無EIS時以0表示 | ||
巨集區塊層 | MB STUFF |
Macroblock Stuffing | 11 | 編碼量不足時之Dummycode |
MB | Macroblock Escape | 11 | 至關33個MB Space | |
MBAI | Macroblock Address Increment | 1-11 | 前有Scape時MB數+1 自VLC畫面的又端表示MB+1 |
|
SSC | Start Code | 1-8 | MB編碼模式的VLC | |
QS | Quantizer scale | 5 | 以MB以後的量子化步驟值 | |
MHF MHV |
Motion Horzontal Forward Code Motion Forward Motion Vertical Forward Code Motion Vertical Backward |
1-11 1-6 1-11 1-6 |
以MB順向的動態向量水平份量與前較量的微分以反方向表示的VLC作編碼與順向動態向量的垂直份量的MHB表現相同 | |
MHB MVB |
Motion Horzontal Backward Code Motion Backward Motion Vertical Backward Motion |
1-11 1-6 1-14 1-6 |
以MB順向的動態向量水平份量 與前較量的微分以反方向表示 的VLC作編碼與反向動態向量的 垂直份量的MHB表現相同 |
|
CPB | Coded Block Pattem | 3-9 | 表是否有MB內6個區塊係數的 VLC |
|
EOM | End of Mircoblock | 1 | 只有B Fram纔有表MB終了 | |
區塊層 | DDSL DDSC DDCD |
DCT DC Size Luminance DCT DC Size Chrominance DCT DC Differential |
2-7 2-8 1-8 |
表示下一DCT DC微分的位元數 該區塊的DC份量與 前區塊的份量的微分 |
CDF | DCT Coefficient First | 2-28 | DC份量的VLC | |
DCN EOB |
DCT Coefficient Next End of Block |
3-28 2 |
將DCT係數依DC份量順序送出 以非0的細數與其前爲0的係數 組合的VLC在該區塊後的係數 全以0表示 |