(重要)JSVM中配置文件介紹以及如何配出各種可分級

轉自: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_idquality_id的所有coded slices的組合。

2. dependency representation:對於一幅圖像,具有相同dependency_id的所有coded slices組合。

3. access unit:對於一幅圖像,所有的dependency representation再加上相關的non-VCL NAL units

4. scalable layer:具有相同dependency_idquality_idtemporal_id的所有layer representation的組合。

5. dependency layer:具有相同dependency_idscalable layer組合。

6. base layerdependency_idquality_id都爲0layer 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設成1LayerCfg指定爲layer0.cfgFrameRate設爲30,然後GOPSize=4CgsSnrRefinement此時無效

layer0.cfg中,FrameRateIn設爲30FrameRateOut設爲30

執行:H264AVCEcoderLibTestStatic –pf encoder.cfg

實驗結果:GOPSize=4,編出來有3個時間層:幀率分別爲30157.

實驗結果:GOPSize=2,編出來有2個時間層:幀率分別爲3015

實驗結果:GOPSize=1,編出來有1個時間層:幀率爲30

下圖是GOPSize=2的截圖,採用命令BitStreamExtractorStaticxxx.264查看


2.只要空間可分級

配置:encoder.cfg中,把NumLayers設成2LayerCfg指定爲layer0.cfglayer1.cfgFrameRate設爲15,然後GOPSize=1CgsSnrRefinement=0,但此時無效(因爲分辨率不同)

Layer1.cfg中,輸入FOREMAN_352x288_30.yuv,分辨率設爲352x288FrameRateIn設爲15FrameRateOut設爲15

Layer0.cfg中,輸入FOREMAN_176x144_15.yuv,分辨率設爲176x144FrameRateIn設爲15FrameRateOut設爲15

實驗結果:

3.只要質量可分級(CGS)

配置:encoder.cfg中,把NumLayers設成2LayerCfg指定爲layer0.cfglayer1.cfgFrameRate設爲30,然後GOPSize=1CgsSnrRefinement=0

Layer1.cfg中,輸入FOREMAN_352x288_30.yuv,分辨率設爲352x288FrameRateIn設爲30FrameRateOut設爲30

Layer0.cfg中,輸入FOREMAN_352x288_30.yuv,分辨率設爲352x288FrameRateIn設爲30FrameRateOut設爲30

實驗結果:注意,CGS屬於空間可分級的一種特殊形式。JSVM把它的輸出結果按照空間可分級形式表示了(D層一樣)。其實分辨率是一樣的,但是一個QP32,一個QP26。(JSVM自動分配)


4.只要質量可分級(MGS)

配置:encoder.cfg中,把NumLayers設成2LayerCfg指定爲layer0.cfglayer1.cfgFrameRate設爲30,然後GOPSize=1CgsSnrRefinement=1

Layer1.cfg中,輸入FOREMAN_352x288_30.yuv,分辨率設爲352x288FrameRateIn設爲30FrameRateOut設爲30

Layer0.cfg中,輸入FOREMAN_352x288_30.yuv,分辨率設爲352x288FrameRateIn設爲30FrameRateOut設爲30

實驗結果:注意,這裏與CGS不同的是D層一樣,但Q層不一樣,這纔是JSVM眼中正統的質量可分級


注意:還有一種方式實現MGS,是用MGSVectorMode,但是沒有試驗成功,可能必須要混合可分級時才能用MGSVectorMode

5.混合可分級,按照前面四種自由組合即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章