CABAC編碼

H.264/AVC標準采用了很多新技術和新方法,大大提高了視頻編碼效率,其中CABAC便是H.264/AVC采用的新型熵編碼方法之一。CABAC采用了高效的算術編碼思想,同時充分考慮了視頻流相關統計特性,大大提高了編碼效率。概括起來,CABAC有三個豐要特點:
????? (1)上下文建模提供編碼符號條件概率分布的估計。利用適當的上下文模型,在編碼當前符號時,根據已編碼的臨近符號的概率統計,在不同的概率模型間轉換,借此去掉符號間的冗余。
????? (2)算術編碼可以給每一個符號字母分配非整數比特,因此符號能以接近它的熵率被編碼。這對概率大于O.5的符號很有效。如果選擇了高效的概率模型,符號概率常常大于O.5,這時分數比特就比UVLC的整數比特(至少1比特)高效得多。
????? (3)自適應的算術編碼可以使熵編碼器自適應動態符號的概率統計。一般情況下,運動矢量的概率統計隨空間、時間的不同,或序列、碼牢的不同可以發生較大的變化。因此,自適應模型由于充分利用已編碼符號的概率統計,可使算術編碼更好地適應當前符號的概率,從而提高了編碼效率。

CABAC包括三個部分:二進制化、上下文建模和二進制算術編碼


下面對每個部分進行詳述:
(1)二進制化
?????? CABAC是二進制算術編碼,對非二進制符號如運動矢量、宏塊類型、參考幀號以及變換量化后的殘差數據,需要預先進行二進制化。在H.264/AVC標準中,CABAC二進制化方案由基本方案和串接方案組成。基本方案有一元碼(Unary binarization,U),截斷一元碼(Truncatedunary binarization,TU),K階指數哥倫布碼(Kthorder Exp_golomb binarization,UEGK)和定長碼(Fixed.1ength binarization,FL)四種。串接方案由基本方案串接而成。不同的二進制化方案適用于不同類型的語法元素。對于數值變化范圍較大的殘差數據(如運動矢量與運動矢量預測值間的殘差數據MVD)用UEGK碼表示對于簡單的符號標志元素用FL碼表示。下面是四種基本方案的編碼方法:

U二進制化編碼:此方法將一個無符號整數X,編碼為X個“1”并加上一個后綴位“0”。例如,整數3轉換為“lllO”。

TU二進制化編碼:此方法根據參數cMax采用不同的轉換方法。如果無符號整數x<cMax,用Unary binarization方法轉換;如果x=cMax,X被轉換成X個“1”。

UEGK二進制化編碼:用此方法轉換后的碼字由兩部分構成:前綴和后綴。前綴部分由Unary binarization轉換得到。

FL二進制化編碼:此方法為語法元素工設定固定的長度。假如0≤X<cMax,其長度L=

????? CABAC把待編碼的語法元素按照一定的規則轉換為只用“0”和“l”表示的二進制比特流,稱為比特流(bin string),然后采用不同的概率模型對bin string進行編碼,充分考慮了視頻流的相關性,能適應信號統計特性的變化,容易達到漸進性能。在編碼過程中,bin string的信源符號被分為大概率符號(Most Probability Symbol,MPS)和小概率符號(Least Probability Symbol,LPS)。若MPS為“0”,則LPS為“l"。反之,若NIPS為“l",則LPS為“0”。但當MPS與LPS的出現概率相差比較大時,根據信息熵的原理,bin string的熵值比較小,壓縮效果比較好。如果MPS與LPS出現概率相當或者相等,bin string的熵值就比較大,則壓縮效果不明顯。

(2)上下文建模
????? 編碼符號具有上下文相關性,利用已編碼符號提供的上下文信息,為編碼符號選擇合適的概率模型,這就是上下文建模。它是為了對與運動、模式和結構信息相關的句法元素進行編碼而設計的。通過對上下文模型的構建,摹本概率模型能夠適應隨視頻圖像而改變的統計特性,降低符號間的冗余度,并大大減少運算開支。
????? CABAC將片作為算術編碼的牛命周期,H.264/AVC標準將一個片內可能出現的數據劃分為399個上下文模型,每個模型均有自己的上下文序號(Ctxldx),每個不同的字符依據對應的上下文模型,來索引自身的概率查找表。即收到字符后,先索引該字符的Ctxldx,才能找到它的概率查找表(TransldxLPS)。這些模型的劃分精確到比特,幾乎大多數的比特和它們鄰近的比特處于不同的上下文模型中。查找每個比特所對應的上下文模型有兩個步驟:
????? 第一步:確定該比特所屬的句法元素。CABAC為每個句法元素分配了一個上下文模型區間,詳見Table9.1l。
????? 第二步:按照某一個法則為當前比特在上一步中得到的區間中找到對應的Ctxldx。該法則對不同的句法元素各不相同,它通常用表來表示。那些399個上下文模型模型分為4種類型:第一種類型根據左邊和上邊的語法元素對當前的語法元素進行預測。第二種類型僅用于宏塊類型和予宏塊類型。其中第n比特的類型要參考前面已編碼的n-1比特所采用的類型。第三、四種類型只用于殘差。第三種類型不依賴前面的編碼數據,而是依賴掃描路徑的位置。第四種類型還包括對編碼積聚數量的計算。在CABAC中用“個有代表性的概率值來表示LPS的概率。這64個概率值通過公式(3.1)和(3.2)來計算產生:

值可以用7個比特來表示。

?

?????? 前文提到CABAC的生命期是片,每個片開始,要對399種上下文模型全部過行初始化工作,初始化的步驟是:

?

?

?

?

?

?

?

?

?

?

(3)二進制算術編碼
?????? 概率估計和編碼器構成了一個自適應二進制算術編碼器。概率估計是在前一次上下文建模階段更新后的概率估計。在對每個二進制數值編碼過后,這個概率估計的值又要根據剛剛編碼的二進制符號進行調整。二進制算術編碼是算術編碼的特殊情況,其原理與一般算術編碼一樣。所不同的是,在二進制算術編碼中編碼序列只有“0"和“l一兩種符號,所涉及的概率也只有P(0)和P(1)。概率區間分成兩份,一份是MPS的編碼區間,一份是LPS的編碼區間。區間長度由每個信源符號的概率決定,LPS的編碼區間總應該小于MPS的編碼區間。若把LPS的概率記為Q,則MPS的概率記為P=I-Q。在編碼進程中,如果有連續的LPS輸入,有可能出現Q>P的情況,此時MPS和LPS所代表的信源符號要互換,以確保MPS所代表的信源符號的概率始終大于LPS所代表的信源符號的概率。在每個片開始時,CABAC進行初始化,建立了一個概率狀態表。在進行二進制算術編碼時,每一位的概率狀態值通過查概率狀態表得到。而且每編碼完一位,就要對概率狀態表中的狀態值進行更新。概率狀態值的更新是這樣實現的:如果編碼的比特位(binval)是NIPS,概率狀態值a加l,這意味著R值減小,(1.R)值增大,這實際就是表示下一次出現MPS的概率增大,出現LPS的概率減小。如果a=62,表示(1.n)已經達到最大,這時a不再改變,直到出現LPS。如果編碼的比特位biIlvm是LPS,且a=0,表示MPS和LPS的概率相等,MPS和LPS的值進行互換。具體的概率值更新參考公式(3.3)

?

?

?????? 為了方便觀察,我們給出CABAC概牢估計與更新模型圖(如圖3.2)。在處理binval時,概率的刷新有兩個方向:如果binval是LPS,則LPS的概率變大,順著下圖中的虛線向左尋找;如果binval是MPS,則LPS的概率變小,順著下圖中的實線向右尋找。我們可以看到,當出現MPS時的更新值都只是簡單地指向當前值的下一位,即a+l。也即,當前處理的字符為MPS時,區間遞進只是了區間的長度發生了改變,而作為影響實際輸出值的L卻沒有發生改變,這個現象意味著如果輸入流中連續出現大量的MPS,或者MPS相對LPS出現的概率比較高時,可以達到極高的壓縮效果,編碼輸出的碼率也更接近熵率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455731.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455731.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455731.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【教程分享】Jmeter入門教程

好&#xff01;回歸學長每周的教程分享&#xff01; PART2 >今天又來分享Jmter 因為最近好像有相關工作內容 提前準備資修一下 分享僅供參考- JMeter的作用對軟件做壓力測試 1.能夠對HTTP和FTP服務器進行壓力和性能測試&#xff0c; 也可以對任何數據庫進行同樣的測試&…

linux 特殊shell變量

特殊變量 環境變量&#xff1a; 系統本身運行需要由linux系統提前創建好的一類變量 主要用于用戶的工作環境&#xff0c;包括&#xff08;用戶的宿主目錄&#xff0c;命令的查找路徑&#xff0c;用戶的當前目錄&#xff0c;登錄的終端等&#xff09;環境變量的值由操作系統本身…

JavaScript中的循環

js循環 程序中進行有規律的重復性操作&#xff0c;需要用到循環語句。 break 和 continue 語句對循環中的代碼執行提供了更嚴格的控制。 for循環 for(var i0;i<len;i){...... }while循環 var i0;while(i<8){......i;}for-in 語句 for-in 語句是嚴格的迭代語句&…

快速傅里葉變換python_FFT快速傅里葉變換的python實現過程解析

FFT是DFT的高效算法&#xff0c;能夠將時域信號轉化到頻域上&#xff0c;下面記錄下一段用python實現的FFT代碼。 # encodingutf-8 import numpy as np import pylab as pl # 導入和matplotlib同時安裝的作圖庫pylab sampling_rate 8000 # 采樣頻率8000Hz fft_size 512 # 采樣…

rabbitmq的安裝全過程

2019獨角獸企業重金招聘Python工程師標準>>> 1 首先下載安裝依賴elang 添加yum支持 cd /usr/local/src/ mkdir rabbitmq cd rabbitmq wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm rpm -Uvh erlang-solutions-1.0-1.noarch.rpm rp…

【框架學習分享】HttpRunner

今天文章分為兩部分 :) PART1 HttpRunner內容分享/ PART2 關于后廠村兒 10 Minutes HttpRunner: PART 1 首先感謝作者開源&#x1f44d; 因為最近工作需要用到HttpRunner&#xff0c; 于是便趁著周末學了下這個測試框架&#xff0c;感覺還可以~ 所以分享一下今天的學習記…

x264 移植到 ARM的方法

1。Linux下編譯X264&#xff1a; 其實在windows下使用vc已經編譯過了&#xff0c;不過聽到有人說在linux下編好了&#xff0c;我也就嘗試做一下&#xff0c;況且x264源代碼的makefile已經做好了&#xff0c;我只需要做的就是把文件copy一下&#xff0c;然后make 一下就可以了。…

JavaScript中的元素獲取與操作

js元素獲取與操作 可以使用內置對象document上的getElementById方法來獲取頁面上設置了id屬性的元素&#xff0c;獲取到的是一個html對象&#xff0c;然后將它賦值給一個變量&#xff0c;比如&#xff1a; <script type"text/javascript">var oDiv document…

VUE2第五天學習---自定義指令

閱讀目錄 1.理解VUE中的自定義指令回到頂部1.理解VUE中的自定義指令 默認核心指令有 (v-model 和 v-show), 但是有時候我們需要用到自定義指令&#xff0c;在vue中&#xff0c;代碼復用主要形式和抽象是組件&#xff0c;但是在有的情況下&#xff0c;我們仍然需要對DOM元素進行…

python報名_2019年少兒Python創意編程比賽報名時間

2019年Python創意編程比賽時間及相關規定&#xff1a;參賽對象 Python創意編程比賽設初中組和高中組。 全國各地初中、高中(含中等職業學校)在校學生均以個人名義報名參加。 參賽步驟 Python創意編程比賽分初評、復評和終評三個階段&#xff0c;初評和復評以線上形式開展&#…

【分享】后廠村鮮為人知的另一面

好&#xff01;回歸學長每周的雜談分享&#xff01; 有人說“后廠村”像一座孤島&#xff0c; 這里遠離喧囂&#xff0c;沒有生活氣息。 而剛剛到廠的學長&#xff0c; 卻想和你分享他鮮為人知的另一面。 內容整理源于網絡看客原創侵刪 說起后廠村&#xff0c;也許是老北京人…

windows 下安裝rabbitmq

2019獨角獸企業重金招聘Python工程師標準>>> 1、下載 下載地址&#xff1a;http://www.rabbitmq.com/download.html 2、Windows上安裝 2.1 安裝安裝Erlang 下載erlang&#xff1a;http://www.erlang.org/download/otp_win64_17.3.exe 安裝&#xff1a; erlang安裝完…

【Kubernetes】k8s 的基本使用指令

今天分享如題&#xff1a; Kubernetes 最近更新緩慢由于工作太忙惹&#xff0c;忙里偷閑整理愿能與君共勉&#x1f4aa; K8S對我來說是個新的技術棧&#xff0c;程序員就是需要一直充電&#x1f50b; 加油&#xff0c;一起進步&#x1f4aa; 結構模型 k8s 是經典的一對多模…

php是如何工作的

a:前提條件: apache服務器啟動正常工作 b:客戶端瀏覽器在地址欄輸入一個程序地欄 按回車發送請求 {請求}http://127.0.0.1/day03/1.php c:apache接收請求&#xff0c;并且負責查找相應資源1.php d:如果apache沒有找到相應的資源,返回錯誤消息給客戶端瀏覽器404 NOT FOUND e:如果…

c語言 malloc_C語言快速入門——動態內存分配

在前面一系列的字符串操作中&#xff0c;我們都是先定義一個固定大小的字符數組&#xff0c;然后根據所需&#xff0c;或拷貝、或連接、或格式化來為這個數組提供內容。固定大小的數組意味著在程序運行期間&#xff0c;數組所占用的內存是確定的(即劃分了固定數量的內存)&#…

FFMPEG設置 cbr討論

Q:我采用ffmpeg調用x264一直出錯&#xff0c;命令如下ffmpeg -s 352x288 -r 50 -pix_fmt yuv420p -i tmp.yuv tmp.h264可不可以給點建議&#xff0c;找了很久也沒有找到解決辦法&#xff0c;錯誤時error while opening encoder for output stream 0.0 maybe incorrect parame…

博文聲明

本博客用于分享學習筆記 歡迎大神指正&#xff0c;我們互相學習交流&#xff0c;共同成長進步&#xff01; 博客首頁:秋葉夏風的博客

【經驗分享】工程開發與Coding規范

今天分享分為兩部分 :) PART01 工程開發代碼規范分享/ PART02 關于某易云自動簽到聽歌分享- 5Mins DevCoding Rule: PART 1 了解真實工程開發&#x1f3d7;..... 本篇內容分享的宗旨: 學長工作經驗之談僅作分享&#x1f3f7; Ready,Go 代碼管理——工具篇 ?工程上首先需要…

過濾器與攔截器區別

過濾器與攔截器區別 參考&#xff1a;http://www.cnblogs.com/dreamroute/p/4198087.html?utm_sourcetuicool 過濾器 過濾器是一個程序&#xff0c;它先于與之相關的servlet或JSP頁面運行在服務器上。它是隨你的web應用啟動而啟動的&#xff0c;只初始化一次&#xff0c;以后就…

二進制-高效位運算

數獨 數獨是介紹位運算的好例子&#xff0c;運用位運算和不運用效率差別還是挺大的。我們先看數獨需求: 1、當前數字所在行數字均含1-9&#xff0c;不重復 2、當前數字所在列數字均含1-9&#xff0c;不重復 3、當前數字所在宮&#xff08;即3x3的大格&#xff09;數字均含1-9&a…