變換塊的高效編碼和解碼的製作方法
2023-06-10 17:39:46 3
專利名稱:變換塊的高效編碼和解碼的製作方法
專利說明變換塊的高效編碼和解碼 背景 基於塊變換的編碼 變換編碼是在許多音頻、圖像和視頻壓縮系統中使用的一種壓縮技術。未壓縮數字圖像和視頻通常被表示或捕捉為以二維(2D)網格排列的圖像或視頻幀中各位置處的圖元或色彩的樣本。這被稱為圖像或視頻的空間域表示。例如,用於圖像的典型格式由被排列為網格的24位彩色圖元流構成。每一樣本是表示諸如RGB或YIQ等色彩空間內該網格中的一個像素位置處的色彩分量的數字。各種圖像和視頻系統可使用各種不同的色彩、空間和時間解析度的採樣。類似地,數字音頻通常被表示為時間採樣的音頻信號流。例如,典型的音頻格式由在有規律的時間間隔處所取的16位音頻信號幅度樣本流構成。
未壓縮數字音頻、圖像和視頻信號可消耗大量的存儲和傳輸能力。變換編碼通過將信號的空間域表示變換成頻域(或其它類似的變換域)表示,然後降低該變換域表示的某些一般較不可感知的頻率分量的解析度,減小了數字音頻、圖像和視頻的大小。這一般與降低空間域中的圖像或視頻或時域中的音頻的色彩或空間解析度相比,產生了較不可感知的數位訊號劣化。
更具體而言,
圖1所示的典型的基於塊變換的編解碼器100將未壓縮的數字圖像的像素劃分成固定大小的二維塊(X1,...Xn),每一塊可能與其它塊重疊。對每一塊應用進行空間-頻率分析的線性變換120-121,這將塊內彼此隔開的樣本轉換成一般表示塊間隔上相應的頻帶內的數位訊號的強度的一組頻率(或變換)係數。作為比較,變換係數可被選擇性地量化130(即,諸如通過丟棄係數值的最低有效位或將較高解析度數字集中的值映射到較低解析度來降低解析度),並且還被熵或可變長度編碼130成壓縮的數據流。在解碼時,變換係數進行反變換170-171以便幾乎重構原始的色彩/空間採樣圖像/視頻信號(重構塊
)。
塊變換120-121可被定義為對大小為N的向量x的數學運算。最通常的是,該運算是線性乘法,從而產生變換域輸出y=Mx,M是變換矩陣。當輸入數據是任意長時,它被分段成大小為N的向量,並且向每一段應用塊變換。出於數據壓縮的目的,選擇可逆塊變換。換言之,矩陣M是可逆的。在多個維度中(例如,對於圖像和視頻),塊變換通常被實現為可分操作。沿數據的每一維(即,行和列)可分地應用矩陣乘法。
對於壓縮,變換係數(向量y的分量)可被選擇性地量化(即,諸如通過丟棄係數值的最低有效位或將較高解析度數字集中的值映射到較低解析度來降低解析度),並還可被熵或可變長度編碼為壓縮的數據流。
在解碼器150中解碼時,如圖1所示,在解碼器150側應用這些操作的反過程(反量化/熵解碼160和反塊變換170-171)。在重構數據時,將逆矩陣M1(反變換170-171)作為乘數應用於變換域數據。當應用於變換域數據時,反變換幾乎重構原始時域或空間域數字媒體。
在許多基於塊變換達到編碼應用中,變換理想地是可逆的以取決於量化因子同時支持有損和無損壓縮兩者。如果例如沒有量化(一般被表示為量化因子1),則利用可逆變換的編解碼器可在解碼時精確地再現輸入數據。然而,這些應用中的可逆性的要求約束了對用於設計編解碼器的變換的選擇。
諸如MPEG和Windows Media等許多圖像和視頻壓縮系統利用基於離散餘弦變換(DCT)的變換。已知DCT具有得到近乎最優的數據壓縮的良好能量壓縮特性。在這些壓縮系統中,在壓縮系統的編碼器和解碼器兩者中的重構環路中採用了反DCT(IDCT)來重構各個圖像塊。
寬範圍變換係數的熵編碼 寬動態範圍輸入數據導致在編碼圖像的過程中生成甚至更寬動態範圍的變換係數。例如,由N×N DCT運算生成的變換係數具有比原始數據的動態範圍大N倍的動態範圍。採用較小或單位量化因子(用於實現低損或無損壓縮),經量化的變換係數的範圍也很大。在統計上,這些係數具有如圖2和3所示的拉普拉斯分布。圖2示出了對於寬動態範圍係數的拉普拉斯分布。圖3示出了對於典型的窄動態範圍係數的拉普拉斯分布。
對於小動態範圍的輸入數據(通常為8位)以及相對較大的量化因子(quantizer)(諸如大於等於4的數值)來調整常規的變換編碼。因此,圖3代表了在這一常規的變換編碼中的變換係數的分布。此外,用於這種常規變換編碼的熵編碼可以是行程水平(run-level)編碼的一種變體,其中將一系列的零與一非零碼元一起編碼。這可以是表示零(以高概率出現)的行程以及捕捉碼元間相關的有效手段。
另一方面,常規的變換編碼較不適用於壓縮諸如圖2所示的寬動態範圍分布。儘管碼元為零的概率要比任何其它值高得多(即,分布峰值為零),但是係數精確地為零的概率對於寬動態範圍分布是微乎其微的。因此,零不會經常出現,並且基於連續的非零係數之間的零的個數的行程長度熵編碼技術對於寬動態範圍輸入數據是非常低效的。
寬動態範圍分布與窄範圍分布相比還具有增加的碼元字母表。由於這一增加的碼元字母表,用於編碼碼元的熵表必須很大。否則,許多碼元將最終被遺漏而未被編碼,這是低效的。更大的表需要更多存儲器,並且還會導致更高的複雜度。
因此,常規的變換編碼缺少通用性-對於具有窄動態範圍分布的輸入數據能起很好的作用,但對寬動態範圍分布卻不如此。
然而,在窄範圍數據上,找到對經量化的變換係數的高效熵編碼是一個關鍵過程。可在這一步中得到的任何性能增益(壓縮效率和編碼/解碼速度兩方面的增益)轉換成總體質量增益。
不同的熵編碼方案按照其成功地利用這些完全不同的效率準則的能力而被標記為對上下文信息的使用、較高壓縮(諸如算術編碼)、較低計算要求(諸如哈夫曼(Huffman)編碼技術中找到的)、以及使用一組簡明的碼錶來最小化編碼器/解碼器存儲器開銷。不滿足所有這些特徵的常規熵編碼方法沒有展示出編碼變換係數的全面效率。
概述 此處描述的數字媒體編解碼器中的數字媒體編碼和解碼技術以及該技術的實現獲得了變換係數的更高效壓縮。例如,此處所示的一種示例性基於塊變換的數字媒體編解碼器通過對非零係數以及後續的零值係數的行程進行聯合編碼來更高效地編碼變換係數。當非零係數是其塊中的最後一個係數時,對該係數,用一最後指示符來代替碼元中的行程值。初始非零係數在將非零係數與初始和後續的零行程聯合編碼的特殊碼元中指示。
該示例性編解碼器通過識別非零係數的行程中的間斷並在這一間斷的任一側上單獨地對非零係數編碼而允許多個編碼上下文。通過基於內部、中間和外部變換的上下文切換、以及基於變換是對應於亮度還是色度通道的上下文切換,來提供附加上下文。這允許碼錶具有較小的熵,而無需創建如此多的上下文從而使其有用性減弱。
該示例性編解碼器還通過在每一碼元中指示非零係數是否具有大於1的絕對值以及零的行程是否具有正值來減小碼錶大小,並對碼元外的係數的水平和行程的長度單獨編碼。該編解碼器可對這些單獨編碼的行程和水平充分利用上下文切換。
可組合或單獨使用各種技術和系統。
提供本概述以用簡化的形式介紹將在以下詳細描述中進一步描述的一些概念。本概述並不旨在標識出所要求保護的主題的關鍵特徵或必要特徵,也不旨在用於幫助確定所要求保護的主題的範圍。
參考附圖閱讀以下實施例的詳細描述,將清楚其它特徵和優點。
附圖簡述 圖1是現有技術中常規的基於塊變換的編解碼器的框圖。
圖2是示出具有寬動態範圍的變換係數的分布的直方圖。
圖3是示出窄範圍係數的分布的直方圖。
圖4是包含寬範圍係數的自適應編碼的代表性編碼器的流程圖。
圖5是包含自適應地編碼的寬範圍係數的解碼的代表性解碼器的流程圖。
圖6是示出諸如圖4的編碼器等寬範圍係數的自適應編碼中變換係數的分組和分層的流程圖。
圖7是示出圖4的編碼器所執行的對槽中選擇的變換係數分組進行變換係數編碼的過程的流程圖。
圖8是示出圖5的解碼器所執行的對經由圖7的過程編碼的變換係數進行重構的過程的流程圖。
圖9是示出用於自適應地改變圖6的分組以產生對係數的熵編碼的更優化分布的自適應過程的流程圖。
圖10和11是圖9的自適應過程的偽代碼清單。
圖12示出了現有技術中的已編碼變換係數的示例。
圖13示出了根據此處所描述的編碼技術編碼的變換係數的一個示例。
圖14是示出由圖4的編碼器執行的對變換係數進行編碼的過程的流程圖。
圖15示出了用於根據此處所描述的技術對變換係數進行編碼的不同碼錶上下文的示例。
圖16是示出由圖4的編碼器執行的確定在編碼變換係數時要使用的編碼上下文的過程的流程圖。
圖17示出了根據此處所描述的技術編碼的精簡的變換係數的示例。
圖18是示出由圖4的編碼器執行的編碼和發送精簡形式的初始變換係數的過程的流程圖。
圖19是示出由圖4的編碼器執行的編碼和發送精簡形式的後續係數的過程的流程圖。
圖20是示出由圖5的解碼器執行的解碼已編碼變換係數的過程的流程圖。
圖21是示出由圖5的解碼器執行的填充來自已解碼碼元的變換係數的過程的流程圖。
圖22是用於實現圖6的寬範圍係數的自適應編碼的合適的計算環境的框圖。
詳細描述 以下描述涉及針對寬範圍變換係數的更高效熵編碼、以及一般的變換係數的更高效熵編碼進行自適應地調整的編碼和解碼技術。以下描述在數字媒體壓縮系統或編解碼器的上下文中描述了該技術的一個示例實現。該數字媒體系統以壓縮形式對數字媒體數據進行編碼以便傳輸或存儲,並解碼該數據以供回放或其它處理。出於說明的目的,包含這一寬範圍係數的自適應編碼的該示例性壓縮系統是圖像或視頻壓縮系統。或者,該技術也可被結合到用於其它2D數據的壓縮系統或編解碼器中。寬範圍係數自適應編碼技術不要求數字媒體壓縮系統以特定的編碼格式來編碼壓縮的數字媒體數據。
1.編碼器/解碼器 圖4和5是在代表性2維(2D)數據編碼器400和解碼器500中採用的過程的一般化圖示。該圖呈現了結合了實現寬範圍係數自適應編碼的2D數據編碼器和解碼器的壓縮系統的一般化或簡化的圖示。在使用寬範圍係數自適應編碼的替換壓縮系統中,可使用比本代表性編碼器和解碼器中所示的更多或更少的過程來進行2D數據壓縮。例如,某些編碼器/解碼器還可包括色彩轉換、色彩格式、可縮放編碼、無損編碼、宏塊模式等等。取決於量化,壓縮系統(編碼器和解碼器)可提供2D數據的無損和/或有損壓縮,量化可基於從無損到有損變化的量化參數。
2D數據編碼器400產生壓縮比特流420,它是作為輸入提供給編碼器的2D數據410的更緊湊表示(對於典型輸入)。例如,2D數據輸入可以是圖像、視頻序列的一幀、或具有兩個維度的其它數據。2D數據編碼器將輸入數據塊化(tile)430成宏塊,在本代表性編碼器中,宏塊的大小為16×16像素。2D數據編碼器還將每一宏塊塊化為4×4的塊。對塊之間的每一邊緣應用「前向重疊」算子440,之後使用塊變換450來變換每一4×4的塊。該塊變換450可以是由Srinivasan在2004年12月17日提交的題為「Reversible Transform For Lossy And Lossless 2-DData Compression」(用於有損和無損2D數據壓縮的可逆變換)的美國專利申請第11/015,707號中所描述的可逆的、無縮放的2D變換。重疊算子440可以是由Tu等人在2004年12月17日提交的題為「Reversible Overlap Operator for EfficientLossless Data Compression」(用於高效無損數據壓縮的可逆重疊算子)的美國專利申請第11/015,148號;以及Tu等人在2005年1月14日提交的題為「Reversible2-Dimensional Pre-/Post-Filter for Lapped Biorthogonal Transform」(用於重疊雙正交變換的可逆2維預/後濾波器)的美國專利申請第11/035,991號中描述的可逆重疊算子。或者,可使用離散餘弦變換或其它塊變換和重疊算子。在變換之後,令每一4×4的變換塊的DC係數460經受一類似的處理鏈(塊化、前向重疊、之後是4×4的塊變換)。所得的DC變換係數和AC變換係數被量化470、熵編碼480和分組化490。
解碼器執行反過程。在解碼器側,從其各自的分組中提取510變換係數位,從中係數本身被解碼520和解量化530。DC係數540通過應用反變換來重新生成,並且DC係數的平面使用跨DC塊邊緣應用的合適的平滑算子來「反重疊」。隨後,通過向DC係數應用4×4的反變換550來重新生成整個數據,並從比特流中解碼AC係數542。最後,對所得圖像平面中的塊邊緣進行反重疊濾波560。這產生經重構的2D數據輸出。
在一個示例性實現中,編碼器400(圖4)將輸入圖像壓縮成壓縮比特流420(例如,文件),而解碼器500(圖5)基於是採用無損還是有損編碼來重構原始輸入或其近似。編碼過程涉及應用以下所討論的前向重疊變換(LT),這是用同樣在以下更全面描述的可逆2維預/後濾波來實現的。解碼過程涉及應用使用可逆2維預/後濾波的反重疊變換(ILT)。
所示的LT和ILT在確切的意義上是彼此的反過程,並且因此可被統稱為可逆重疊變換。作為一種可逆變換,LT/ILT對可用於無損圖像壓縮。
由所示的編碼器400/解碼器500壓縮的輸入數據410可以是各種色彩格式(例如,RGB/YUV 4:4:4、YUV 4:2:2或YUV 4:2:0彩色圖像格式)的圖像。通常,輸入圖像總是具有亮度(Y)分量。如果它是RGB/YUV 4:4:4、YUV 4:2:2或YUV 4:2:0圖像,則該圖像還具有色度分量,諸如U分量和V分量。圖像的這些單獨的色彩平面或分量可具有不同的空間解析度。在例如YUV 4:2:0色彩格式的輸入圖像的情況下,U和V分量具有Y分量一半的寬度和高度。
如上所述,編碼器400將輸入圖像或圖片塊化成宏塊。在一個示例性實現中,編碼器400將輸入圖像塊化成Y通道中的16×16的宏塊(取決於色彩格式,可以是U和V通道中的16×16、16×8或8×8區域)。每一宏塊色彩平面被塊化成4×4的區域或塊。因此,宏塊按以下對於本示例性編碼器實現的方式由各種色彩格式組成 1.對於灰度圖像,每一宏塊包含16個4×4的亮度(Y)塊。
2.對於YUV 4:2:0格式彩色圖像,每一宏塊包含16個4×4的Y塊,並且4個各自為4×4的色度(U和V)塊。
3.對於YUV 4:2:2格式彩色圖像,每一宏塊包含16個4×4的Y塊,以及8個各自為4×4的色度(U和V)塊。
4.對於RGB或YUV 4:4:4彩色圖像,每一宏塊對Y、U和V通道中的每一個包含16個塊。
2.寬範圍係數的自適應編碼 在寬動態範圍數據的情況下,尤其是解相關的變換數據(諸如圖4的編碼器中的係數460、462),大量的較低順序位是不可預測且是「有噪聲的」。換言之,在較低順序位中沒有太多可用於高效熵編碼的相關。位具有較高的熵,大約對每一編碼的位有1位的熵。
2.1分組 此外,圖3所示的寬範圍變換係數的拉普拉斯概率分布函數由下式給出 (為方便起見,對應於變換係數的隨機變量作為連續值來對待)。對於寬動態範圍數據,λ較小,並且絕對均值1/λ較大。這一分布的斜率被界定在±(λ2)內,這是非常小的。這意味著對於較小的位移ξ,變換係數等於x的概率非常接近等於x+ξ的概率。在離散域中,這轉換成斷言「變換係數具有相鄰值j和(j+1)的概率幾乎相同。」 現在參考圖6,寬範圍係數自適應編碼將字母表的連續碼元分組610成N個碼元的「槽」(bin)。每一槽的碼元數可以是任何數目N。然而,為實用性起見,數目N理想地是2的冪(即,N=2k),使得一個槽內的係數的索引或地址可被高效地編碼為一固定長度碼。例如,碼元可被分組成對,使得一碼元可被標識為該對的索引以及該對內碼元的索引。
該分組具有這樣的好處採用對N的適當選擇,對寬範圍係數的槽索引的概率分布更精確地類似例如圖3所示的窄範圍數據的概率分布。分組在數學上類似於量化操作。這意味著槽索引可使用對具有窄範圍概率分布的數據能起最好作用的可變長度熵編碼技術來高效地編碼。
基於將係數分組成槽,編碼器然後可使用其槽的索引(此處也稱為歸一化係數620)及其在槽內的地址(此處也稱為槽地址625)來對變換係數615進行編碼。歸一化係數是使用可變長度熵編碼來編碼的,而槽地址是藉助固定長度碼來編碼的。
對N(或等效地,用於槽地址的固定長度編碼的位數k)的選擇確定了分組的粒度。一般而言,變換係數的範圍越寬,應選擇越大的k值。當仔細選擇k時,歸一化係數Y有很高的概率為零,這匹配用於Y的熵編碼方案。
如下所述,值k可在編碼器和解碼器中自適應地變化(以後向自適應方式)。更具體地,編碼器和解碼器中的k的值僅基於先前編碼/解碼的數據來變化。
在圖7所示的這一編碼的一個特定示例中,編碼器如下對變換係數X進行編碼。對於初始動作710,編碼器計算用於變換係數的歸一化係數Y。在此示例實現中,對於槽大小的特定選擇N=2k,歸一化係數Y被定義為Y=sign(X)*floor(abs(X)/N)。編碼器使用熵碼單獨地或與其它碼元聯合地對碼元Y進行編碼(動作720)。接著,在動作730處,編碼器確定變換係數X的槽地址(Z)。在此示例實現中,槽地址是abs(X)除以槽大小N的整數除法的餘數,即Z=abs(X)%N。編碼器在動作740處將該值編碼為k位的固定長度碼。此外,在非零變換係數的情況下,編碼器也對符號進行編碼。更具體地,如動作750-760中所指示的,編碼器在歸一化係數為非零時對歸一化係數(Y)的符號進行編碼。此外,在歸一化係數為零且變換係數非零的情況下,編碼器對變換係數(X)的符號進行編碼。由於歸一化係數是使用可變長度熵碼來編碼的,因此此處它也被稱為可變長度部分,並且槽地址(Z)也被稱為固定長度部分。在其它替換實現中,用於變換係數的歸一化係數、槽地址和符號的數學定義可以不同。
繼續此示例,圖8示出了解碼器500(圖5)執行的重構通過過程700(圖7)編碼的變換係數的示例過程800。在動作810處,解碼器單獨地或結合如在塊編碼過程中定義的其它碼元從壓縮比特流420(圖5)中解碼歸一化係數(Y)。解碼器還在動作820處從壓縮比特流中讀取用於槽地址和符號(當被編碼時)的k位碼字。在動作830到870處,解碼器然後如下重構變換係數 1.當Y>0(動作830),則將變換係數重構為X=Y*N+Z(動作(831))。
2.當Y<0(動作840),則將變換係數重構為X=Y*N-Z(動作841)。
3.當Y=0且Z=0(動作850),則將變換係數重構為X=0(動作851)。
4.當Y=0且Z≠0,則解碼器從壓縮比特流中進一步讀取編碼的符號(S)(動作860)。如果符號為正(S=0)(動作870),則將變換係數重構為X=Z(動作871)。否則,如果符號為負(S=1),則將變換係數重構為X=-Z(動作872)。
2.2分層 再次參考圖6,編碼器和解碼器理想地提取出固定長度編碼的槽地址625和符號到壓縮比特流420(圖4)中的單獨編碼的層(此處稱為「靈活位(Flexbits)」層645)中。歸一化係數620在核心比特流640的一層中編碼。這允許編碼器和/或解碼器具有按需降低編碼的這一靈活位部分的等級或完全丟棄這一部分以滿足比特率或其它約束的選擇。即使編碼器完全丟棄該靈活位層,壓縮比特流仍解碼,然而是以降級的質量來解碼的。解碼器仍可單獨從歸一化係數部分來重構該信號。這實際上類似於在編碼器中應用更大程度的量化470(圖4)。將槽地址和符號編碼為單獨的靈活位層還具有這樣的潛在好處在某些編碼器/解碼器實現中,可向該層中的數據應用進一步的可變長度熵編碼(例如,算術編碼、Lempel-Aiv、Burrows-Wheeler等)以得到進一步改善的壓縮。
對於分層,包含靈活位部分的壓縮比特流的各部分用單獨的層報頭或比特流中的其它指示來表示,使得解碼器可從核心比特流640中標識並分離(即,解析)出靈活位層645(當未被省略時)。
分層對後向自適應分組(下節中描述)的設計提出了進一步的挑戰。由於靈活位層可以在給定比特流中存在或缺乏,因此後向自適應分組模型不能可靠地指示靈活位層中的任何信息。確定固定長度碼位數k(對應於槽大小N=2k)所需的所有信息應駐留在因果的核心比特流中。
2.3自適應 編碼器和解碼器還提供了一後向自適應過程,以在編碼和解碼期間自適應地調整固定長度碼位數k以及相應的上述分組的槽大小N的選擇。在一個實現中,該自適應過程可基於將變換係數建模為拉普拉斯分布,使得k的值從拉普拉斯參數λ中導出。然而,這一複雜模型要求解碼器在對將來的塊建模分布之前執行圖6中的分組610的反過程(從核心比特流640中的歸一化係數以及靈活位層645中的槽地址/符號重構變換係數)。這一要求將違反解碼器應允許從壓縮比特流420中丟棄靈活位層的分層約束。
在圖9所示的示例實現中,自適應過程900改為基於當約四分之一的係數為非零時獲得變換係數的更優化的行程長度編碼的觀察結果。由此,可用於針對其中大約四分之三的歸一化係數為零的「最佳點(sweet spot)」情形來調整分組的自適應參數將提供良好的熵編碼性能。因此,塊中的非零歸一化係數的個數將用作該示例實現中的自適應參數。該自適應參數具有僅依賴於包含在核心比特流中的信息的優點,這滿足了變換係數仍可在省略靈活位層的情況下解碼的分層約束。該過程在當編碼/解碼當前塊時應用的自適應模型基於來自先前的塊的信息的意義上是後向自適應的。
在其自適應過程中,示例編碼器/解碼器在後向自適應的基礎上執行自適應。即,自適應的當前迭代基於先前在編碼或解碼過程,諸如在前一塊或宏塊中看到的信息。在示例編碼器和解碼器中,對給定變換頻帶,自適應更新對於每一宏塊發生一次,這旨在最小化等待時間和交叉依賴性。替換編解碼器實現可用不同的間隔,諸如在每一變換塊之後執行自適應。
在示例編碼器和解碼器中,自適應過程900更新值k。如果非零歸一化係數的個數太大,則增加k使得該數字在將來的塊中趨向於丟棄。如果非零歸一化係數的個數太小,則減小k,期望將來的塊然後將因槽大小n較小而產生更多非零歸一化係數。該示例自適應過程將值k約束在一組數字{0,1,...16}內,但是替換實現可對k使用其它值範圍。在每次自適應更新時,編碼器和解碼器或者對k遞增,或者對k遞減,或者使k保持不變。示例編碼器和解碼器將k遞增或遞減1,但是替換實現可使用其它步長。
示例編碼器和解碼器中的自適應過程900還使用內部模型參數或狀態變量(M)來控制具有滯後效果的對分組參數k的更新。該模型參數提供了更新分組參數k之前的滯後,以避免導致分組參數的迅速波動。示例自適應過程中的模型參數具有從-8到8的17個整數步長。
現在參考圖9,示例自適應過程900如下進行。本示例自適應過程在圖10和11中的偽代碼清單中進一步詳述。如動作910、990處所指示的,示例編碼器和解碼器中的自適應過程對在壓縮比特流中表示的每一變換頻帶,包括亮度頻帶和色度頻帶、AC和DC係數單獨執行。替換編解碼器可在變換頻帶的數目上不同,並且還可向變換頻帶單獨或聯合地應用自適應。
在動作920處,該自適應過程然後對前一編碼/解碼的宏塊內的變換頻帶的非零歸一化係數的個數進行計數。在動作930處,將該原始計數歸一化以反映常規大小區域中非零係數的整數化個數。該自適應過程然後計算計數與期望模型(即,四分之一的係數為非零的「最佳點」)的偏差(動作940)。例如,圖4中所示的示例編碼器中的AC係數宏塊具有240個係數。因此,期望模型是240個係數中的70個為非零。該偏差被進一步縮放、閾值化並用於更新內部模型參數。
在接下來的動作960、965、970、975處,該自適應過程然後根據內部模型參數的任何變換來對值k進行自適應。如果模型參數小於一負閾值,則遞減k值(在其允許的界限內)。該自適應應當產生更多非零係數。另一方面,如果模型參數超過一正閾值,則遞增值k(在其允許的界限內)。這一自適應應當產生更少的非零係數。否則,保持值k不變。
再一次,如動作910、980處所指示的,對數據的每一通道和每一子帶單獨重複該自適應過程,諸如對色度和亮度通道單獨重複。
示例自適應過程900在圖10和11所示的偽代碼清單中進一步詳述。
3.高效熵編碼 3.1現有技術方法 在各種編碼標準中,變換塊的編碼過程被精簡到對一係數串的編碼。這一串的一個示例在圖12中作為變換係數示例1200給出。在示例1200中,係數C0、C1、C2、C3和C4表示四個非零係數值(要麼為正要麼為負),而該系列中的其它係數具有零值。
某些屬性傳統上適用於這一變換係數串 ●係數總數通常是確定的,並且由變換大小給出。
●概率上,大量係數為零。
●至少一個係數非零。在所有係數為零的情況下,該情況通常通過已編碼的塊模式來表示,如在Srinivasan於2005年8月12日提交的題為「Non-Zero Coefficient Block Pattern Coding」(非零係數塊模式編碼)的美國申請(待定)中所描述的。
●概率上,非零和較大值的係數在串的開頭出現,而零和較小值的係數在接近末尾處出現。
●非零係數取整數值,具有已知的最小/最大值。
各種編碼技術利用了通常相當頻繁出現的零值係數可用行程長度碼來編碼的這一事實。然而,當所編碼的輸入圖像為高動態範圍數據(例如,大於8位)時,或當量化參數是單位或較小時,較少的變換係數為零,如上所述。在這一情形中,以上描述的自適應編碼和解碼技術可用於調節數據,使得經調節的數據具有這些特性。其它技術通過諸如設置高量化水平等其它手段也可產生類似於變換係數示例1200的變換係數集。
圖12還示出了對諸如變換係數示例1200等變換係數進行編碼的兩種方法。這些方法利用了對零行程以及後續的非零係數一起聯合編碼來提供編碼益處。2D編碼示例1220示出了一種用於這一行程水平編碼方案的技術。如示例1220所示,在2D編碼中,零值係數的行程(該行程要麼長度為零,要麼為正的長度)與變換係數序列中後續的非零係數一起編碼成碼元1225;在所示的情況中,碼元指示在非零係數C0前面沒有零。稱為「塊結束」,即EOB的特殊碼元1235用於表示最後一個零行程。這通常被稱為2D編碼,因為每一碼元對行程(零值係數的行程)和水平(非零係數值)進行聯合編碼,並且因此具有兩個值,且可被認為是對變換係數數據的兩個維度進行編碼。這些碼元然後可使用哈夫曼碼或算術編碼來進行熵編碼並被發送到圖4的壓縮比特流420。
另一替換編碼方案是3D編碼,其一個示例在示例1240中示出。在3D編碼中,如2D編碼中一樣,零的行程通常與後續的非零係數一起聯合編碼。此外,對指示該非零係數是否是塊中的最後一個非零係數的布爾數據元素「最後」進行編碼。碼元1245因此對行程、水平和最後進行聯合編碼;在所示的情況中,碼元指示在非零係數C1前有兩個零,並且這不是該系列中的最後一個非零係數。由於這些元素中的每一個可自由地取所有值,因此碼元對三個獨立的維度進行編碼,從而使其命名為「3D編碼」。
這些技術中的每一種都具有獨立的優點。2D編碼技術中的每一碼元具有比3D編碼中使用的碼元小的熵,因為前者傳達的信息比後者少。由此,給定3D編碼方案中的可能碼元數將是相應2D編碼方案的兩倍。這增大了碼錶大小,並且可減慢對於3D編碼方案的編碼和解碼。然而,在2D編碼中,發送一附加碼元來表示塊結束,並且需要發送整個附加碼元從比特流大小的觀點來看是昂貴的。實際上,在實踐中,3D編碼比2D編碼更高效,儘管其碼錶大小更大。
3.2 3D-2D編碼 儘管圖12所示的現有技術利用了非零係數水平以及前導的零行程的聯合編碼,但是可以證明,非零係數之後的零行程顯示出與非零係數的幅值的強相關。這一特性暗示了利用對水平和後續行程的聯合編碼。
圖13示出了一種這樣的替換編碼技術,它改善了圖12概述的2D和3D技術。圖13示出了利用對後續零行程進行編碼以創建用於示例變換係數系列1300的碼元的理念的編碼方案。圖13示出係數被聯合編碼成碼元1355,該碼元包含非零係數值以及在非零係數之後的零行程(如果存在任何零行程)的長度作為一對。因此,所示的碼元對非零係數C1以及它之後的四個零值係數進行了聯合編碼。
除了利用非零係數和後續零的行程之間的強相關之外,該方法還通過利用一特殊行程值來表示非零係數是該系列中的最後一個,在非零係數是塊中的最後一個非零係數時提供了進一步的優點。由此,在對碼元進行聯合編碼時,所發送的信息是水平值以及要麼指示零行程的長度,要麼指示「最後」值的另一值。這在圖13中由碼元1365來示出,該碼元包括一水平值以及「最後」值而非行程長度。由於這些不同情形在碼元中的同一處編碼,因此行程和「最後」不是獨立的;每一碼元僅發送其中的一個。由此,碼元的維度既不是2也不是3,而是兩者之間的某一維。將此編碼稱為「2D編碼」。
2D編碼的這一特徵不必是組合水平和後續行程的聯合編碼方案所必需的;在替換實現中,發送的最後碼元簡單地對最後的零行程的長度進行編碼,然而這可能是不合需要的,因為它可能實質上增大了編碼的比特流的大小。在另一替換中,可使用如2D編碼中所使用的EOB碼元。然而,如在3D編碼中那樣,2D編碼對「最後」值的使用具有優於2D編碼的優點,因為無需編碼一額外的碼元來表示塊結束。另外,2D編碼具有優於3D編碼的優點,因為(1)前者的每一碼元的熵小於後者的每一碼元的熵,以及(2)前者的碼錶設計比後者的要簡單。這兩個優點都是具有比3D代碼少的可能性的2D代碼的結果。
然而,2D編碼單獨不能描述整個變換係數行程,因為它沒有提供發送在第一個非零係數之前的行程長度的方式。如圖13所示,為此,使用一特殊碼元1375,該碼元還對第一個零行程的長度編碼。這使得第一個碼元是第一個行程、水平和(行程OR最後)的聯合編碼。在圖13中,第一個碼元1375發送第一個行程(為零)、第一個非零係數的水平、以及第二個行程(為2,並且第一個非零係數不是塊中的最後一個非零係數)。因為該碼元包括一另外的維度,因此對其的編碼被稱為「3D編碼」。
儘管3D編碼中的額外信息乍一看可能消除了2D編碼的某些優點,但是對第一個碼元的不同處理從編碼效率觀點來看實際上是有利的。3D碼元必然具有與2D碼元不同的字母表,這意味著它與其它碼元分開編碼並且不會增加2D熵。
圖14示出了由編碼器400(圖4)執行的根據2D-3D編碼來編碼變換係數的示例過程1400。在一個環境中,過程1400可作為圖7的用於編碼歸一化係數的過程720的一部分被包括在內。在另一環境中,過程1400可用於對通過傳統技術量化的變換係數進行編碼。在過程1400的各種實現中,各動作可被移除、組合或分割成子動作。
該過程在動作1420處開始,在那裡標識第一個非零變換係數。然後,在動作1430處,使用初始的零行程的長度(要麼是長度0,要麼是正的長度)和第一個非零係數來創建3D碼元。此時,該3D碼元不是完整的。接著,該過程到達判定動作1435,在那裡確定當前標識的非零係數是否是變換係數系列中的最後一個非零係數。如果這是最後一個非零係數,則該過程繼續到動作1480,在那裡將「最後」指示符而非後續零的行程插入到碼元中。該過程然後在動作1490處使用熵編碼來對該碼元編碼,並且該過程結束。編碼碼元的這一過程的一個示例在以下參考圖16給出。
然而,如果該過程在判定動作1435處確定這不是最後一個非零係數,則在動作1440處將後續零行程的長度(要麼是0,要麼是正數)插入到碼元中,並在動作1450處編碼該碼元。編碼碼元的這一過程的一個示例在以下參考圖16給出。該過程然後在動作1460處標識下一非零係數,已知該非零係數存在,因為前導的非零係數被確定為不是最後一個。在動作1470處,然後使用該非零係數來創建2D碼元。此時,與以上3D碼元一樣,該碼元尚未完成。然後,在判定動作1475處,該過程確定當前非零係數是否為該系列中的最後一個。如果是,則該過程繼續到動作1480,在那裡包括「最後」指示符並編碼該碼元。如果不是,則該過程循環返回動作1400,在那裡包括下一零行程,編碼該碼元,並且該過程以下一非零係數繼續。
3.3上下文信息 除了根據2D和3D編碼來編碼碼元之外,可使用若干條因果信息來為所編碼的碼元生成上下文。該上下文可由編碼器400(圖4)或解碼器(圖5)用於索引到熵編碼表集合之一中以對該碼元進行編碼和解碼。增加上下文的數目給予編解碼器更大的靈活性來自適應或使用被修改成適合每一特定上下文的表。然而,定義大量上下文的不利方面在於(1)存在上下文減弱(其中每一上下文僅應用於少量碼元,由此降低了自適應效率),以及(2)更多碼錶意味著更大複雜性以及存儲器要求。
考慮了這幾點之後,選擇此處描述的上下文模型來參考三個因素,以確定對每一碼元選擇哪一上下文。在一個實現中,這些因素是(1)變換的等級-變換是內部、中間還是外部變換,(2)係數是亮度還是色度通道,以及(3)在係數系列內的非零係數行程中是否有任何間斷。在替換實現中,可能不使用這些因素中的一個或多個來確定編碼上下文,和/或可考慮其它因素。
由此,按照(1),內部變換使用與中間變換不同的一組碼錶,中間變換使用與外部變換不同的一組碼錶。在其它實現中,上下文模型可僅在兩級變換之間區分。類似地,按照(2),亮度係數使用與色度係數不同的一組碼錶。這些上下文因素都不會在給定的一組變換係數內變化。
然而,因素(3)在一組變換係數內變化。圖15示出了更好地說明這一上下文切換的三個示例變換係數系列。在所有三個系列1500、1520和1540中,非零係數由字母表示。
如所有三個示例所示,塊中的第一個碼元為3D碼元,它必須用與其它碼元不同的表來編碼,因為其字母表不同於其它的字母表。這形成了用於第一個碼元的「自然」上下文。由此,作為所有三個示例的第一個非零係數的係數A用3D碼來編碼。另外,由於3D碼元對第一個非零係數周圍的前導和後續零行程進行編碼,因此示例1520的前兩個係數(A、0)和示例1540的前兩個係數(0、A)在一3D碼元中聯合編碼。因此,在一個實現中,因素(3)不用於確定3D碼元的上下文。
相反,2D碼元取決於因素(3)不同地編碼。由此,在示例1500中,可以看到由於在係數D之前的非零係數的行程中沒有間斷,因此用第一上下文模型來對係數B、C和D(以及D之後的零)進行編碼。然而,D之後的零構成了非零係數行程中的間斷。因此,其餘的係數E、F、G、H(以及之後的任何係數)……使用第二上下文模型來編碼。這意味著儘管除A之外的每一非零係數是用2D碼元來編碼的,但將對B、C和D(以及任何相關聯的零值行程)使用與對係數E、F、G和H所使用的不同的碼錶。
相反,在示例1520中,在A和B之間有間斷。這構成了非零係數的行程中的間斷,因此係數B和所有後續非零係數用第二上下文模型來編碼。同樣,在示例1540中,在A之前有間斷。由此,如在示例1520中一樣,係數B、C、D、……用第二上下文模型來編碼。
圖16示出了由編碼器400(圖3)執行的編碼碼元的示例過程1600。在一個實現中,過程1600執行過程1400(圖14)的動作1450和1490的過程。在過程1600的各實現中,動作可被移除、組合或分割成子動作。該過程在判定動作1605處開始,在那裡編碼器確定碼元是否為3D碼元。如果是,則該過程繼續到動作1610,在那裡使用3D表來編碼該碼元並且該過程結束。在各個實現中,該碼元可使用諸如哈夫曼編碼或算術編碼等熵編碼來編碼。或者,可使用其它編碼方案。
如果該碼元不是3D碼元,則該過程繼續到判定動作1615,在那裡編碼器確定在該碼元中聯合編碼的非零係數之前是否有至少一個零。如果不是,則該過程繼續到動作1620,在那裡使用來自第一上下文模型的2D碼錶來編碼該碼元並且該過程結束。如果存在間斷,則在動作1630處,使用來自第二上下文模型的2D碼錶來編碼該碼元並且該過程結束。
3.4碼錶大小減小 儘管上述技術帶來了優於傳統技術的效率,但是它們不能獨立地顯著減小碼錶大小。為這些技術所創建的碼錶應當能夠發送對於2D碼元的所有(max_level×(max_run+2))個組合,以及對3D碼元的所有(max_level×(max_run+1)×(max_run+2))個組合,其中max_level是非零係數的最大(絕對)值,而max_run是零行程的最大可能長度。值(max_run+1)是對3D碼元的初始行程導出的,因為對於(max_run+1)的總數,對一零行程的可能值從0一直到max_run。類似地,對總共(max_run+2)個值,每一碼元編碼了0和max_run之間的長度的後續零行程,以及「最後」碼元。即使採用遺漏編碼(其中很少出現的碼元被分組在一起成一個或多個通過遺漏編碼表示的元碼元),碼錶大小也是相當可怕的。
為了減小碼錶大小,可進一步改進上述技術。首先,每一行程和每一水平被分割成一碼元對 行程=nonZero_run(+run1) 水平=nonOne-level(+level1) 在這一碼元對中,碼元nonZero_run和nonOne_level是布爾值,分別指示該行程是否大於零以及絕對水平是否大於1。值run1和level1僅在這些布爾值為真時才使用,並指示行程(在1和max_run之間)和水平(在2和max_level之間)。然而,由於也必須編碼「最後」的情況,因此聯合編碼的碼元中的任何後續零行程的值(行程OR最後)作為三進位碼元nonZero_run_last來發送,它在行程具有零長度時值為0,在行程具有非零長度是值為1,並且在該碼元的非零係數是該系列中的最後一個時值為2。
因此,為首先利用這一精簡的編碼,3D碼元採取了的形式。這創建了大小為2×2×3=12的字母表。後續的2D碼元採取了的形式,創建了大小為2×3=6的字母表。在一個實現中,這些碼元被稱為「索引(Index)」。在某些實現中,runl也被稱為非零行程(NonzeroRun),而level1也被稱為有效水平(SignificantLevel)。
由於索引僅包含關於水平和行程是否有效的信息,因此可能需要連同碼元一起發送附加信息來允許解碼器準確地重新創建變換係數系列。由此,在來自索引的每一碼元之後,如果水平是有效水平,則該水平的值被單獨編碼並在該碼元之後發送。同樣,如果一碼元指示零行程是非零(正)長度,則該長度被單獨編碼並在該碼元之後發送。
圖17示出了精簡的3D-2D編碼1740的一個示例,它表示變換係數絕對值的示例系列1700。變換係數的符號可在別處編碼。如圖17所示,示例係數系列1700以「5,0,0」開始。在諸如上述的非精簡3D-2D中,第一碼元則是。然而,在精簡編碼中,圖17示出來自索引的第一碼元1745。該碼元指示在第一個非零係數之前沒有零,第一個非零係數具有大於1的絕對值,並且在該非零係數之後有至少一個零。該碼元後跟指示非零係數的絕對值是5的有效水平值「level_5」(1755),以及指示在該係數之後有兩個零的非零行程值「run_2」」(1765)。相反,指示絕對值1的非零係數後面不跟零的碼元1775不需要有其它值跟在其後來提供信息。
由於某些碼元需要在它們之後發送附加信息,因此應分析來自索引的碼元來確定是否應連同它們一起發送附加信息。圖18示出了由編碼器400(圖4)執行的確定在3D索引碼元中包含了什麼信息以及在適當時發送附加信息的示例過程1800。在過程1800的各種實現中,動作可被移除、組合或分割成子動作。在對圖18的碼元的描述中,值「x」是佔位符,表示對一碼元的該特定部分的任何可能值。該過程在動作1810處開始,在那裡發送第一個編碼的碼元。接著,在判定動作1820處,編碼器確定該碼元是否為的形式。這等效於詢問由該碼元表示的非零係數是否具有大於1的絕對值。如果編碼器確定情況如此,則在動作1830處編碼並發送該非零係數的值。重要的是注意,儘管圖18沒有明確討論對非零係數的符號的編碼,但是該符號可在過程1800的若干點處包括。在各個實現中,這可涉及緊接在聯合編碼的碼元之後、在聯合編碼的碼元內、和/或連同水平的絕對值一起發送符號。
不論動作1820處的判定如何,在判定動作1840處,編碼器確定碼元是否為的形式。該判定等效於詢問由該碼元表示的非零係數是否具有任何前導的零。如果是,則在動作1850處,編碼器對非零係數之前的零行程的長度進行編碼並發送該值。
接著,在判定動作1860處,編碼器考慮在碼元為的情況下的t值。該判定等效於詢問由該碼元表示的非零係數是否具有跟在其後的任何零。如果t=0,則編碼器知道沒有後續零,並且繼續在動作1880處發送更多碼元,且過程1800結束。在一個實現中,圖19的過程1900然後對下一碼元開始。如果t=1,則編碼器在動作1870處編碼並發送在非零係數之後的零行程的長度,然後繼續在動作1880處發送碼元,並且過程1800結束。然而,如果t=2,則編碼器知道由該碼元表示的非零係數是該系列中的最後(且唯一)一個,且因此由變換係數表示的塊完成。由此,過程1800結束,並且在適當時可變換和編碼下一塊。
圖19示出了由編碼器400(圖4)執行的確定2D索引碼元中包含什麼信息以及在適當時發送附加信息的示例過程1900。在過程1900的各個實現中,動作可被移除、組合或分割成子動作。如圖18中一樣,在圖19中,值「x」是佔位符,表示對一碼元的該特定部分的任何可能值。該過程在動作1910處開始,在那裡發送下一編碼的碼元。接著,在判定動作1920處,編碼器確定該碼元是否為的形式。這等效於詢問由該碼元表示的非零係數是否具有大於1的絕對值。如果編碼器確定情況如此,則在動作1930處編碼並發送非零係數的值。如在過程1800中一樣,重要的是注意,儘管圖19沒有明確討論對非零係數的符號的編碼,但是該符號可在過程1900中的若干點處包括。
接著,在判定動作1940處,編碼器在碼元為的情況下考慮t值。該判定等效於詢問由該碼元表示的非零係數後面是否跟有任何零。如果t=0,則編碼器知道沒有後續零,並且在動作1960處繼續發送更多碼元,且過程1900結束。在一個實現中,圖19的過程1900然後對下一碼元重複。如果t=1,則編碼器在動作1950處編碼並發送跟在非零係數之後的零行程的長度,然後在動作1960處繼續發送碼元,並且過程1900結束。然而,如果t=2,則編碼器知道由該碼元表示的非零係數是該系列中的最後一個,並且因此由編碼係數表示的塊完成。由此,過程1900結束,並且可在適當時變換並編碼下一塊。
3.5附加係數 除了以上討論的碼錶大小減小之外,分解行程和水平碼元的一個好處是在發送了3D聯合碼元之後,解碼器可確定在該塊中是否有任何前導零。這意味著描述第一或第二上下文是否有效的上下文信息在解碼器側是已知的,並且構成了用於編碼第一個非零係數的level1值的有效上下文。這意味著應用於2D碼元的level1值的上下文可同樣應用於3D碼元的level1值,即使聯合編碼的索引碼元利用了不同的字母表。
此外,由於塊中的變換係數的總數是常數,因此每一連續行程由一單調遞減序列來界定。在一個較佳實現中,在編碼行程值時充分利用了這一信息。例如,一碼錶可包括用於在一組係數的前一半中開始的行程的一組行程值代碼,以及用於在後一半中開始的行程的不同的一組行程值代碼。由於在後一半中開始的任何可能行程的長度必定小於在前一半中開始的行程的可能長度,因此第二組代碼不必如此大,從而減小了熵並改善了編碼性能。
其它信息可通過仔細觀察係數的位置來收集。例如,如果由一碼元表示的非零係數出現在該係數系列中的最後一個位置上,則「最後」總是為真。類似地,如果由一碼元表示的非零係數出現在數組的倒數第二位置,則要麼「最後」為真,要麼後續行程為零。這些觀察結果中的每一個都允許經由更短的表來編碼。
3.6索引實現示例 第一索引具有大小為12的字母表。在一個實現中,對被定義為第一索引=a+2b+4C的碼元有五個哈夫曼表可用,其中碼元是,並且a和b是0或1,c可取值0、1或2。用於每一表的12個碼元的碼字長度的一種實現如下給出。在一個實現中,標準哈夫曼碼構造可用於導出這幾組前綴碼字 表15,6,7,7,5,3,5,1,5,4,5,3 表24,5,6,6,4,3,5,2,3,3,5,3 表32,3,7,7,5,3,7,3,3,3,7,4 表43,2,7,5,5,3,7,3,5,3,6,3 表53,1,7,4,7,3,8,4,7,4,8,5 後續索引碼元具有大小為6的字母表。在一個實現中,索引被定義為索引=a+2b,其中碼元是,a是布爾值,b可取值0、1或2。對索引定義四個哈夫曼表,如下所示 表11,5,3,5,2,4 表22,4,2,4,2,3 表34,4,2,2,2,3 表45,5,2,1,4,3 另外,在一個實現中,為了利用以上第3.5節中所描述的某些信息,當係數位於最後一個數組位置上時,使用一位碼(由a定義)(在這一情況中,b唯一地為2)。在一個實現中,當係數在倒數第二的位置上時,使用二位代碼,因為已知b≠1。
有效水平的一個實現使用將一水平範圍摺疊成7個槽的分槽(binning)過程來編碼水平。一個槽內的水平使用固定長度碼來編碼,並且槽本身使用哈夫曼碼來編碼。在一個實現中,這可通過上述分組技術來完成。類似地,在一個實現中,非零行程使用基於當前碼元的位置索引到5個槽的分槽過程來編碼。
3.7解碼3D-2D碼元 圖20示出了由解碼器500(圖5)執行的將一系列碼元解碼成變換係數的示例過程2000。在過程2000的各個實現中,動作可被移除、組合或分割成子動作。
此外,動作可被定義為處理諸如由被破壞的比特流觸發的出錯條件。該過程在動作2010處開始,在那裡解碼器接收第一個聯合編碼的碼元,並使用3D碼錶來解碼該碼元。接著,在動作2020處,基於所解碼的碼元(包括同樣存在於壓縮比特流中的任何水平或行程信息)來填充變換係數。該動作的一個實現將參考圖21在以下更詳細描述。該過程然後繼續到判定動作2030,在那裡解碼器確定該碼元是否指示它是用於最後一個非零係數的。如果是,則該過程繼續到動作2090,在那裡用零填充其餘的未填充係數,並且過程2000結束。
如果該碼元不是用於最後一個非零係數的,則該過程繼續到判定動作2040,在那裡解碼器確定迄今為止是否有任何碼元指示了任何零係數。如果否,則該過程繼續到動作2050,在那裡接收下一碼元,並使用遵循第一上下文模型的2D碼錶來解碼該碼元。如果相反,在判定動作2040處指示了零係數,則在過程2060處,解碼器接收下一碼元並使用遵循第二上下文模型的2D碼錶來解碼該碼元。不論使用哪一上下文模型,該過程然後都前進到動作2070,在那裡基於解碼的碼元(包括同樣存在於壓縮比特流中的任何水平或行程信息)來填充變換係數。如在動作2020中一樣,這一動作的一個實現將參考圖21在以下更詳細描述。該過程然後繼續到判定動作2080,在那裡解碼器確定該碼元是否指示它是用於最後一個非零係數的。如果不是,則該過程返回到判定動作2040並重複。如果是,則該過程繼續到動作2090,在那裡用零填充任何其餘未填充係數並且過程2000結束。
圖21示出了由解碼器500(圖5)執行的填充變換係數的示例過程2100。在過程2100的各個實現中,動作可被移除、組合或分割成子動作。儘管過程2100被配置成解碼根據以上第3.4節的技術編碼的碼元,但是在替換實現中,水平值和行程長度可被包括在2D和3D碼元中,這允許過程2100被簡化。該過程在動作2110處開始,在那裡解碼器確定該碼元是否為3D碼元。如果不是,則該過程跳轉到以下描述的判定動作2140。然而,如果該碼元是3D碼元,則解碼器在判定動作2120處確定該碼元是否指示正長度的初始零係數行程。這可通過確定3D碼元中的nonZero_run值是指示正長度的行程的1還是指示零長度行程的0來完成。如果該碼元指示了正長度的零係數行程,則該過程繼續到動作2130,在那裡基於跟隨3D碼元的編碼的level1來解碼行程長度,並且根據該行程長度用零來填充初始變換係數。
接著,該過程繼續到判定動作2140,在那裡解碼器確定該碼元是否指示其非零係數具有大於1的絕對值。這可通過確定碼元中的nonOne_level值是指示該水平具有大於1的絕對值的1還是指示非零係數要麼為-1要麼為1的0來完成。如果該碼元沒有指示具有大於1的絕對值的係數,則該過程繼續到動作2150,在那裡取決於非零係數的符號,要麼用-1要麼用1來填充下一係數。如果該碼元指示具有大於1的絕對值的係數,則該過程改為繼續到動作2160,在那裡解碼係數的水平並且用該水平值以及其符號來填充該係數。如上所述,符號可用各種方式來指示,因此係數符號的解碼沒有在動作2150或2160中明確討論。
接著,在判定動作2170處,解碼器確定該碼元是否指示正長度的後續零係數行程。這可通過確定碼元中的nonZero_run_last值是指示正長度的行程的1還是指示零長度的行程的0來完成。(nonZero_run_last等於2的情況未示出,因為該情況在過程2000中處理。)如果該碼元指示正長度的零係數行程,則該過程繼續到動作2180,在那裡基於跟隨該碼元的編碼的run1來解碼行程長度,並且根據該行程長度用零來填充後續的變換係數,且過程2100結束。
4.計算環境 上述編碼器400(圖4)和解碼器500(圖5)以及用於高效地編碼和解碼變換係數的技術可以在其中執行數字媒體信號處理的各種設備中的任一種上執行,這些設備包括計算機;圖像和視頻記錄、傳輸和接收設備;可攜式視頻播放器;視頻會議;以及其它示例。數字媒體編碼技術可以用硬體電路以及諸如在圖22所示的計算機或其它計算環境中執行的數字媒體處理軟體來實現。
圖22示出了其中可實現所描述的實施例的合適的計算環境(2200)的一般化的示例。計算環境(22500)並不對本發明使用範圍或功能提出任何局限,因為本發明可在不同的通用或專用計算環境中實現。
參考圖22,計算環境(2200)包括至少一個處理單元(2210)和存儲器(2220)。在圖22中,這一最基本的配置(2230)被包括在虛線內。處理單元(2210)執行計算機可執行指令,並且可以是真實或虛擬處理器。在多處理系統中,多個處理單元執行計算機可執行指令以提高處理能力。存儲器(2220)可以是易失性存儲器(例如,寄存器、高速緩存、RAM)、非易失性存儲器(例如,ROM、EEPROM、快閃記憶體等)或兩者的某種組合。存儲器(2220)儲存實現所描述的編碼器和/或解碼器以及高效變換係數編碼/解碼技術的軟體(2280)。
計算環境可具有附加特徵。例如,計算環境(2200)包括存儲(2240)、一個或多個輸入設備(2250)、一個或多個輸出設備(2260)以及一個或多個通信連接(2270)。諸如總線、控制器或網絡等互連機制(未示出)將計算環境(2200)的各組件互連。通常,作業系統軟體(未示出)為在計算環境(2200)中執行的其它軟體提供了操作環境,並協調計算環境(2200)的各組件的活動。
存儲(2240)可以是可移動或不可移動的,並包括磁碟、磁帶或磁帶盒、CD-ROM、CD-RW、DVD或可用於儲存信息並可在計算環境(2200)內訪問的任何其它介質。存儲(2240)儲存用於實現所描述的編碼器/解碼器和高效變換係數編碼/解碼技術的軟體(2280)的指令。
輸入設備(2250)可以是諸如鍵盤、滑鼠、筆或跟蹤球等觸摸輸入設備、語音輸入設備、掃描設備或向計算環境(2200)提供輸入的另一設備。對於音頻,輸入設備(2250)可以是音效卡或接受模擬或數字形式的音頻輸入的類似設備、或將音頻樣本提供給計算環境的CD-ROM讀取器。輸出設備(2260)可以是顯示器、印表機、CD刻錄機或提供來自計算環境(2200)的輸出的另一設備。
通信連接(2270)允許通過通信介質與另一計算實體的通信。通信介質在已調製數據信號中傳達諸如計算機可執行指令、壓縮的音頻或視頻信息、或其它數據等信息。已調製數據信號是其一個或多個特性以對信號中的信息編碼的方式來設定或更改的信號。作為示例而非局限,通信介質包括用電、光、RF、紅外、聲學或其它載體實現的有線或無線技術。
此處的數字媒體處理技術可在計算機可讀介質的一般上下文中描述。計算機可讀介質可以是可在計算環境內訪問的任何可用介質。作為示例而非局限,對於計算環境(2200),計算機可讀介質包括存儲器(2220)、存儲(2240)、通信介質和以上任一種的組合。
此處的數字媒體處理技術可在諸如程序模塊中所包括的、在目標真實或虛擬處理器上的計算環境中執行的計算機可執行指令的一般上下文中描述。一般而言,程序模塊包括執行特定任務或實現特定抽象數據類型的例程、程序、庫、類、組件、數據結構等。程序模塊的功能可如各種實施例中所需地被組合或在程序模塊之間拆分。用於程序模塊的計算機可執行指令可在本地或分布式計算環境中執行。
出於表示的目的,詳細描述使用了如「確定」、「生成」、「調整」和「應用」等術語來描述計算環境中的計算機操作。這些術語是對由計算機執行的操作的高級抽象,並且不應與人類執行的動作混淆。對應於這些術語的實際計算機操作可取決於實現而變化。
鑑於此處描述的主題的許多可能的變型,要求保護落入所附權利要求書及其等效技術範圍內的所有這些實施例作為本發明。
權利要求
1.一種編碼表示數字媒體數據的變換係數系列(1300)的方法,包括
將所述變換係數系列表示(1400)為一碼元系列(1340),其中每一碼元(1355)包括來自所述變換係數系列的非零係數的指示以及後續的零值係數行程的長度的指示;
對於所述碼元系列中的每一碼元,發送(1600)所述碼元以便在壓縮比特流(420)中編碼;以及
其中所述變換係數系列中的最後一個非零係數由一碼元(1365)來表示,其中所述後續的零值係數行程的長度的指示包括所述係數是所述最後一個非零係數的指示符。
2.如權利要求1所述的方法,其特徵在於,所述碼元系列中的第一個碼元另外包括在所述變換係數系列中的第一個非零係數之前的零值係數行程的長度的指示。
3.如權利要求2所述的方法,其特徵在於,所述變換係數系列從確定一寬範圍變換係數系列的歸一化部分得到。
4.如權利要求2所述的方法,其特徵在於,使用一組碼錶來編碼所述碼元系列中的第一個碼元,並且使用一組不同的碼錶來編碼所述碼元系列中的其它碼元。
5.如權利要求2所述的方法,其特徵在於,所述碼元系列中的每一碼元具有一相關聯的上下文。
6.如權利要求5所述的方法,其特徵在於,用於一碼元的上下文至少部分地基於由所述碼元表示的非零係數是出現在所述係數系列中的第一個零值係數之前還是之後。
7.如權利要求5所述的方法,其特徵在於,用於一碼元的上下文至少部分地基於所述變換係數系列是用於亮度還是色度通道。
8.如權利要求5所述的方法,其特徵在於,用於一碼元的上下文至少部分地基於所述變換係數系列是用於內部變換、中間變換還是外部變換。
9.如權利要求2所述的方法,其特徵在於,對於每一碼元,所述碼元中所述後續零值係數行程的長度的指示包括指示所述碼元上的以下情況之一的三進位碼元
所述零值係數行程為零長度;
所述零值係數行程為正長度;
由所述碼元指示的係數是所述變換係數系列中的最後一個係數。
10.如權利要求9所述的方法,其特徵在於,所述碼元系列中的第一個碼元中的第一個非零係數之前的零值係數行程的長度的指示包括指示所述第一個非零係數之前的零值係數的行程是零長度還是正長度的布爾值。
11.如權利要求9所述的方法,其特徵在於,還包括在一碼元包括零值係數行程為正長度的指示時,發送所述零值係數行程的長度以便在所述壓縮比特流中編碼。
12.如權利要求1所述的方法,其特徵在於,對每一碼元,所述碼元中對來自所述變換係數系列的非零係數的指示包括指示所述非零係數的絕對值是否大於1的布爾值。
13.如權利要求12所述的方法,其特徵在於,還包括在一碼元包括非零係數具有大於1的絕對值的指示時,發送所述非零係數的絕對值以便在所述壓縮比特流中編碼。
14.一種數字媒體解碼器,包括
用於儲存已編碼的數字媒體數據的數據存儲緩衝器(2280);以及
處理器(2210),它被配置成
接收描述一變換係數系列的一組壓縮碼元(420);
解壓所述碼元(510);以及
通過分析所述一組解壓縮碼元來重構(520)所述變換係數系列;並且
其中
所述一組壓縮碼元包括從根據一上下文模型的一組碼錶編碼(1600)的聯合編碼碼元(1340);
每一聯合編碼碼元(1355)描述了來自所述變換係數系列的非零水平,以及在所述非零水平之後是否有零值係數。
15.如權利要求14所述的數字媒體解碼器,其特徵在於
每一聯合編碼碼元通過指示一非零水平的絕對值是否大於1來描述所述非零水平;
所述一組壓縮碼元另外包括描述每一非零水平的值以及水平符號的指示的水平碼元;以及
所述處理器還被配置成在分析指示其絕對值大於1的非零水平的聯合編碼碼元時,通過找到描述所述非零水平的值的水平碼元來重構所述非零水平。
16.如權利要求14所述的數字媒體解碼器,其特徵在於,所述一組壓縮碼元中的第一個碼元另外描述在所述變換係數系列中的非零水平之前是否有零值係數。
17.如權利要求14所述的數字媒體解碼器,其特徵在於
每一聯合編碼碼元通過指示一零值係數行程的長度是否大於0來描述所述零值係數行程;
所述一組壓縮碼元另外包括描述其長度大於0的每一零值係數行程的長度的行程碼元。
18.一種或多種承載指令的計算機可讀介質,所述指令描述了一種用於執行解碼壓縮數字媒體數據的方法的數字媒體解碼程序,所述方法包括
接收(2000)包括從根據一上下文模型的一組碼錶編碼的壓縮的聯合編碼碼元(1340)的比特流(420);
解碼(2000)所述聯合編碼碼元以對每一碼元確定變換係數水平和後續變換係數零的行程;以及
從所確定的水平和變換係數零的行程來重構(2100)一組變換係數。
19.如權利要求18所述的計算機可讀介質,其特徵在於,所述比特流還包括初始的聯合編碼碼元,並且所述方法還包括解碼所述初始的聯合編碼碼元以確定初始變換係數零的行程、變換係數水平、以及後續變換係數零的行程。
20.如權利要求18所述的計算機可讀介質,其特徵在於
所述聯合編碼碼元對每一變換係數水平指示所述水平是否具有大於1的絕對值;
所述聯合編碼碼元對每一變換係數零的行程指示所述行程是否具有大於0的長度;
所述比特流還包括描述所述變換係數零的行程的長度、以及所述變換係數水平的符號和幅值的壓縮碼元;以及
解碼所述聯合編碼碼元包括
當解碼指示變換係數水平具有大於1的絕對值的聯合編碼碼元時,通過解碼所述比特流中指示所述變換係數水平的符號和值的一個或多個碼元來確定該變換係數水平;以及
當解碼指示變換係數零的行程大於0的聯合編碼碼元時,通過解碼所述比特流中指示所述行程的長度的碼元來確定所述變換係數零的行程的長度。
全文摘要
一種基於塊變換的數字媒體編解碼器通過對非零係數以及後續的零值係數行程進行聯合編碼來更高效地編碼變換係數。當非零係數是其塊中的最後一個時,在該係數的碼元中用最後指示符來替代行程值。在將非零係數與初始和後續零行程聯合編碼的特殊碼元中指示初始非零係數。該編解碼器通過識別非零係數行程中的間斷並在這一間斷的任一側上單獨編碼非零係數來允許多個編碼上下文。該編解碼器還通過在每一碼元中指示非零係數是否具有大於1的絕對值以及零行程是否具有正值來減小碼錶大小,並在碼元外部單獨編碼係數水平和行程長度。
文檔編號H04N7/12GK101243611SQ200680029309
公開日2008年8月13日 申請日期2006年8月3日 優先權日2005年8月12日
發明者S·斯裡尼瓦杉 申請人:微軟公司