H264格式具体说明
一 H.264句法1.1元素分層結(jié)構(gòu)H.264編碼器輸出的Bit流中,每一個Bit都隸屬于某個句法元素。句法元素被組織成有層次的結(jié)構(gòu),分別描寫敘述各個 一 H.264句法
1.1元素分層結(jié)構(gòu)
H.264編碼器輸出的Bit流中,每一個Bit都隸屬于某個句法元素。句法元素被組織成有層次的結(jié)構(gòu),分別描寫敘述各個層次的信息。
圖1
H.264分層結(jié)構(gòu)由五層組成,各自是序列參數(shù)集、圖像參數(shù)集、片(Slice)、和宏塊和子塊。參數(shù)集是一個獨立的數(shù)據(jù)單位,不依賴于參數(shù)集外的其他句法元素。圖2描寫敘述了參數(shù)集與參數(shù)集外的句法元素之間的關(guān)系。
圖2
一個參數(shù)集不正確應(yīng)某一個特定的圖像或序列,同一序列參數(shù)集能夠被多個圖像參數(shù)集引用,同理,同一個圖像參數(shù)集也能夠被多個圖像引用。僅僅在編碼器覺得須要更新參數(shù)集的內(nèi)容時,才會發(fā)出新的參數(shù)集。
在H.264中,圖像以序列為單位進(jìn)行組織。一個序列的第一個圖像叫做IDR圖像,IDR圖像都是I幀,H.264引入IDR圖像為了解碼的同步,當(dāng)解碼 器解碼到IDR圖像時,馬上將參考幀隊列清空,將已解碼的數(shù)據(jù)所有輸出或拋棄,又一次查找參數(shù)集,開始一個新的序列。這樣,假設(shè)前一個序列出現(xiàn)重大錯誤,在 這里能夠獲得又一次同步的機會。IDR圖像之后的圖像永遠(yuǎn)不會使用IDR之前的圖像的數(shù)據(jù)來解碼。
IDR是I幀,但I(xiàn)幀不一定是IDR。I幀之后的圖像有可能會使用I幀之前的圖像做運動參考。
1.2描寫敘述子
描寫敘述子描寫敘述從Bit流中取出句法元素的方法。
編號
語法
說明
1
ae(e)
CABAC
2
b(8)
讀進(jìn)連續(xù)的8個Bit
3
ce(v)
CAvlc
4
f(n)
讀進(jìn)連續(xù)的n個Bit
5
i(n)/i(v)
讀進(jìn)連續(xù)的若干Bit,并把它們解釋為有符號整數(shù)
6
me(v)
映射指數(shù)Golomb熵編碼
7
se(v)
有符號指數(shù)Golomb熵編碼
8
te(v)
截斷指數(shù)Golomb熵編碼
9
u(n)/u(v)
讀進(jìn)連續(xù)的若干Bit,并把它們解釋為無符號整數(shù)
10
ue(v)
無符號指數(shù)Golomb熵編碼
表1
1.3句法的表示方法
句法元素的名稱由小寫字母和一系列下劃線組成,變量名稱是大寫和小寫字母組成,中間沒有下劃線。
二 句法表
定義了H.264的句法,指明在碼流中依次出現(xiàn)的句法元素及它們出現(xiàn)的條件、提取描寫敘述子等。句法表是分層嵌套的。
句法表中的C字段表示該句法元素的分類,這是為片區(qū)服務(wù),分類的詳細(xì)含義例如以下表描寫敘述。
nal_unit_type
NAL類型
C
0
未使用
1
不分區(qū)、非IDR的片
2,3,4
2
片分區(qū)A
2
3
片分區(qū)B
3
4
版分區(qū)C
4
5
IDR圖像中的片
2,3
6
補充增強信息單元(SEI)
5
7
序列參數(shù)集
0
8
圖像參數(shù)集
1
9
分界符
6
10
序列結(jié)束
7
11
碼流結(jié)束
8
12
填充
9
13..23
保留
24..31
不保留
表2
2.1 NAL語法
編碼器將每一個NAL各自獨立、完整地放入一個分組,由于分組都有頭部,解碼器能夠方便地檢測出NAL的分界,并依次取出NAL進(jìn)行解碼。
每一個NAL前有一個起始碼 0x000001,解碼器檢測每一個起始碼,作為一個NAL的起始標(biāo)識,當(dāng)檢測到下一個起始碼時,當(dāng)前NAL結(jié)束。同一時候H.264規(guī)定,當(dāng)檢測到 0x000000時,也能夠表征當(dāng)前NAL的結(jié)束。對于NAL中數(shù)據(jù)出現(xiàn)0x000001或0x000000時,H.264引入了防止競爭機制,假設(shè)編碼 器檢測到NAL數(shù)據(jù)存在0x000001或0x000000時,編碼器會在最后個字節(jié)前插入一個新的字節(jié)0x03,這樣:
0x000000->0x00000300
0x000001->0x00000301
0x000002->0x00000302
0x000003->0x00000303
解碼器檢測到0x000003時,把03拋棄,恢復(fù)原始數(shù)據(jù)。
解碼器在解碼時,首先逐個字節(jié)讀取NAL的數(shù)據(jù),統(tǒng)計NAL的長度,然后再開始解碼。
句法
C
Desc
nal_nuit(NumBytesInNALunit){/* NumBytesInNALunit為統(tǒng)計出來的數(shù)據(jù)長度 */
forbidden_zero_bit /* 等于0 */
All
f(1)
nal_ref_idc/* 當(dāng)前NAL的優(yōu)先級,取值范圍0-3 */
All
u(2)
nal_unit_type /* NAL類型,見表2描寫敘述 */
All
u(5)
NumBytesInRBSP=0
for(i=1;i<NumBytesInNALunit;i++){
if(i+2<NumBytesInNALunit && next_bits(24)==0x000003{
/* 0x000003偽起始碼,須要刪除0x03這個字節(jié) */
rbsp_byte[NumBytesInRBSP++]
All
b(8)
rbsp_byte[NumBytesInRBSP++]
All
b(8)
i+=2/* 取出前兩個0x00后,跳過0x03 */
emulation_prevention_three_byte/* equal to 0x03 */
All
f(8)
}else{
rbsp_byte[NumBytesInRBSP++] /* 繼續(xù)讀取后面的字節(jié) */
All
b(8)
}
}
表3
2.2序列參數(shù)集(SPS)
句法
C
Desc
seq_parameter_set_rbsp(){
profile_idc/* 指明所用的Profile */
0
u(8)
constraint_set0_flag
0
u(1)
constraint_set1_flag
0
u(1)
constraint_set1_flag
0
u(1)
reserved_zero_5bits /* equal to 0 */
0
u(5)
level_idc /* 指明所用的Level */
0
u(8)
seq_parameter_set_id /* 指明本序列參數(shù)集的id號,0-31,被圖像集引用,編碼須要產(chǎn)生新的序列集時,使用新的id,而不是改變原來參數(shù)集的內(nèi)容 */
0
ue(v)
log2_max_frame_num_minus4/* 為讀取元素frame_num服務(wù),frame_num標(biāo)識圖像的解碼順序,frame_num的解碼函數(shù)是ue(v),當(dāng)中 v=log2_max_frame_num_minus4+4,該元素同一時候指明frame_num的最大值MaxFrameNum=2( log2_max_frame_num_minus4+4)*/
0
ue(v)
pic_order_cnt_type /* 指明poc的編碼方法,poc標(biāo)識圖像的播放順序,poc能夠由frame_num計算,也能夠顯示傳送。poc共三種計算方式 */
0
ue(v)
if(pic_order_cnt_type==0)
log2_max_pic_order_cnt_lsb_minus4 /* 指明變量MaxPicOrderCntLsb的值, MaxPicOrderCntLsb=2(log2_max_pic_order_cnt_lsb_minus4+4) */
0
ue(v)
else if(pic_order_cnt_type==1){
delta_pic_order_always_zero_flag /* 等于1時,元素delta_pic_order_cnt[0]和delta_pic_order_cnt[1]不在片頭中出現(xiàn),而且它們的默認(rèn)值是0,等于0時,上述兩元素出現(xiàn)的片頭中 */
0
u(1)
offset_for_non_ref_pic /* 用來計算非參考幀或場的poc,[-231,231-1] */
0
se(v)
offset_for_top_to_bottom_field/* 計算幀的底場的poc */
0
se(v)
num_ref_frames_inpic_order_cnt_cycle /* 用來解碼poc,[0.255] */
0
ue(v)
for(i=0;i<num_ref_frames_inpic_order_cnt_cycle;i++)
offset_for_ref_frame[i]/* 用來解碼poc,對于循環(huán)中的每一個元素指定一個偏移 */
0
se(v)
}
num_ref_frames /* 參考幀隊列可達(dá)到的最大長度,[0,16] */
0
ue(v)
gaps_in_frame_num_value_allowed_flag /* 為1,同意slice header中的frame_num不連續(xù) */
0
u(1)
pic_width_inmbs_minus1 /* 本元素加1,指明以宏塊為單位的圖像寬度 PicWidthInMbs=pic_width_in_mbs_minus1+1 */
0
ue(v)
pic_height_in_map_units_minus1 /* 本元素加1,指明以宏塊為單位的圖像高寬度 PicHeightInMapUnitsMbs=pic_height_in_map_units_minus1+1 */
0
ue(v)
frame_mbs_only_flag /* 等于0表示本序列中全部圖像均為幀編碼;等于1,表示可能是幀,也可能場或幀場自適應(yīng),詳細(xì)編碼方式由其他元素決定。結(jié)合前一元 素:FrameHeightInMbs=(2-frame_mbs_only_flag)*PicHeightInMapUnits */
0
ue(v)
if(frame_mbs_only_flag)
mb_adaptiv_frame_field_flag /* 指明本序列是否是幀場自適應(yīng)模式:
frame_mbs_only_flag=1,所有是幀
frame_mbs_only_flag=0, mb_adaptiv_frame_field_flag=0,幀場共存
frame_mbs_only_flag=0, mb_adaptiv_frame_field_flag=1,幀場自適應(yīng)和場共存*/
0
u(1)
direct_8x8_inference_flag /* 用于指明B片的直接和skip模式下的運動矢量的計算方式 */
0
u(1)
frame_cropping_flag /* 解碼器是否要將圖像裁剪后輸出,假設(shè)是,后面為裁剪的左右上下的寬度 */
0
u(1)
if(frame_cropping_flag){
frame_crop_left_offset
0
ue(1)
frame_crop_right_offset
0
ue(1)
frame_crop_top_offset
0
ue(1)
frame_crop_bottom_offset
0
ue(1)
}
vui_parameters_present_flag /* 指明vui子結(jié)構(gòu)是否出如今碼流中,vui子結(jié)構(gòu)在附錄中指明,用于表征視頻 格式的信息 */
0
u(1)
if(vui_parameters_present_flag)
vui_parameters()
0
rbsp_trailing_bits()
0
}
表4
?
總結(jié)
以上是生活随笔為你收集整理的H264格式具体说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 命令之 yum -- 基于
- 下一篇: 三星推出 85 英寸户外电视,价格高达