轉自:http://blog.sina.com.cn/s/blog_786eaa330100rp9e.html
一、JSVM配置文件簡介
配置文件的位置在JSVM\H264Extension\data 中
1.MVC.cfg是# JSVM Configuration File in AVC mode,也就是AVC的編碼配置文件。畢竟JSVM是支持AVC編碼的嘛。如果是研究SVC,基本上不怎麼用這個配置文件。
2.encoder.cfg是最主要的JSVM配置文件,# JSVM Main Configuration File。指定輸出文件名、待編碼幀數、CGS或者是MGS、GOP大小、參考幀數目、基本層編碼模式和運動搜索、層數、每一層的配置文件叫什麼名字、環路濾波等等.不指定輸入文件哦
3.layer-i.cfg是第i層的配置文件,注意:layer-i.cfg文件主要是對空域可伸縮而言,layer0就是基本層了,其他空域增強層。雖然在主配置文件encoder.cfg中,對時域、空域和質量都有設置,只是空域可伸縮的設置參數是單獨拿出來的。在layer-i.cfg中,是此層的輸入文件大小、輸入文件名、重建文件名、輸入輸出幀率、QP之類的,不同的是多了:NumFGSLayers、FGSMotion、InterLayerPred和BaseQuality,分別表示細粒度可伸縮層(即質量增強層)的層數、是否在FGS層中的改善運動矢量、本層是否採用層間預測、本層基本質量層的質量級別(貌似是針對質量分層而言)。
二、如何配置出各種可分級?
1.時間可分級由GOPSize、FrameRate、FrameRateOut控制,目前只能按照二進制的那種分級。
一個GOP是包括了一個Keypicture和相鄰Keypicture之間的B picture。GOP大小必須是2的倍數。因爲要時域分層。所以如果在encoder.cfg中設定GOPSize=16,FrameRate=30,若分爲3層,則在layer0的FrameRateout=7.5.那layer0的GOP實際上=4。layer1的FrameRateout=15,那layer1的GOP實際上是8,同樣layer2的GOP就是16.
依據是JSVM9.19中的代碼:
iGOPSize = (Int)floor( 0.5F + iGOPSize / (dMaximumFrameRate / (Float) (m_pcH264AVCEncoder->getCodingParameter()->getLayerParameters(0).m_dOutputFrameRate)) );
翻譯成僞代碼:本層實際的GOPSize=取整數(總的GOPSize/(總的FrameRate/本層的FrameRateout))
至於原理上的理解,只要看一下時間可分級的圖就行了。對於時間可分級,反正高層總是包含低層的幀。
2.質量可分級由CgsSnrRefinement 控制質量分級。(CGS或MGS)
3.空間可分級:各個layer-i.cfg中的分辨率設置不一樣就是空間可分級了。設置的一樣就是隻有質量可分級。
JSVM 目前只支持 3 個 D 層。所謂D層可以理解爲空間可分級,在每一個D層裏還可以根據QP的不同劃分不同的Q層、根據不同幀率劃分的T層。可以參考問號的blog:(D層就是指dependency_id相同的coded slice的組合)
1.layer representation:對於一幅圖像,具有相同dependency_id和quality_id的所有coded slices的組合。
2. dependency representation:對於一幅圖像,具有相同dependency_id的所有coded slices組合。
3. access unit:對於一幅圖像,所有的dependency representation再加上相關的non-VCL NAL units。
4. scalable layer:具有相同dependency_id、quality_id和temporal_id的所有layer representation的組合。
5. dependency layer:具有相同dependency_id的scalable layer組合。
6. base layer:dependency_id、quality_id都爲0的layer representation。
4.如何組合?
a.想設置有兩層空間分辨率,每層又有兩個質量層,那麼可以:
a.1:encoder.cfg中設置輸入四層,然後layer0和layer1有相同的空間分辨率和不同的QP值,layer2和layer3有相同的空間分辨率和不同的QP值。(空間可分級+CGS)。不過CGS貌似會自動控制QP。
a.2:encoder.cfg中設置輸入2層,然後然後layer0和layer1有不同的空間分辨率,在每一個layer配置中都啓用MGSVectorMode,設置16個係數的其中兩個(和爲16)。(空間可分級+MGS)
注:MGSVector是一種質量分級的方法。即表示把 16 個係數中的幾個單獨分成一個質量層(一個 4x4 變換塊有 16 個殘差係數,分層傳輸)。 |
實例!!!:
1.只要時間可分級
配置:encoder.cfg中,把NumLayers設成1,LayerCfg指定爲layer0.cfg,FrameRate設爲30,然後GOPSize=4;CgsSnrRefinement此時無效
layer0.cfg中,FrameRateIn設爲30,FrameRateOut設爲30;
執行:H264AVCEcoderLibTestStatic –pf encoder.cfg
實驗結果:GOPSize=4,編出來有3個時間層:幀率分別爲30、15、7.
實驗結果:GOPSize=2,編出來有2個時間層:幀率分別爲30、15
實驗結果:GOPSize=1,編出來有1個時間層:幀率爲30
下圖是GOPSize=2的截圖,採用命令BitStreamExtractorStaticxxx.264查看
2.只要空間可分級
配置:encoder.cfg中,把NumLayers設成2,LayerCfg指定爲layer0.cfg和layer1.cfg,FrameRate設爲15,然後GOPSize=1;CgsSnrRefinement=0,但此時無效(因爲分辨率不同);
Layer1.cfg中,輸入FOREMAN_352x288_30.yuv,分辨率設爲352x288,FrameRateIn設爲15,FrameRateOut設爲15;
Layer0.cfg中,輸入FOREMAN_176x144_15.yuv,分辨率設爲176x144,FrameRateIn設爲15,FrameRateOut設爲15;
實驗結果:
3.只要質量可分級(CGS)
配置:encoder.cfg中,把NumLayers設成2,LayerCfg指定爲layer0.cfg和layer1.cfg,FrameRate設爲30,然後GOPSize=1;CgsSnrRefinement=0;
Layer1.cfg中,輸入FOREMAN_352x288_30.yuv,分辨率設爲352x288,FrameRateIn設爲30,FrameRateOut設爲30;
Layer0.cfg中,輸入FOREMAN_352x288_30.yuv,分辨率設爲352x288,FrameRateIn設爲30,FrameRateOut設爲30;
實驗結果:注意,CGS屬於空間可分級的一種特殊形式。JSVM把它的輸出結果按照空間可分級形式表示了(D層一樣)。其實分辨率是一樣的,但是一個QP是32,一個QP是26。(JSVM自動分配)
4.只要質量可分級(MGS)
配置:encoder.cfg中,把NumLayers設成2,LayerCfg指定爲layer0.cfg和layer1.cfg,FrameRate設爲30,然後GOPSize=1;CgsSnrRefinement=1;
Layer1.cfg中,輸入FOREMAN_352x288_30.yuv,分辨率設爲352x288,FrameRateIn設爲30,FrameRateOut設爲30;
Layer0.cfg中,輸入FOREMAN_352x288_30.yuv,分辨率設爲352x288,FrameRateIn設爲30,FrameRateOut設爲30;
實驗結果:注意,這裏與CGS不同的是D層一樣,但Q層不一樣,這纔是JSVM眼中正統的質量可分級
注意:還有一種方式實現MGS,是用MGSVectorMode,但是沒有試驗成功,可能必須要混合可分級時才能用MGSVectorMode
5.混合可分級,按照前面四種自由組合即可