1. SVC基礎知識
關(guān)于SVC的基本意義,可以參看【1】【2】【3】中的論述。SVC(scalable video coding)的可分級視頻編碼概念,簡(jiǎn)而言之,就是把視頻序列分成不同的部分并賦予不同的等級,這樣的思想已經(jīng)淵源流傳,并非H.264/SVC所獨創(chuàng )。2007年由ITU推出的H.264/SVC標準,繼承了H.264的高效壓縮性,隨著(zhù)網(wǎng)絡(luò )應用的普及,SVC的靈活碼流適應性和對不同終端產(chǎn)品的匹配性,顯得尤為重要。
SVC對分級的策略是從時(shí)間,空間和質(zhì)量上,對視頻序列進(jìn)行分級編碼(如下圖)
下面,將詳細描述一下SVC怎么在這些方向進(jìn)行分級的:
(1)時(shí)間分級(Temporal Scalability)
時(shí)間分級就是給序列的視頻幀分配不同的重要等級,以便于在實(shí)際應用中按重要程度顯示幀(或在惡劣網(wǎng)絡(luò )條件下主動(dòng)放棄低等級的幀)。其實(shí)現方式是采用如下圖所示的hierarchical B結構??梢园凑站唧w應用來(lái)設計分等級的B幀結構,然后組織起一個(gè)個(gè)GOP,再架構成整個(gè)編碼序列。由于H.264/AVC中允許進(jìn)行參考幀管理,使得時(shí)間分級可以直接利用這一特性得以實(shí)現。
(2)空間分級(Spatial Scalability)
空間分級的用于形成不同的圖像(幀)分辨率,在實(shí)際應用中可以給不同顯示屏幕的終端設備提供適配的畫(huà)面,以達到提高帶寬使用率的目的。具體的變現如上面的圖,是在不同的分辨率序列層中進(jìn)行預測,利用去相關(guān)性節省碼流。在SVC中,除了提供傳統的層間intra預測(Inter-layer intra prediction),還提供層間宏塊模式與運動(dòng)預測(Inter-layer macroblock mode and motion prediction)和層間殘差預測(Inter-layer residual prediction),這三種模式可以充分利用圖像的時(shí)間和空間相關(guān)性進(jìn)行分級編碼,
i. 層間intra預測(Inter-layer intra prediction)
這種預測方式的宏塊信息完全由層間參考幀(一般是低分辨率的重建幀)通過(guò)上采樣預測得到,在H.262/MPEG-2 Video, H.263, 和 MPEG-4等編碼模式中也經(jīng)常被用到,但是這種方式缺乏消除時(shí)間相關(guān)性所得到的碼率削減。
ii. 層間宏塊模式與運動(dòng)預測(Inter-layer macroblock mode and motion prediction)
宏塊使用類(lèi)似AVC的幀間預測進(jìn)行編碼,其宏塊模式采用層間參考幀相應塊的模式,其對應的運動(dòng)矢量也利用層間參考幀相應塊的運動(dòng)信息進(jìn)行預測編碼。這就是所謂的層間運動(dòng)預測(inter-layer motion prediction)。
iii. 層間殘差預測(Inter-layer residual prediction)
利用殘差的層間相關(guān)性,可以對于幀間預測的圖像繼續進(jìn)行層間預測,以進(jìn)一步削減碼流。
三種層間預測的概要圖示如下:
在【1】中提到一個(gè)SVC設計的重要特性,每個(gè)空間增強層可以在單一的運動(dòng)補償環(huán)中解碼。在對一個(gè)目標幀的解碼中,其空間參考幀需要重建自己層間預測相關(guān)的intra-coded宏塊和殘差塊,并對自己的運動(dòng)矢量進(jìn)行解碼,運動(dòng)補償和對幀間預測的去方塊濾波僅在目標幀中進(jìn)行。
(3)質(zhì)量分級(Quality Scalability)
質(zhì)量分級往往可以被認為是一種特殊(解析度相同)的空間分級編碼,因此傳統的coarse-grain quality scalable coding (CGS,粗粒度質(zhì)量分級編碼)很容易被想到,而在實(shí)際應用中,還發(fā)展了medium-grain quality scalability (MGS,中等粒度質(zhì)量分級編碼),下面將分別描述他們:
i. CGS
CGS有類(lèi)似空間分級中層間預測,但是無(wú)需有上采樣的過(guò)程,為了更好的視頻質(zhì)量需要呈現更多的圖像紋理,因此,在質(zhì)量分層的層間預測中,對紋理的提純通常通過(guò)采用更小量化步長(cháng)的重新量化。為了減少計算復雜性,用于層間intra預測的參考幀deblocking被忽略,而且層間intra預測和層間殘差預測將在DCT系數階段被直接處理。
ii. MGS
由于CGS對碼率控制不能靈活處理,一種叫MGS的衍生方式被提出采用,MGS可以靈活的權衡漂移(draft,運動(dòng)補償預測循環(huán)中的編解碼不同步)和層次預測的編碼效率。下面的圖,藍色的表示用于基礎質(zhì)量序列,紅色表示較好質(zhì)量的序列,可以根據策略靈活組合他們之間的參考關(guān)系。
其中上圖(c)(d)就是MGS的靈活方式。以(d)來(lái)說(shuō),就是對有黑色標注的Key picture,用基礎質(zhì)量圖像做參考,而對非Key picture使用較好質(zhì)量的圖像做參考,一旦增強層丟包,則可能造成drift,drift被控制在兩個(gè)Key picture之間。
對于質(zhì)量分級,SVC還支持兩個(gè)特性,Partitioning of transform coefficients和SVC-to-AVC rewriting,前者提供用slice來(lái)分散增強層變換系數的方法,以便于同一增強層數據被分散到幾個(gè)包中,后者提供了SVC-》AVC的轉碼便利。
至此,SVC的基礎入門(mén)概念就描述完了,下面將要開(kāi)始看看怎么使用JSVM來(lái)做分層編解碼實(shí)驗。
2. JSVM基礎實(shí)驗
(1)編碼實(shí)驗
jsvm的實(shí)驗可以從編碼開(kāi)始,編譯完JSVM代碼后,可以運行H264AVCEncoderLibTestStaticd.exe來(lái)進(jìn)行SVC編碼,在這里的基礎實(shí)現中首先關(guān)注spatial scalability的編碼,通??梢越Y合temporary scalability一起進(jìn)行。用以下命令運行編碼:
H264AVCEncoderLibTestStaticd -pf encoder.cfg
這里僅僅使用最簡(jiǎn)單的參數:
文件encoder.cfg
********************************************************
# Scalable H.264/AVC Extension Configuration File
OutputFile D:\workspace\264\svctest.264 # Bitstream file
FrameRate 25 # Maximum frame rate [Hz]
FramesToBeEncoded 32 # Number of frames (at input frame rate)
GOPSize 8 # GOP Size (at maximum frame rate)
BaseLayerMode 2 # Base layer mode (0: AVC w larger DPB,
# 1:AVC compatible, 2:AVC w subseq SEI)
SearchMode 4 # Search mode (0:BlockSearch, 4:FastSearch)
SearchRange 32 # Search range (Full Pel)
#============================== LAYER DEFINITION ==============================
NumLayers 2 # Number of layers
LayerCfg layer0.cfg # Layer configuration file
LayerCfg layer1.cfg # Layer configuration file
**************************************************************************************
文件 layer0.cfg
**************************************************************************************
# Layer Configuration File
#============================== INPUT / OUTPUT ==============================
SourceWidth 176 # Input frame width
SourceHeight 144 # Input frame height
FrameRateIn 25 # Input frame rate [Hz]
FrameRateOut 25 # Output frame rate [Hz]
InputFile D:\workspace\264\mobile_qcif.yuv # Input file
ReconFile rec_layer0.yuv # Reconstructed file
SymbolMode 0 # 0=CAVLC, 1=CABAC
****************************************************************************************
文件 layer1.cfg
****************************************************************************************
# Layer Configuration File
#============================== INPUT / OUTPUT ==============================
SourceWidth 352 # Input frame width
SourceHeight 288 # Input frame height
FrameRateIn 25 # Input frame rate [Hz]
FrameRateOut 25 # Output frame rate [Hz]
InputFile D:\workspace\264\mobile_cif.yuv # Input file
ReconFile rec_layer1.yuv # Reconstructed file
SymbolMode 0 # 0=CAVLC, 1=CABAC
InterLayerPred 2 # Inter-layer Prediction (0: no, 1: yes, 2:adaptive)
UseESS 1 # ESS
ESSCropWidth 352 # cropping width
ESSCropHeight 288 # cropping height
ESSOriginX 0 # cropping origin X
ESSOriginY 0 # cropping origin Y
ESSChromaPhaseX 0 # chroma phase x 0 or -1, default = -1
ESSChromaPhaseY 0 # chroma phase y -1 to +1, default = 0
ESSBaseChromaPhaseX 0 # base chroma phase x 0 or -1, default = -1
ESSBaseChromaPhaseY 0 # base chroma phase y -1 to +1, default = 0 0
****************************************************************************************
本實(shí)驗將編碼雙層的SVC文件,分別包含352x288和176x144兩個(gè)分辨率,需要注意的是這里需要輸入的是兩個(gè)分辨率對應的YUV文件,在開(kāi)發(fā)實(shí)際應用中,將是對輸入的高分辨率視頻按需求進(jìn)行下采樣得到相應低分辨率的輸入碼流。理解上面的配置文件可以閱讀JSVM的“SoftwareManual.doc”。
一下是實(shí)驗結果
*****************************初始實(shí)驗結果***************************************
JSVM 9.15 Encoder
profile & level info:
=====================
DQ= 0: Main @ Level 1.1
DQ= 16: Scalable High @ Level 2.1
AU 0: I T0 L0 Q0 QP 28 Y 35.0921 U 36.6779 V 36.4204 66768 bit
0: I T0 L1 Q0 QP 28 Y 35.4271 U 37.4696 V 37.2485 206872 bit
AU 8: P T0 L0 Q0 QP 28 Y 34.7829 U 37.1181 V 36.7810 26280 bit
8: P T0 L1 Q0 QP 28 Y 35.4518 U 37.6578 V 37.4747 101464 bit
AU 4: B T1 L0 Q0 QP 31 Y 32.5973 U 36.1283 V 35.5269 4264 bit
4: B T1 L1 Q0 QP 31 Y 32.8378 U 36.9262 V 36.4150 21624 bit
AU 2: B T2 L0 Q0 QP 33 Y 31.7760 U 35.9120 V 35.3318 2272 bit
2: B T2 L1 Q0 QP 33 Y 32.1271 U 36.4808 V 35.9225 11352 bit
AU 1: B T3 L0 Q0 QP 34 Y 31.9559 U 36.2816 V 35.7872 1136 bit
1: B T3 L1 Q0 QP 34 Y 31.4860 U 36.5493 V 36.0923 5672 bit
AU 3: B T3 L0 Q0 QP 34 Y 31.1236 U 35.5697 V 34.9500 1136 bit
3: B T3 L1 Q0 QP 34 Y 31.2954 U 36.0335 V 35.5473 6056 bit
AU 6: B T2 L0 Q0 QP 33 Y 31.6214 U 35.7877 V 35.3442 2368 bit
6: B T2 L1 Q0 QP 33 Y 32.0268 U 36.4989 V 36.0755 11080 bit
AU 5: B T3 L0 Q0 QP 34 Y 31.2529 U 35.3809 V 34.8735 1296 bit
5: B T3 L1 Q0 QP 34 Y 31.4222 U 36.0127 V 35.4764 6200 bit
AU 7: B T3 L0 Q0 QP 34 Y 31.8522 U 35.9385 V 35.6081 1064 bit
7: B T3 L1 Q0 QP 34 Y 31.7233 U 36.4942 V 36.0999 6768 bit
.
.
.
SUMMARY:
bitrate Min-bitr Y-PSNR U-PSNR V-PSNR
--------- ---------- -------- -------- --------
176x144 @ 3.1250 115.5750 115.5750 34.9069 37.0066 36.5668
176x144 @ 6.2500 132.4000 132.4000 33.6463 36.5663 35.8824
176x144 @ 12.5000 149.7562 149.7562 32.6071 36.1343 35.3446
176x144 @ 25.0000 164.7937 164.7937 31.9890 35.8764 35.0516
352x288 @ 3.1250 514.3438 514.3438 35.4914 37.5844 37.4000
352x288 @ 6.2500 606.0562 606.0562 34.0656 37.1580 36.8032
352x288 @ 12.5000 706.5750 706.5750 33.0123 36.7826 36.3039
352x288 @ 25.0000 809.1812 809.1812 32.2313 36.4422 35.9078
**************************************************************************
從實(shí)驗結果可以看到,以8幀為一個(gè)GOP,實(shí)驗就像上面hierarchical B結構圖(a)那樣分了4個(gè)時(shí)間層次,并且分別列出兩種分辨率。從最后的統計結果可以看到,作為GOP的關(guān)鍵幀,無(wú)論是空間基礎層還是增強層都占可主要的碼流量。
(2)解碼實(shí)驗
解碼實(shí)驗將采用H264AVCDecoderLibTestStatic,解碼輸出自能得到最好的流,也就是基礎層結合增強層得到的最高層次的流,本實(shí)驗中是352x288的25幀序列。解碼過(guò)程顯示如下:
D:\workspace\project\jsvm\bin>H264AVCDecoderLibTestStaticd D:\workspace\264\svct
est.264 D:\workspace\264\rec_svc
JSVM 9.15 Decoder
---------- new ACCESS UNIT ----------
NON-VCL: SEI NAL UNIT
NON-VCL: SEQUENCE PARAMETER SET (ID=0)
NON-VCL: SUBSET SEQUENCE PARAMETER SET (ID=0)
NON-VCL: PICTURE PARAMETER SET (ID=0)
NON-VCL: PICTURE PARAMETER SET (ID=1)
NON-VCL: PICTURE PARAMETER SET (ID=2)
NON-VCL: SEI NAL UNIT
Frame 0 ( LId 0, TL 0, QL 0, AVC-I, BId-1, AP 0, QP 28 )
Frame 0 ( LId 1, TL 0, QL 0, SVC-I, BId 0, AP 1, QP 28 )
---------- new ACCESS UNIT ----------
NON-VCL: SEI NAL UNIT
Frame 8 ( LId 0, TL 0, QL 0, AVC-P, BId-1, AP 0, QP 28 )
Frame 8 ( LId 1, TL 0, QL 0, SVC-P, BId 0, AP 1, QP 28 )
---------- new ACCESS UNIT ----------
NON-VCL: SEI NAL UNIT
Frame 4 ( LId 0, TL 1, QL 0, AVC-B, BId-1, AP 0, QP 31 )
Frame 4 ( LId 1, TL 1, QL 0, SVC-B, BId 0, AP 1, QP 31 )
---------- new ACCESS UNIT ----------
NON-VCL: SEI NAL UNIT
Frame 2 ( LId 0, TL 2, QL 0, AVC-B, BId-1, AP 0, QP 33 )
Frame 2 ( LId 1, TL 2, QL 0, SVC-B, BId 0, AP 1, QP 33 )
---------- new ACCESS UNIT ----------
NON-VCL: SEI NAL UNIT
Frame 1 ( LId 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )
Frame 1 ( LId 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )
---------- new ACCESS UNIT ----------
NON-VCL: SEI NAL UNIT
Frame 3 ( LId 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )
Frame 3 ( LId 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )
---------- new ACCESS UNIT ----------
NON-VCL: SEI NAL UNIT
Frame 6 ( LId 0, TL 2, QL 0, AVC-B, BId-1, AP 0, QP 33 )
Frame 6 ( LId 1, TL 2, QL 0, SVC-B, BId 0, AP 1, QP 33 )
---------- new ACCESS UNIT ----------
NON-VCL: SEI NAL UNIT
Frame 5 ( LId 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )
Frame 5 ( LId 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )
---------- new ACCESS UNIT ----------
NON-VCL: SEI NAL UNIT
Frame 7 ( LId 0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )
Frame 7 ( LId 1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )
從上面的過(guò)程中可以看到所有的基礎層和增強層原始都被使用到了,那么要想僅僅解碼基礎層的序列該如何操作呢?就要用到下面介紹的流提取工具BitStreamExtractorStatic。
(3)流提取實(shí)驗
用BitStreamExtractorStatic提取svc文件里的相應子流,在輸入的參數不足時(shí),會(huì )列出svc文件中可以提取的各層:
D:\workspace\project\jsvm\bin>BitStreamExtractorStaticd D:\workspace\264\svctest
.264
JSVM 9.15 BitStream Extractor
Contained Layers:
====================
Layer Resolution Framerate Bitrate MinBitrate DTQ
0 176x144 3.1250 115.60 115.60 (0,0,0)
1 176x144 6.2500 132.40 132.40 (0,1,0)
2 176x144 12.5000 149.80 149.80 (0,2,0)
3 176x144 25.0000 164.80 164.80 (0,3,0)
4 352x288 3.1250 514.30 514.30 (1,0,0)
5 352x288 6.2500 606.10 606.10 (1,1,0)
6 352x288 12.5000 706.60 706.60 (1,2,0)
7 352x288 25.0000 809.20 809.20 (1,3,0)
下面是一個(gè)成取176x144的25幀率序列的實(shí)驗:
D:\workspace\project\jsvm\bin>BitStreamExtractorStaticd D:\workspace\264\svctest
.264 D:\workspace\264\ext_svc.264 -e 176x144@25:164.8
JSVM 9.15 BitStream Extractor
Contained Layers:
====================
Layer Resolution Framerate Bitrate MinBitrate DTQ
0 176x144 3.1250 115.60 115.60 (0,0,0)
1 176x144 6.2500 132.40 132.40 (0,1,0)
2 176x144 12.5000 149.80 149.80 (0,2,0)
3 176x144 25.0000 164.80 164.80 (0,3,0)
4 352x288 3.1250 514.30 514.30 (1,0,0)
5 352x288 6.2500 606.10 606.10 (1,1,0)
6 352x288 12.5000 706.60 706.60 (1,2,0)
7 352x288 25.0000 809.20 809.20 (1,3,0)
WARNING: Bit-rate underflow for extraction/inclusion point
============Extraction Information======
Extracted spatail layer : 176x144
Extracted temporal rate : 25f/s
quality_id statistics for dependency_id 0
===========================================
quality_id 0 - total: 16 retained: 16
Number of input packets: 134
Number of output packets: 99
可以對輸出的ext_svc.264文件用H264AVCDecoderLibTestStatic解碼,得到176x144的yuv。
至此,本文作為入門(mén)介紹已經(jīng)完成,JSVM還有許多輔助工具可以參照
JSVM Software Manual,本章的實(shí)驗結果可以體會(huì )到,使用JSVM編碼的好速度很慢,還沒(méi)具體統計,大約每分鐘兩三幀,而解碼在當前一般配置的雙核PC系統基本可以達到實(shí)時(shí)。下一篇文章將進(jìn)入JSVM的代碼分析。