視頻廠商POLYCOM,VIDYO和RADVISION等都推出H.264 SVC技術。針對H.264 SVC技術做個介紹。
CISCO和POLYCOM都提供了免版稅的H.264 SVC的版本。 其中open264現在最亮眼。
1. H.264 SVC是什么?
H.264SVC (Scalable Video Coding)是以H.264為基礎,在語法和工具集上進行了擴展,支持具有分級特性的碼流,H.264SVC是H.264標准的附錄G,同時作為H.264新的profile。H.264SVC在2007年10月成為正式標准。
2. SVC分級編碼的概念
編碼器產生的碼流包含一個或多個可以單獨解碼的子碼流,子碼流可以具有不同的碼率,幀率和空間分辨率。
分級的類型:
時域可分級(Temporal scalability):可以從碼流中提出具有不同幀頻的碼流。
空間可分級(Spatial scalability):可以從碼流中提出具有不同圖像尺寸的碼流。
質量可分級(Quality scalability):可以從碼流中提出具有不同圖像質量的碼流。
圖 1 分級類型示意圖
3. SVC分級編碼的應用
1. 監控領域:監控視頻流一般產生2路,1路質量好的用於存儲,1路用於預覽。用SVC編碼器可以產生2層的分級碼流,1個基本層用於預覽,1個增強層保證存儲的圖像質量是較高的。使用手機遠程監控預覽的情況下,可以產生一個低碼率的基本層。
2. 視頻會議領域:視頻會議終端利用SVC編出多分辨率,分層質量,會議的中心點替代傳統MCU二次編解碼方法改為視頻路由分解轉發。也可在網絡丟包環境下利用時域可分級,拋棄部分時域級實現網絡適應性。在雲視訊領域SVC也有想像空間。
3. 流媒體IPTV應用:服務器可以根據不同的網絡情況丟棄質量層,保證視頻的流暢。
4. 兼容不同網絡環境和終端的應用。
圖 2 針對不同網絡和終端的應用
4. SVC分級編碼優點缺點
優點:分級碼流優點是應用非常靈活,可以根據需要產生不同的碼流或者提取出不同的碼流。使用SVC實現一次分層編碼比用AVC編多次更高效。分層編碼有技術優勢,新的編碼器H.265也使用了分層思想,可以實現靈活的應用,也可提高網絡適應性。
缺點:分級碼流的解碼復雜度增加。基本層是AVC兼容碼流,編碼效率沒有影響。在同樣的條件下,分級碼流比單層碼流的壓縮效率要低10%左右,分級層數越多,效率下降越多,現在的JSVM編碼器最多支持3個空域分級層。在同樣的條件下,分級碼流比單層碼流的解碼計算復雜度高。SVC是2007年10月才做為正式標准,兼容性和對通性遠沒有AVC好,所以SVC實際應用不是廣泛。
圖 3 分級編碼和單層編碼效率對比
注:該圖引用自德國HHI網站。
(1)對於時域分級,AVC已經實現,時域分級對編碼效率沒有影響。
(2)質量分級如圖 3(a)所示,質量可分級碼流對編碼效率影響大約在10%。
(3)空域分級如圖 3(b)所示,SVC空域分級編碼,不只是影響整體編碼效率,對於基本層(AVC層)的編碼效率也有10%的降低,基本層編碼效率降低的原因是基本層幀內預測受限。
5. SVC對h264的技術擴展,語法擴展
語法擴展:
(1) 對NAL(Network Adaptive Layer)頭進行了擴展,用於描述碼流的分級信息。為了便於描述AVC兼容碼流的分級特性,定一個NAL類型為14的前綴NAL,該類型的NAL出現在AVC兼容碼流的NAL前面,用於描述AVC基本層碼流的分級信息。見圖 4、 圖 5。
(2) 使用保留的NAL類型14、20編碼增強層碼流。
圖 4 NAL頭擴展
圖 5 擴展NAL頭內容
技術擴展,分層編碼為了提高編碼效率,就需要最大程度的利用層間相關性。SVC增加了層間預測的工具集,主要如下:
1. 層間幀內預測(Inter-layer intra prediction)。
2. 層間宏塊模式和運動參數預測(Inter-layer macroblock mode and motion prediction)。
3. 層間殘差預測(Inter-layer residual prediction)
下面會通過圖介紹新增加的層間預測技術。
6. SVC的技術
6.1 時域分級技術
圖 6 時域分級示意圖
注:可以通過依次丟棄棕色、綠色、藍色得到不同幀頻的碼流。
6.2 空域分級技術
圖 7 空域分級示意圖
6.3 層間預測技術
圖 8 層間預測技術示意圖(左)層間幀內預測(中)層間類型預測(右) 層間殘差預測
層間幀內預測(Inter-layer intra prediction):圖像紋理復雜並且幀間搜索匹配不好的宏塊,如果基本層采用的是幀內預測,增強層可以采用層間幀內預測模式提高編碼效率。具體做法是把基本層的I塊重建上采樣得到增強層的預測,增強層只需要傳原始圖像和層間幀內預測的殘差。
層間宏塊模式和運動參數預測(Inter-layer macroblock mode and motion prediction):如圖 7所示,增強層的宏塊類型可以通過基本層預測獲取。增強層的運動參數也可以通過基本層運動參數上采樣獲取。這一點是h.264SVC和其他分級編碼技術的區別之一。其它分級編碼技術一般通過像素域的上采樣進行預測,而對於h.264SVC,認為時域相關性大的區域,利用層間的運動參數預測,在增強層做運動補償效率更高。對於層間運動參數的預測,語法支持的顆粒大小可以是一個宏塊,最小是一個8x8塊。
層間殘差預測(Inter-layer residual prediction):如圖 7所示,對於幀間編碼的宏塊,增強層的圖像殘差和基本層的圖像殘差具有相關性,可以利用基本層的殘差進行上采樣減少增強層編碼的圖像殘差。對於空間分辨率發生變化的層間殘差預測,發生在殘差像素域,計算量較大;對於空間分辨率不發生變化的層間殘差預測(質量分級),發生在變換系數或變換電平域,計算量較小。
6.4 多層碼流,只進行一次運動補償
通過技術上來保證只需要一次運動補償。因為層間預測沒有利用幀間塊的重建,所以參考層(或者稱為基本層)不需要解碼重建,層間預測使用的是運動矢量預測,對於解碼重建只需要最后做一次運動補償即可。
這樣做的好處:(1)節省計算量,降低解碼復雜度;(2)減少對解碼器對內存的需求。
6.5 分級表述的語法元素描述
Dependency_id:D層標記,也是我們常說的空域分級層標記,從0到7,最多有8個D層。基本層的值為0。CGS質量分級是特殊的空域分級。
Quality_id:MGS質量分級層標記。從0到15。
Temporal_id:時域分級標記,從0到7,最多有8個時域分級。
use_ref_base_pic_flag:MGS使用的語法。通常,都是使用當前層的重建圖像作為參考圖像,對於關鍵幀,則使用參考層的重建圖像作為參考圖像。注意區別,不是使用當前圖像的參考層重建作為參考。
discardable_flag:當前圖像沒有被作為層間參考層,則該標記置1。在碼流提取的時候,如果該層不是目標層,則會被丟棄。
6.6 使用層間預測的語法元素描述
NAL頭:no_inter_layer_pred_flag;整個slice是否啟用層間預測的開關
Sliceheader:每個宏塊自適應層間預測模式還是使用默認層間預測模式
adaptive_base_mode_flag
default_base_mode_flag
adaptive_motion_prediction_flag
default_motion_prediction_flag
adaptive_residual_prediction_flag
default_residual_prediction_flag
宏塊的層間預測模式標記:
base_mode_flag :宏塊是否使用層間類型和運動參數預測,直接使用層間預測的運動參數,碼流中不再傳。
motion_prediction_flag_l0[mb_partSize]:宏塊分割是否啟用運動矢量層間預測,這種模式還會傳層間預測運動矢量和實際運動矢量的殘差。
residual_prediction_flag:宏塊是否啟用殘差預測。
6.7 層間類型預測計算
如果base_mode_flag == 1,就需要進行層間類型預測。如果16個塊對應的參考層塊都是I塊,則當前宏塊類型是IBL;否則就是INTER_BL,運動矢量和參考索引都是從參考層預測得到,宏塊類型我們現在默認是標記為P8x8,子塊分割類型可以根據6.9節的計算得到。
6.8 層間運動矢量預測計算
對於base_mode_flag等於1的宏塊或者運動矢量使用層間預測的宏塊,在層間分辨率發生變換的情況下,存在運動矢量上采樣。下面按計算過程的步驟說明原理。
第一步:計算當前層的每個4x4塊在參考層對應位置,如果在參考層的對應位置是I塊(包含IBL),則返回-1,否則返回參考層對應4x4塊的坐標。
第二步:如果當前層宏塊的16個4x4塊在參考層對應位置都是I塊,則當前宏塊是IBL類型,不進行后續計算,否則,針對4x4塊和8x8塊出現參考是I塊的情況,用鄰近4x4塊的參考層對應塊取代,這樣就可以防止計算參考索引上采樣出現-1的情況。
第三步:按照當前層8x8塊為最小處理單元獲取運動矢量上采樣。獲取每個4x4塊的運動矢量和參考索引之后,從4個參考索引中取最小非負數為該8x8塊的參考索引。同時根據4個運動矢量的相近情況,對4個運動矢量進行后處理。
(1) 如果4個運動矢量的差的絕對值小於等於1,則對4個運動矢量取均值,得到最終的運動矢量。
(2) 如果在4x4塊排列的水平方向上,兩組2個4x4塊的運動矢量差的絕對值小於等於1,則分別對2個4x4塊的運動矢量取均值,8x8塊的分割模式為8x4。
(3) 如果在4x4塊排列的垂直方向,兩組2個4x4塊的運動矢量差的絕對值小於等於1,則分別對2個4x4塊的運動矢量取均值,8x8塊的分割模式為4x8。
注意:如圖 4所示,在空間分辨率變化為1:2的情況下,參考層的1個4x4塊對應當前層的一個8x8塊,因此運動矢量的后處理不存在。只有在限制空間分辨率為0的情況下(比如空間分辨率為1:1.5),當前層的每個8x8塊覆蓋參考層的多個4x4塊,才存在運動矢量后處理。
圖 9 運動信息層間預測示意圖
6.9 層間殘差預測計算
在層間分辨率發生變化的情況下,同時當前塊類型是幀間塊,並且residual_prediction_flag==1。這些情況都滿足的情況下存在殘差預測。
圖 10 層間殘差預測計算原理
(1)當前層的像素位置假設為(x,y),根據6.5節像素層間映射計算公式,得到參考層對應的像素位置(xRef,yRef)。
(2)如果(xRef,yRef)點和(xRef+1,yRef)點屬於同一個變換塊,根據雙線性得到一個中間結果,如上圖中黑點。同理,(xRef,yRef+1)和(xRef+1,yRef+1)點也計算得到一個中間結果。
(3)如果點(xRef,yRef)和點(xRef,yRef+1)屬於同一個變換塊,則對中間結果采取雙線性計算得到層間像素預測的最終結果,否則,y相位判斷取哪一個中間結果作為最終值。
6.10 層間像素預測計算
使用條件:當前層宏塊類型為IBL類型,即當前層宏塊的16個4x4塊在參考層中對應位置都是I塊,並且當前宏base_mode_flag==1。
圖 11 像素上采樣示意圖(亮度)
(1)首先對參考層中的I宏塊和IBL宏塊重建,在周圍P塊中做8像素擴展。
(2)計算當前宏塊(0,0)位置的點在參考層中像素對應位置,如圖中紅色點(xRef,yRef)。
(3)首先計算一組垂直4抽頭濾波的中間點。計算公式如下。
(4)在步驟(3)的基礎上,進行水平4抽頭濾波,獲得最終的上采樣結果,計算公式如下。
注:計算過程注意優化,同時要注意代碼的穩定性及字長。
6.11 空間分級編碼原理
舉例說明,兩層編碼,基本層為AVC編碼,增強層采用層間預測自適應編碼。
(1) 基本層采用AVC的編碼方式,限制條件就是幀內塊預測受限。
(2) 增強層的編碼可以利用基本層的運動矢量上采樣預測,殘差上采樣預測,I塊的像素上采樣預測,宏塊類型預測。同時增強層的宏塊也可以不采用層間預測,編碼方式類似AVC。
6.12 質量分級編碼原理
以2層的CGS(coarse-grain scalability)為例說明質量分級編碼的原理,不啟用SVC-->AVC重現選項。基本層采用AVC的編碼方式,限制條件就是幀內塊預測受限。因為分辨率不變,可以更好的利用層間預測信息。IBL類型宏塊:層間I塊,利用基本層的I塊重建作為預測,對原始圖像減去層間預測的殘差進行編碼。利用運動矢量預測的P塊:即可以直接利用基本層的運動矢量作為當前層的運動矢量,也可以利用基本層的運動矢量作為預測運動矢量,在碼流中傳運動矢量的偏移。利用變換系數域預測的P塊:增強層的殘差進行變換之后得到變換系數,減去基本層的變換系數反量化之后的值,對得到的變化系數殘差進行量化,然后進行熵編碼傳輸。
6.13 SVC------>AVC重寫工具的原理
使用提案“V-035”中的PPT中的圖說明原理。
6.14 時間分級實現方法
時域分級通過層次B幀或者層次P幀來實現,實際中一般使用層次B幀。通過語法元素中的Temporal_id標記不同的時域層,可以很方便的提取。
.
7. 參考:
1. https://en.wikipedia.org/wiki/Scalable_Video_Coding
2. http://ip.hhi.de/imagecom_G1/assets/pdfs/Overview_SVC_IEEE07.pdf
3. JVT提案“V-035” http://wftp3.itu.int/av-arch/jvt-site/2007_01_Marrakech/JVT-V035
4. http://www.polycom.com/company/news/press-releases/2012/20121004.html