H.264 SVC
H.264 SVC
視訊廠商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