二、slice頭的三個(gè)子語法項(xiàng)目
1.ref_pic_list_reordering( ) 參考圖像列表重排序語法
$ 上面已經(jīng)提到,編碼器給每個(gè)參考幀都會(huì)分配一個(gè)唯一 性的標(biāo)識(shí),即句法元素frame_num。但是,當(dāng)編碼器要指定當(dāng)前圖像的參考圖像時(shí),并不是直接指定該圖像的frame_num 值,而是使用通過下面步驟最終得出的 ref_id 號(hào):frame_num -> PicNum -> ref_id。從frame_num 到變換到變量PicNum 主要是考慮到場模式的需要,當(dāng)序列中允許出現(xiàn)場時(shí),每個(gè)非場的圖像(幀或 幀場自適應(yīng))解碼后必須分解為一個(gè)場對(duì),從而需要為它們分解后的兩個(gè)場各自指定一個(gè)標(biāo)識(shí);進(jìn)一步從PicNum到ref_id 是為了能節(jié)省碼流,因?yàn)镻icNum的值通常都比較大。 編碼器和解碼器都同步地維護(hù)一個(gè)參考幀隊(duì)列, 每解碼一個(gè)片就將該隊(duì)列刷新一次, 把各圖像按照特定的規(guī)則進(jìn)行排序, 排序后各圖像在隊(duì)列中的序號(hào)就是該圖像的ref_id 值。(所謂的重排序,其實(shí)就是指刷新PicNum和ref_id的值)。
$ 本語法中的各元素只在 slice_type != I && slice_type != SI 情況下才有效,即當(dāng)前片不是I片和SI片(說明當(dāng)前片是需要參考圖像的片,如果是I或SI片,那就不需要參考圖像,既然不需要參考圖像,又何來重排序一 說)。
$ ref_pic_list_reordering_flag_l0 指明是否進(jìn)行重排序操作, 這個(gè)句法元素等于1 時(shí)表明緊跟著會(huì)有一系列句法元素用于參考幀隊(duì)列的重排序。如果進(jìn)行重排序,表示會(huì)刷新各個(gè)參考圖像的PicNum和ref_id值;如果不重新排序,各參 考圖像的ref_id值還和解碼上一個(gè)片時(shí)一樣。因?yàn)橐粋€(gè)圖像可以分成多個(gè)片,因此一個(gè)圖像內(nèi)的不同片可以使用不同的參考圖像,對(duì)不同的參考圖像又可以分 配不同的參考號(hào)。
$ reordering_of_pic_nums_idc 指明執(zhí)行哪種重排序操作,取值范圍0-3。取不同值時(shí)對(duì)應(yīng)的意義如下: 0 短期參考幀重排序,abs_diff_pic_num_minus1 會(huì)出現(xiàn)在碼流中,從當(dāng)前圖像的PicNum減去(abs_diff_pic_num_minus1 + 1) 后指明需要重排序的圖像。 1 短期參考幀重排序,abs_diff_pic_num_minus1 會(huì)出現(xiàn)在碼流中,從當(dāng)前圖像的PicNum加上(abs_diff_pic_num_minus1 + 1) 后指明需要重排序的圖像。 2 長期參考幀重排序,long_term_pic_num會(huì)出現(xiàn)在碼流中,指明需要重排序的圖像。 3 結(jié)束符。 其中,“當(dāng)前圖像的PicNum”,即CurrPicNum的計(jì)算方法,在上面講frame_num時(shí)提到了,很簡單。即如果當(dāng)前圖像是場圖像,那么 CurrPicNum就是frame_num乘2加1(這個(gè)值代表,把之前所有的參考幀都折合成兩個(gè)場后,當(dāng)前場圖像是第幾個(gè)場);否 則,CurrPicNum就是frame_num(這個(gè)值代表,把以前所有的參考圖像都折合成幀來計(jì)算,當(dāng)前幀圖像是第幾幀)。 這個(gè)語法元素將循環(huán)出現(xiàn),每一個(gè)元素描述一個(gè)參考圖像,如果有多個(gè)參考圖像,這個(gè)元素就會(huì)循環(huán)出現(xiàn)多次,直到遇到reordering_of_pic_nums_idc=3(結(jié)束符)時(shí)停止循環(huán)。
$ abs_diff_pic_num_minus1 在對(duì)短期參考幀重排序時(shí)指明重排序圖像與當(dāng)前的差。 $ long_term_pic_num 在對(duì)長期參考幀重排序時(shí)指明重排序圖像。這兩個(gè)元素的意義和出現(xiàn)的條件都在reordering_of_pic_nums_idc的介紹中剛提到了。
$ 上面元素都是用于列表List0的。如果當(dāng)前片是B片,那么還會(huì)有一組對(duì)應(yīng)的用于List1的元素,基本是上面介紹的四個(gè)元素的拷貝,只不過 ref_pic_list_reordering_flag_l0要變成ref_pic_list_reordering_flag_l1。
2.dec_ref_pic_marking( ) 解碼的參考圖像標(biāo)識(shí)語法
$ 上面介紹的重排序(reordering)操作是對(duì)參考幀隊(duì)列重新排序,而標(biāo)記(marking)操作負(fù)責(zé)將參考圖像移入或移出參考幀隊(duì)列、指定參考圖像的符號(hào)。
$ 語法元素 no_output_of_prior_pics_flag、long_term_reference_flag 、adaptive_ref_pic_marking_mode_flag 、memory_management_control_operation、difference_of_pic_nums_minus1、 long_term_frame_idx 、long_term_pic_ num 和 max_long_term_frame_idx_plus1 這些都表示參考圖像的符號(hào)。 參考圖像的符號(hào)可以是“未用于參考”、“用于短期參考”或“用于長期參考”, 但是只能是這三個(gè)中的一個(gè)。當(dāng)一個(gè)參考圖像是指被標(biāo)記為“用于參考”時(shí),表示共同引用了被標(biāo)記為“用于長期參考”或“用于短期參考”的圖像(但不是同時(shí)引 用兩者)。一個(gè)被標(biāo)記為“用于短期參考”的參考圖像表示一個(gè)短期參考圖像,被標(biāo)記為“用于長期參考”的圖像表示一個(gè)長期參考圖像。
$ no_output_of_prior_pics_flag 表示在解碼圖像緩沖器中先前解碼的圖像在一個(gè)IDR 圖像解碼之后是如何處理的,指明是否要將前面已解碼的重建圖像全部輸出(清空),但不管是否清空,之前的重建圖像都不會(huì)再用作本序列圖像解碼時(shí)的參考。當(dāng) 該IDR 圖像是比特流中第一個(gè)IDR 圖像時(shí),no_output_of_prior_pics_flag 的值在解碼過程中將不生效;當(dāng)該IDR 圖像不是比特流中的第一個(gè) IDR 圖像時(shí),如果從活動(dòng)的視頻序列參數(shù)集中得到的PicWidthInMbs, 、FrameHeightInMbs 或 max_dec_frame_buffering 的值與從先前序列活動(dòng)時(shí)的視頻序列參數(shù)集中得到的PicWidthInMbs, 、FrameHeightInMbs或max_dec_frame_buffering 的值不同時(shí),不管no_output_of_prior_pics_flag的實(shí)際值是什么,解碼器可能會(huì)推斷 no_output_of_prior_pics_flag 等于1。 本元素存在條件: NAL單元中的nal_unit_type = = 5,即當(dāng)前幀是IDR。
$ long_term_reference_flag 等于0 表示變量MaxLongTermFrameIdx 被設(shè)為等于“無長期幀序號(hào)”而且該IDR圖像被標(biāo)記為“用于短期參考”。long_term_reference_flag 等于 1 表示變量MaxLongTermFrameIdx被設(shè)為等于0而當(dāng)前的IDR 圖像被標(biāo)記為“用于長期參考”并且LongTermFrameIdx被分配為等于0。當(dāng)序列參數(shù)集中的num_ref_frames等于0時(shí)(num_ref_frames規(guī)定了可能在視頻序列中任何圖像幀間預(yù)測的解碼過程中用到的短期參考幀和長期參考幀、互補(bǔ)參考場對(duì)以及不成對(duì)的參考場的最大數(shù)量,它等于0說明根本無參考幀),long_term_reference_flag應(yīng)該也等于 0。 本元素存在條件:同上。
$ 上面兩個(gè)元素都是只出現(xiàn)在IDR中,如果當(dāng)前幀不是IDR,那么下面的幾個(gè)元素將會(huì)根據(jù)條件出現(xiàn);而如果當(dāng)前是IDR,下面的元素都不會(huì)出現(xiàn)。介紹下面幾個(gè)元素提到存在條件時(shí)將不再重復(fù)聲明這一點(diǎn)。
$ adaptive_ref_pic_marking_mode_flag:指明標(biāo)記(marking)操作的模式;當(dāng)當(dāng)前被標(biāo) 記為“用于長期參考”的幀數(shù)、附加場對(duì)和非成對(duì)的場等于 Max( num_ref_frames, 1 ) 時(shí)(num_ref_frames可能是0),adaptive_ref_pic_marking_mode_flag 將等于 1。
如果這個(gè)元素為0,那么下面的幾個(gè)元素將不會(huì)出現(xiàn)。只有本元素為1,下面的元素才會(huì)出現(xiàn)。介紹下面幾個(gè)元素提到存在條件時(shí)將不再重復(fù)聲明這一點(diǎn)
$ memory_management_control_operation 自適應(yīng)參考圖像符號(hào)模式中,指明本次操作的具體內(nèi)容。
$ difference_of_pic_nums_minus1 : 當(dāng)memory_management_control_operation等于 3 或1 時(shí),由這個(gè)元素可以計(jì)算得到需要操作的圖像在短期參考隊(duì)列中的序號(hào)。參考幀隊(duì)列中必須存在這個(gè)圖像。 $ long_term_pic_num 當(dāng)memory_management_control_operation 等于2 時(shí), 從此句法元素得到所要操作的長期參考圖像的序號(hào)。 $ long_term_frame_idx 當(dāng) memory_management_control_operation等于3 或6 ,分配一個(gè)長期參考幀的序號(hào)給一個(gè)圖像。 $ max_long_term_frame_idx_plus1:此句法元素減1 ,指明長期參考隊(duì)列的最大數(shù)目取值的范圍 0 - num_ref_frames。其中,num_ref_frames在序列參數(shù)集中指明,代表本序列中最大的參考幀數(shù)量。
3.pred_weight_table( ) 預(yù)測加權(quán)表格語法
$ luma_log2_weight_denom 給出參考幀列表中參考圖像所有亮度的加權(quán)系數(shù),是個(gè)初始值。luma_log2_weight_denom 值的范圍是 0 to 7,它相當(dāng)于為每個(gè)參考圖像都分配了一個(gè)默認(rèn)的權(quán)重。具體作用在下面的元素還會(huì)提到。
$ chroma_log2_weight_denom 給出參考幀列表中參考圖像所有色度的加權(quán)系數(shù),是個(gè)初始值chroma_log2_weight_denom 值的范圍是 0 to 7。 存在條件:在比較老的H.264的版本中,這個(gè)元素跟上個(gè)元素一樣,都是沒有條件的;但在后來新出的版本中,序列參數(shù)集里新增了一些元素以支持更多 的“profile”,其中有一個(gè)新增元素是chroma_format_idc,但只有當(dāng)使用新出的高級(jí)的profile時(shí)(具體使用哪個(gè) profile由序列參數(shù)集中的profile_idc指明),這個(gè)元素才會(huì)出現(xiàn)在序列參數(shù)集里,它指明了色彩模式,即YUV格式,只有當(dāng) chroma_format_idc 不為0時(shí)(如果chroma_format_idc為0,則表示YUV=4:0:0,純灰度圖像),chroma_log2_weight_denom才 存在,也就是說只要當(dāng)前圖像是彩色圖像就會(huì)出現(xiàn)chroma_log2_weight_denom。還有很重要的一點(diǎn),就是兼容的問題,H.264新版本 中,如果在序列參數(shù)集中沒有檢測到chroma_format_idc元素,那么就會(huì)默認(rèn)chroma_format_idc=1,表示 YUV=4:2:0,這恰好是舊版本的默認(rèn)格式,因此對(duì)于舊版本H.264編碼后的圖像,雖然碼流中沒有出現(xiàn)chroma_format_idc,但依然 可由新版本H.264正確解碼。
$ luma_weight_l0_flag 等于 1 時(shí),指的是在參考圖像序列 0 中的亮度的加權(quán)系數(shù)存在;等于 0 時(shí),在參考序列0 中的亮度的加權(quán)系數(shù)不存在。 如果luma_weight_l0_flag 等于 1,即亮度的加權(quán)系數(shù)存在,那么luma_weight_l0[ i ]和luma_offset_l0[ i ]也會(huì)出現(xiàn),這兩個(gè)之和就代表實(shí)際的加權(quán)系數(shù)。 luma_weight_l0[i ]表示用參考序列 0 預(yù)測亮度值時(shí),所用的加權(quán)系數(shù)。如果luma_weight_l0_flag is = 0, luma_weight_l0[ i ] = 2 ^luma_log2_weight_denom,這就用到了上面剛說到的luma_log2_weight_denom初始化元素。 luma_offset_l0[i ]表示加權(quán)系數(shù)的額外偏移,luma_offset_l0[i ] 值的范圍–128 to 127 。如果 luma_weight_l0_flag is = 0,luma_offset_l0[ i ] = 0。 這一組元素(上面這三個(gè)元素,我暫時(shí)稱他們?yōu)橐粋€(gè)“亮度權(quán)重元素組”)在碼流中將循環(huán)出現(xiàn),循環(huán)次數(shù)為 num_ref_idx_l0_active_minus1+1,代表List0中參考圖像的數(shù)目 (num_ref_idx_l0_active_minus1的含義上面已介紹),這也是為什么元素luma_weight_l0[ i ]和luma_offset_l0[ i ]中會(huì)出現(xiàn)角標(biāo)“i”,因?yàn)槲覀円獮閰⒖紙D像列表中的每一個(gè)圖像都分配一個(gè)亮度預(yù)測權(quán)重值。 這三個(gè)元素,都是針對(duì)圖像序列List0的。當(dāng)當(dāng)前圖像時(shí)B幀時(shí),還會(huì)出現(xiàn)另一組與List1相關(guān)的元素,也是三個(gè),跟上面介紹的三個(gè)一樣,就是元素名中的 “l(fā)0” 變成“l(fā)1”,各元素出現(xiàn)的條件和意義都跟上面介紹過的三個(gè)類似。
$ 上面那組元素,指定了各個(gè)參考幀進(jìn)行亮度預(yù)測時(shí)的權(quán)重,而在彩色圖像中,除了亮度,色度預(yù)測也需要分配一個(gè)權(quán)重,因此就有了跟上面的亮度權(quán)重元素組對(duì)應(yīng)的色度權(quán)重元素組,這組元素也是循環(huán)出現(xiàn),每一組色度權(quán)重元素組緊跟在一個(gè)亮度權(quán)重元素組后面。 chroma_weight_l0_flag: 其作用與luma_weight_l0_flag類似,只不過針對(duì)的是色度。 chroma_weight_l0[i ][ j ] ,chroma_offset_l0[ i ][ j ] :與luma_weight_l0[ i ]和luma_offset_l0[ i ]類似。這里多出了一個(gè)角標(biāo)j,這里j的取值是0和1,這是因?yàn)樯扔袃煞N,分別是Cr和Cb(或者叫U和V),這兩種色度要分開處理。 同剛才提到的chroma_log2_weight_denom一樣,這幾個(gè)元素在舊的H.264和新版的H.264中有不同的存在條件,在舊版中,它們 都無條件存在(舊版大都默認(rèn)YUV=4:2:0),而在新版中,要依賴當(dāng)前圖像的色彩模式,只要圖像不是純灰度的(序列參數(shù)集中的 chroma_format_idc不為0),這些元素就存在。 上面這幾個(gè)元素都針對(duì)List0,如果當(dāng)前幀是B 幀,同樣會(huì)有一組一樣的關(guān)于List1的元素,只是把元素名中的 “l(fā)0” 換成“l(fā)1”。各元素出現(xiàn)的條件和意義都跟上面介紹過的三個(gè)類似。
|
|