淺壓縮又稱夾層壓縮,是一種視頻壓縮級別,可以有效降低視頻帶寬,并能保持視頻整體質量,壓縮比通常為2:1到8:1。根據這一壓縮比,4K、8K節目都可以用10G接口進行傳輸,這極大降低了網絡設備成本。LiveVideoStackCon 2023上海站邀請到楊海濤老師為我們介紹AVS標準組以及上海海思等硬件廠商在無損質量等級視頻淺壓縮領域的實踐與探索。
文/楊海濤
非常榮幸能夠有機會和大家交流AVS最新制定的視頻壓縮標準——感知無損壓縮。顧名思義,感知無損強調壓縮圖像的質量達到無損等級。最開始時起名是輕壓縮,與重壓縮相對,主要強調在編解碼的過程中相對較低的計算復雜度。之后從效果考慮,又將其稱為淺壓縮,相對于深壓縮,淺壓縮更加強調較低的壓縮比。在標準即將定稿時,AVS標準組內達成一致——PLC,即感知無損壓縮,強調壓縮視頻的質量等級。 今天我將會從應用與需求、AVS PLC標準概述、高性能并行處理機制、底層編碼工具、CVR碼控與質量優化以及未來展望六個部分展開介紹。
-01-
應用與需求
淺壓縮應用的場景是顯示接口和內容制作。這兩個場景平時H.265以及AVS系列壓縮是沒有涉及的。顯示接口包括HDMI、DP等接口,包括有線無線的傳輸,它們共同的特點是信道的帶寬非常充裕,隨之而來要求無損的畫質。在這些接口上傳輸的內容都達到了數字無損的質量等級,沒有任何的失真。 既然質量這么好,為什么還要壓縮呢? 以DP1.4標準為例,其帶寬是32Gbps,在這樣的帶寬下,如果不做任何的壓縮直接傳輸信號,可以傳一路4K60幀每秒的數據。但如果做一個8K60幀每秒的數據傳輸,這樣的物理信道沒有辦法承載。
面對這些問題,一種辦法是將物理信道繼續拓寬,將線加粗,但這種方法并不是特別的方便,線加粗了可能就沒有辦法彎折。另一個辦法就是去進行壓縮,減低物理帶寬的要求,這就是接口壓縮。在內容制作方面,通常前端的專業攝像機會采集yuv或者rgb格式的信號,傳遞到媒體工作站以后再編輯內容,所有的工作都在磁盤文件上進行,磁盤的讀寫是一個非常大的瓶頸。目前解決的辦法是在信號到達媒體工作站以后轉化成一種非常方便編輯的格式,這種格式要求必須是單張圖片的編解碼,而不允許圖像間的預測編碼。這樣每張圖片編輯之后,內容可以直接進行儲存。
在技術需求上淺壓縮與深壓縮有很大的區別。淺壓縮的內容不僅直接會在顯示屏上顯示,還會在后臺進行分發域編碼,從而作為母本使用。其色彩格式通常都是yuv444、rgb等非常高質量的格式。 淺壓縮的色彩位深在標準里面是支持8-16比特。同時支持信號無損和視覺無損。淺壓縮典型的壓縮比是3倍到10倍,這與視頻分發有顯著的不同。在進行H.265編碼時,典型的碼率,例如1080p,通常會在2兆到4兆之間,這已經是非常高質量的視頻了。典型壓縮比在200:1,甚至500:1,這是所謂的深壓縮或者重壓縮。從這里就可以明顯的看到使用淺壓縮,即便壓縮完其碼率也會達到百兆或者千兆的量級。
另一個非常大的區別在于淺壓縮要求非常低的延遲,特別是接口的壓縮要求,做到行級的延遲。淺壓縮還要求高并行度。淺壓縮信號規格非常高,這樣的內容做信號做實時處理一定要并行。還有一點值得一提,淺壓縮因為要考慮成本以及在特定場景是否能真正使用,所以在標準制定的過程中,自身就帶有碼控算法。隨機訪問剛剛已經提到,不管是制作域還是接口,都要求單張圖片的隨機存取。低復雜度在顯示接口和內容制作兩個領域有一點不同。內容制作對于成本的要求相對寬松,因為其編解碼器實現很多是基于工作站的軟件實現。但是工作接口的標準實現最終是在芯片中,而芯片會廣泛的嵌入到各種消費設備中,對于成本的約束非常緊,在標準指定中就需要控制算法的復雜度。在內容制作中還有一個特殊的要求,在多次迭代編碼的過程中不引入顯著的質量劣化。
-02-
AVS PLC標準概述
2021年8月的會議上,我們正式提出了標準的需求。AVS標準組之前沒有為淺壓縮制定過標準,國內也沒有相應的標準。所以在制定標準的時候,仔細地討論了不同應用的不同需求,提出了定bpp壓縮而非定比壓縮、像素行級地延遲、規定碼控模型和區分顯示接口與制作域需求技術需求四個方面的需求。 之后我們收到了兩份CfP技術方案,這兩個方案都是很好的嘗試,但是在評估過程中發現了一些問題。首先我們提出的標準和碼控是強結合的,但是收到的方案中并沒有碼控的部分。另外,方案應受到硬件的約束,以便在低成本的接口芯片中實現。在發現這些問題之后,我們成立了淺壓縮專題組,通過“云封閉開發”的方式工作。 標準的制定可以分為如下幾個階段: 2022年3月,此時的重點在控制邊解碼器成本。6月份,我們完善了基礎的碼控算法,提供了一個CBR的碼控模型。之后更進一步優化硬件流水方案。 在2022年年底的時候,再一次面向低成本進行一次收斂,成為業界最優的低成本方案。 2023年的3月份,針對擴展測試所發現的質量問題又進行了一輪技術的研討和收斂。最后在4月,完成了標準制定并發布了FCD版本。
質量評估采用非常高質量的圖片,包括RGB和YUV444兩種格式,主要覆蓋的位深為8比特和10比特,16比特也在后期的拓展中進行了非常充分的評估。 內容分為兩類,一類是攝像機采集的自然內容,一類是計算機生成內容。具體的評估參考了ISO29170-2標準。該標準包含兩部分:一部分是交替閃爍法,一部分是并排對比法。 交替閃爍法是指將編碼前和編碼后的圖像,按照8赫茲交替播放,如果能看到任何閃爍,就說明圖像質量不過關。
這是一個非常嚴格標準。在實際使用過程中,并沒有條件去看到編碼前的圖像,所以并排對比法更為常用。該方法是在兩個屏幕或者一個屏幕分為兩半,展示相同的部分,同時指出失真的地方,即交替閃爍法閃爍的地方,讓大家觀看。如果大家看不到,則通過測試。在測試時對測試設備有一定的要求。首先要確認顯示器、播放設備支持高比特位深,還要保證顯示接口未對傳輸圖像做任何處理,如果還不放心可以使用灰階樣圖驗證是否具有高位深顯示能力。 在實際操作時發現,不管是8比特的顯示器還是10比特的顯示器,在發生失真的時候,交替閃爍法測試其失真強度都是一致的,所以在后續標準制定過程中,為了簡化并且讓更多的單位參與進來,就使用8比特的顯示器進行所有的測試。
今年4月份AVS標準組在鵬城實驗室組織了一場非常詳細的測試:使用27張測試圖片,包括相機采集以及計算機生成的圖片,覆蓋了RGB、YUV444等多種格式。經過數據的篩選和分析,最終27條內容中25條通過了閃爍測試,27條全部通過了并排對比測試。
除了對PLC標準方案做通過性畫質評估,也和業界已有的DSC規范進行了對比評估,評估結果如左下角的表格所示。
這是標準的架構圖。整張圖像傳輸進來以后,會進行Slice劃分。由于塊的高度決定緩存的行數,所以將其劃分成16*2大小的CU。另外,盡管標準文本中含有DCT變換模塊,但為達成低成本目標,在接口與幀存兩個檔次中都關閉了DCT。
-03-
高性能并行處理機制
底層并行是指三個分量并行進行熵編碼和熵解碼的操作。 熵編碼是視頻編解碼過程中的瓶頸所在,為了解決這樣的瓶頸問題,真正達到8k 60幀或者120幀的實時編解碼,就需要對各個分量進行并行處理。將每個分量的壓縮碼流獨立打包,使得每個分量都有自己獨立的熵編碼器和熵解碼器。再通過子流交織的操作,保證三個分量是同步的。
右上角是子流片的格式。子流片的大小和處理圖像的位深有關。以16*2大小的CU為例,10比特的內容,乘以32,原始數值就是320比特。再加上16比特的頭開銷。在數據payload前會加一個二比特的數據頭,這個數據頭會說明子流片屬于哪個YUV的分量,在解碼的過程中就可以進行區分。在編碼端輸入圖像之后,會輸出YUV三個分量的語法元素。語法元素在等待進行熵編碼的操作時,會分發到各自所屬的熵編碼器,編碼完之后會打成子流片。然后放在三個分量各自的位流緩沖區里,在統一機制下,進行子流片的交織,形成單一的碼流,傳遞到解碼端,從而保證分量的同步,而不出現任何錯誤。解碼端在接收到單一的碼流之后,首先要做的事情就是解交織,解交織之后,把三個分量對應的子流片分別放到各自的位置緩沖區里解碼,得到最終的重建的像素。
YUV的三個分量或者RGB編程YCOCG之后其信號復雜度是不同的。Y分量比較難編碼,一個編碼塊編碼后產生的Y分量與UV分量的子流片數量可能極不均衡。采用編碼端的子流交織機制可保證解碼端同時拿到一個編碼塊的三個分量的編碼數據。編碼端會根據YUV三個分量的復雜度進行緩沖,保證解碼端不需要再做任何額外的緩沖。
高層并行更好理解,指拿到圖像之后,劃成矩形的條帶——slice。各個slice之間可以進行并行編碼,本質上是一個可伸縮的架構,隨著視頻規格的上升,例如從4k到8k,從30幀到60幀,想支持更高的規格,在硬件設計時只要添加更多的處理單元或者硬件核即可。 需要特別提出,條帶的劃分只有在水平方向并排排列的條帶才可以進行并行處理。核心原因在于硬件處理圖像時是按照一行一行像素進行處理的。解碼端需要保證解碼完一行或者兩行之后立刻進行輸出。
這一行可能分屬于不同的slice,例如slice0和slice1,這個時候就需要一些特殊的操作。簡單的方法也有,每一行打一個slice,這樣的方法當然可以,但是slice之間是沒有空間預測的,壓縮效率非常差,所以設置一個較大的slice仍然是必要的。Slice0 和slice1每編碼完一個高度為2的塊行,會進行碼流的交織。接收端需要設置slice塊行數據的位流緩沖區,這樣才能保證同時將slice0和slice1的第1行數據送到不同的硬件核上進行解碼。這是一個和硬件耦合非常緊密的設計。
-04-
底層編碼工具
底層工具可以簡單的分為兩類,一類是常規的編碼工具,一類是異常處理工具。 常規編碼工具,主要用于提供基礎的壓縮效率。出于成本的考慮,我們選擇了三種工具。首先塊預測主要依靠上面一行的像素,以及左邊重建的像素,進行方向性的角度預測。其優勢在于具有非常高的并行度,框內所有像素都可以同時獲得其預測值,但是在紋理變化區域就沒有辦法進行很好的適配。右上角的點預測則可以很好地處理這種復雜紋理的圖像。通過在每一個像素點上進行獨立的預測、殘差編碼和重建,第1個像素點的重建會被用作相鄰的第2個像素點的預測。該方式的預測效率是最高的,但有一個非常致命的問題,其硬件性能非常差。為此我們進行了一些約束,在一個塊所有像素進行處理時,保證其需要串行處理的像素數量最大為3。
首先進行偶數列的預測,使用黃色的像素點預測塊里面第1行的像素。在獲得第1行像素之后,再繼續向下預測以獲得第2行的像素。完成這兩步之后利用左右的水平方向的預測進行所有奇數列像素點的預測和編碼。最后一個工具是塊復制,主要用于處理屏幕內容。面向顯示的壓縮所處理很多內容都是由計算機生成的,比如辦公軟件word、Excel等文檔中的文字、表格邊框等。這些內容的典型特征是有非常銳利的邊緣以及非常豐富的高頻,重復性也非常強。通過以2×2為塊單位的塊復制能夠達到很好的效果,在典型內容上能夠獲得遠高于塊預測和點預測的壓縮效率。三個常規工具組合在一起,提供了非常好的基礎壓縮效率支撐。 兩個異常處理工具,第一個是原始值模式。這個模式就是 PCM模式,主要為了防止編碼膨脹。
在一些特殊的情況下預測編碼,反而會使得編碼之后的比特數高于直接編碼原始值的比特數,一旦發現這種情況就需要退回到原始值的編碼。第二個模式是回退模式。因為我們耦合了一個CBR碼控,碼控的核心是確定QP,確定QP之后編碼出來的比特其實與預計的目標還是有上下浮動的情況,即碼控不可能做到比特級的精準。這就需要有一種機制能夠強制地將壓縮比特控制在一個閾值之下,避免buffer的溢出。這個回退模式更多的進行兜底處理。
在實踐過程中,我們發現16x2塊級的預測并不能夠非常好的適配紋理內容突變的場景。通過不斷探索,我們發現將預測做到子塊級可以很好的解決上述的問題。 為此我們開發了相應的幾個算法:第一個算法是直接劃分更小的子塊,每個子塊獨立進行DC預測,這樣的擴展確實能夠減輕主觀失真。第二個算法是子塊DC補償。
一個編碼完成后,如果它的平坦區域編碼效果不理想,可以通過這樣的補救措施,在4×2或者8×1的級別上額外的傳輸原始值與當前重建值的差值,在補償之后效果明顯提高,編碼質量非常好。 在很多典型圖像里,文字之間背景是平坦的,但文字之內是非常復雜的,通常會采用塊復制的方式處理。如果文字間隔能夠使用空間預測,例如豎直方向的預測等,可以顯著改善文字之間水平方向的條狀失真。右上角的子塊插值預測是為了處理一種比較少見但對畫質影響很大的情況。
如果當前編碼塊的所有預測方法都已失效,例如當前編碼塊是一個平坦的塊,但無論是上方還是左方的參考都是噪聲,沒有辦法獲得有效的預測值,則可能在這個平坦區域帶來人眼可察覺的編碼失真。這個問題可以通過直接編碼整個塊的DC值,再去編碼塊里每個像素相對于DC值的差值。該模式下,當前圖像塊來是完全獨立編碼的,不依賴左側和上方的像素。所有模式結合起來,在一些非常小的、非常容易忽略的地方,甚至特別敏感的平坦區,都會有很好的處理效果。
無論預測模式多差,如果能夠用非常小的量化補償進行處理,其主觀效果都可以接受,無非多花一點比特而已。但這就對量化機制提出了要求,需要其支撐非常精細的調節。 與一般標準不同的是,我們的標準基于右移量化。以AVS為例,AVS2和AVS3是進行分數量化。QP每增加8,量化步長就會加倍。精細的調節一個量化操作,通常包含一個乘法和一個右移的操作。頻繁的進行高性能處理,對于硬件來說是一個很大的問題。所以我們取消了乘法操作,把量化簡單的化簡為右移。沒有乘法也就意味著量化步長就是不斷q step加倍的過程。量化是分不同等級的。CU級量化會根據塊的復雜度在編碼端進行分析。分別分析亮度和色度,來劃分其屬于哪一個復雜度等級,從而推導出對應的QP。
QP的推導過程是編、解碼端同時進行的,這與傳統編解碼標準不同。傳統的分發域重壓縮標準,QP會在編碼端推導出來之后再傳遞給解碼端。除了CU的基礎QP,在每一個2×2的子塊,還可以進行額外的調節。根據當前此塊上參考的紋理復雜度分析,如果判斷當前子塊比較平坦,會額外在CU QP基礎上進行減1或者減2的操作,用更高質量進行編碼;如果子塊比較復雜,就維持CU QP不變。 除了子塊量化,還有逐點量化,逐點量化是跟上文提到的點預測組合應用的。如果一個點的殘差比較大,就說明這個區域是難以預測的,QP需要相對分配的較大一點,反之則說明區域比較好預測,是一個平坦區域。平坦區域需要進行重點的保護,需要將QP進一步的減小。
系數編碼的核心概念是在每個系數分組上進行半定長編碼。在高性能處理中是沒有辦法進行變長編碼的,處理性能不符合要求。半定長編碼會在一個系數組中所包含的殘差中尋找其公共碼長,并在編碼塊的頭信息里面傳遞。用同樣的長度對系數組內所有殘差做定長編碼,對熵編碼的性能有非常大的提升。
RDO計算是編碼側一種操作。這里需要特別指出,由于采用的是CBR碼控,要保證buffer不溢出,在選擇RDO的過程中更加傾向于低比特。RGB的內容會轉化成YCoCg之后再進行編碼。 在高層并行時,矩形slice需要進行并行處理。圖像的寬和高都要和CU的16×2進行對齊。常見的對齊方法是大家所熟悉的padding。Padding有兩種方法,一種是在圖像的右側進行,其優點在于復雜度較低,但編碼可能會不均衡。第二種方法是在每個slice的右側做,可以解決編碼不均衡的問題,但同時會面臨另外一個問題——每一個硬件的核心都需要進行填充,會帶來額外的成本增加。標準中同時支持了兩種padding的方式,大家可以按需選擇。
-05-
CBR碼控與質量優化
上圖是H.264標準中描述的漏桶模型,編碼一個塊時會把它的編碼比特輸出到碼控buffer里通過constant bit rate平滑處理。由于塊的復雜度不斷變化,有復雜的噪聲區,也有很簡單的平坦區,所以在定速率處理完每個塊時,真正進入到buffer的碼率是波動的。
碼控有兩個主要的輸入,第一個輸入是當前塊兒到底是復雜還是簡單?第二個輸入是buffer目前到底是空還是滿?碼控的輸出是亮度分量與色度分量的QP。核心思想在于判斷圖像編碼中一個編碼塊之前所有塊整體是好編還是難編。當然只有這些信息是不夠的,在前面所有塊處理完之后,會對塊的復雜度做一個簡單的分類,將其分為5個復雜度等級。每一個等級會有對應預測編碼比特,這樣就有了較為充分的信息,從而對當前的塊進行更好的碼率規劃以及碼率分配。
碼控對于最終的壓縮效率影響可以達到10%甚至20%多,碼控相對應也要進行一些調優。最開始分析塊時,決定當前塊是復雜還是簡單。如何定義復雜與簡單,并不是僅僅看紋理的復雜度,實質上復雜與簡單,是好編與難編的同義詞。即使是看起來很復雜的塊,如果能夠編成很小的塊,它依然是一個簡單塊。為此我們進行了一個區分,如果一個屏幕內容能夠用塊復制很好去壓縮,也會將其認為是一個簡單塊。這樣的操作,對于質量的改善是非常明顯的。 在整體碼控中特別需要關注平坦區。在一個復雜區域中間的平坦區是最難處理的地方。在處理這些地方時,會首先判斷目前buffer是否滿,如果buffer不是很滿,即便一個相對簡單的內容,也會為其分配更多的比特來保證區域的質量。在加入上述碼控調優之后,復雜區域中間的平坦區域的質量有非常顯著的提升。
在碼控最開始的時候,存在一個delay,其作用是為了在buffer里累積一定量的初始比特。這樣在后面進行CBR傳輸時,可避免發生buffer下溢的情況。即便發生了buffer下溢,標準中也存在下溢填充的機制進行兜底。碼控需要使用buffer充溢度作為輸入。但是在slice初始與結尾時,真實水位并不匹配碼控需求。這兩個地方需要用虛擬的buffer充溢度進行碼控調節。壓縮非常依賴上方參考的像素行,如果上方像素行不可得,會出現較大的編碼壓力。如果上方像素行不可得,需要為第一行的像素分配更多的比特,使其有更好的質量,避免slice的邊界出現失真。首列也存在相似的問題。首列左側的像素也是不可得,這會對塊復制產生影響。塊復制向左搜不到時,會向上搜索以提升重建圖像質量。
-06-
未來展望
目前已經啟動了面向制作域的AVS422和AVS444的壓縮。這里也分為兩部分。一部分是攝像機側,或者說采集域做視頻壓縮??梢詳U展目前僅支持40的AVS3標準方案來支持42以及44色彩格式,從而可以使用專業攝像機采集并壓縮更高色彩保真度的視頻內容。具體到制作域,其壓縮需求又有些許不同。AVS標準組也正計劃做一個新的制作域標準,從而滿足對軟件非常友好的高并行度、低復雜度的制作域單幀編輯操作需求。另外在三維醫學影像編碼領域,要求做到數學無損,或者主觀無損,從技術上也可以歸到淺壓縮,在這里AVS標準組進行了統一的標準規劃。
編輯:黃飛
?
評論
查看更多