在1995年,ITU-T總結了當時國際上視頻圖像編碼的新進展,針對低比特率視頻應用制定了H.263標準,該標準被公認為是以像素為基礎的第一代混合編碼技術方案所能達到的最佳結果。
首先,H.263標準是一個開放的標準,只規定了編碼后的碼流格式,對編碼過程中所采用的算法(如運動矢量的估計、碼流控制、差錯控制、圖像的后處理等)沒有進行限制,因此可以讓標準使用者有更多的余地進一步從理論上對算法、編碼效果等進行分析,從而出現了許多運動估計新算法、碼率控制策略、傳輸差錯控制策略、編碼新技術(如小波壓縮技術和模型基編碼等),這些新的研究成果對視頻質量的提高有著重要的意義。
其次,H.263標準的實現,使得在DDN、ISDN、PSTN等通信網絡進行視頻通信實際應用成為可能,其圖像質量比H.261有許多改善。因此,視頻編碼標準H.263被廣泛應用在會議電視、可視電話、遠程視頻監控等眾多領域。設備制造廠商、運營商紛紛投入人力、財力進行與視頻編碼有關產品的設計與生產。
第三,帶動了很多芯片制造廠商設計基于多媒體通信、存儲的通用或專用芯片,以便應用者更加方便對視頻信號進行處理。
第四,視頻編碼國際標準H.263仍然采用類似于H.261的混合編碼器,尤其是在信源編碼器中,DCT、量化以及對量化系數的“Zig-Zag”字形掃描和二維VLC等處理與H.261建議一致的,但為了適應極低碼率的傳輸要求,去掉了信道編碼部分,并在許多方面作了改進,增加了非限制的運動矢量模式、基于語法的算術編碼、高級預測模式、PB-幀模式這四個高級選項。這些改進的措施和高級選項的使用進一步提高了編碼效率,在低碼率下獲得了較好的圖像質量。
當H.263標準不采用任何高級選項時,稱為H.263的基本編碼模式(Baseline),或稱為H.263的缺省編碼模式。其信源編碼器仍然采用可減少時間冗余的幀間預測和可減少空間冗余的DCT變換編碼相結合的混合編碼方法。H.263解碼器具有半像素精度的運動補償能力,并允許編碼器采用這種運動補償方法構造重建幀,而不是H.261標準中采用的全像素精度和環路濾波器。H.263信源編碼器結構除了去掉環路濾波器模塊之外,其他與H.261基本相同。但在以下幾個方面作了改進,以便適應極低碼率的傳輸要求。
1、更加豐富的圖像格式
H.263編碼器除了支持H.261中的圖像格式CIF和QCIF之外,還增加了另外三種圖像格式sub-QCIF、4CIF、16CIF,從而使H.263具有更廣的應用范圍,如表1所示。對每種圖像,采用YUV 4﹕2﹕0的圖像格式。色差采樣點的位置與H.261相同,除了sub-QCIF格式之外,取樣像素的縱橫比和圖像格式的縱橫比一致,均為4﹕3。
表1:H.263圖像格式
H.263解碼器要求能對sub-QCIF、QCIF格式的圖像碼流進行解碼,但是不強求能對CIF、4CIF或16CIF格式的圖像碼流進行解碼。同樣H. 263編碼器應該能夠對sub-QCIF和QCIF中任一種格式的圖像進行編碼,也不要求同時支持這兩種格式,一些編碼器也能對CIF、4CIF、16CIF格式的圖像進行編碼。在視頻通信中,編解碼器以何種格式圖像進行通信,是通過外部手段如H.245標準中的編碼器、解碼器的能力協商來決定的。如果希望能對所有格式的圖像進行編解碼,需要通過H.245標準的終端描述通知H.263編解碼器要具有這種能力。
2、半像素精度的運動估計
在H.261中,宏塊運動的估值精度為整數像素,范圍為[-16,+15],而在H.263中采用半像素精度,運動矢量的水平分量和垂直分量都有整型和半整型值。在H.263基本編碼模式中,這些運動矢量的水平和垂直分量被限制在[-16.0,+15.5]之間。在采用無限制運動矢量這一高級預測模式下,則被限制在[-31.5,+31.5]之間。
更高精度的運動矢量,使得在P幀和PB幀圖像中對宏塊或塊的預測更加準確,因而編碼宏塊和預測宏塊的預測誤差更小,編碼所需的碼字也更少,在視頻碼流中節省更多的比特數,或者說在相同的傳輸帶寬下,采用半像素精度預測可以得到更好的圖像質量。
3、雙線性內插得到半像素預測
H.263中采用雙線性內插來得到運動估計用的半精度像素的預測值,如圖1所示。圖1中是為了求得半像素精度的運動矢量而采用雙線性內插得到的圖像,黑方塊點所在位置A、B、C、D為整像素的位置,也表示所在點的亮度值。小圓圈的位置是內插出來的半像素位置,半像素位置a、b、c、d四點的亮度值分別為
a=A
b=(A+B+1)/2
c=(A+C+1)/2
d=(A+B+C+D+2)/4
按照這種方法,可以推理到其他半像素點位置的亮度值。
用計算機處理時,用來表示圖像陣列所用的坐標最小單位是1,因而表示坐標的指針變量或數組變量的下標其最小間隔為1。所以內插半像素精度的圖像實際上是把原來圖像擴大成2倍,坐標值是2的整數倍的位置點其亮度值與原來圖像相同,而不在2整數倍位置處的點其亮度值采用上述雙線性內插求得,但最后一行和最后一列的像素點不能直接用上式求得。在要求不嚴格的情況下,可以采用前一行或前一列的值來代替,如圖2所示。如要求更加精確的半像素位置亮度值的圖像,可以在原圖像擴邊的基礎上,放大內插位于邊緣的半像素位置處的亮度值。
4、基于塊的運動估計
在H.261建議中只對16×16像素的宏塊進行運動估計,一個宏塊對應一個運動矢量。而H.263標準中不僅可以用16×16像素的宏塊為單位進行運動估計,還可以根據需要對8×8像素的子塊進行運動估計,即每個宏塊可使用4個運動矢量。運動估計需要兩幀圖像,一幀是當前正在編碼的圖像,另一幀是在此時刻前的輸入圖像(如求后向運動矢量,則是此時刻后的原始輸入圖像),被用來搜索最匹配宏塊位置的。為了方便說明,分別用第k幀和第k-1幀來表示。在第k-1幀圖像中,如果與第k幀編碼宏塊A最匹配的宏塊位置B位于其右方或下方,則運動矢量的水平分量和垂直分量為正值,否則為負值。如圖3所示是運動矢量的水平和垂直分量都為正值的情況所示。
從解碼端運動補償預測的角度來看,當接收到的運動矢量水平分量和垂直分量為正時,就表明應該從重建參考幀圖像中在空間上更右或更下方的點來補償。
5、更加有效的運動矢且編碼
在H.261中,對運動矢量采用一維前值預測與VLC相結合的方法編碼,在H.263中則采用更為復雜的二維預測與VLC相結合的編碼。
對運動矢量進行編碼時,不是直接對矢量的水平分量和垂直分量值進行編碼,而是對當前宏塊的差分運動矢量即當前宏塊的運動矢量與預測運動矢量的差值編碼。當宏塊只有一個運動矢量時(H.263基本模式),預測運動矢量采用編碼宏塊周圍的三個宏塊運動矢量的中值,如圖4所示。從圖4可以看出,當前編碼宏塊位于圖4(a)情況下,其預測運動矢量就是左邊宏塊運動矢量MV1、正上方宏塊運動矢量MV2和右上方宏塊運動矢量MV3的中值。其余圖4(b)、(c)、(d)三種情況,預測運動矢量也同樣是MV1、MV2、MV3的中值。
PMV=Median(MV1,MV2,MV3)
這里MV1、MV2、MV3代表運動矢量的水平或豎直分量。如果當前編碼宏塊在GOB或圖像的邊界時,其周圍三個宏塊的運動矢量分別按以下方法處理。
上面宏塊在GOB或圖像的外部,則設MV2=MV3=MV1,如圖4(b)所示;
左邊宏塊在圖像的外部,則設MV1=0,如圖4(c)所示;
右上宏塊在圖像的外部,則設MV3=0,如圖4(d)所示。
圖4:宏塊的預測運動矢量
求得預測運動矢量之后,就需要對當前編碼宏塊運動矢量與預測運動矢量求差值,即對差分運動矢量進行編碼。對于每個宏塊有多個運動矢量的情況下,也同樣需要對差分運動矢量編碼。
6、三維VLC編碼
為了提高編碼效率,H.263標準對宏塊數據、宏塊類型、運動矢量預測差值、子塊編碼模式以及DCT變換系數都使用VLC編碼,并且規定了編碼碼字。編碼事件用三個符號(LAST、RUN、LEVEL)的組合構成。LAST= 0,表示該塊中還有更多的非零系數要編碼,LAST=1表示這是塊中的最后一個要編碼的非零系數。RUN表示要編碼的系數之前連續0的個數,LEVEL表示編碼系數的非零值。對應于這樣一個三維組合的事件就用一個給定的碼字來表示,如表2所示。
表2:3D VLC編碼碼字