H.264解碼器中CAVLC碼表查找算法的分析與優化

0 引言
??? 近年來,隨著信息技術飛速發展和互聯網的日益普及,尤其是以視頻為信息主要來源的多媒體領域越來越受到人們的關注。H.264是ITU-T的視頻編碼專家組(VCEG)和ISO/IEC的活動圖像編碼專家組(MPEG)的聯合視頻組(Joint Video Tearn,JVT)開發的一個新的數字視頻編碼標準,它既是ITU-T的H.264,又是ISO/IEC的MPEG-4的一部分。H.264和以前的標準一樣,也是DPCM加變換編碼的混合編碼模式。H.264標準可分為三檔:基本檔次(其簡單版本,應用面廣);主要檔次(采用了多項提高圖像質量和增加壓縮比的技術措施,可用于SDTV、HDTV和DVD等);擴展檔次(可用于各種網絡的視頻流傳輸)。
??? H.264/AVC的編解碼框架的基本結構與早期的編碼標準(H.263、MPEG4等)相似,都是由運動估計、變換、量化、熵編碼、環路去塊效應濾波器等功能單元組成的。H.264視頻編碼框架的主要變化包括:引入了環內去塊效應濾波器,去塊效應處理后的宏塊被保存在內存中用于對后續宏塊的預側;采用了多參考幀運動估計,需要在內存中保留多個參考視頻幀;引入了幀內預測機制,可以通過同一幀內的宏塊進行預測;采用了新的整型變換方式,取代了以前的離散余弦變換(DCT);H.264與以前視頻標準在運動估計的模式上也有了較大的變化,H.264支持7種模式的可變塊運動估計。此外,在熵編碼中還引入了上下文自適應的變長編碼(CAVLC)和二進制算術編碼(CABAC)。
??? 在熵編碼方面,H.264使用了CABAC和CAVLC兩種不同的編碼方式。CABAC熵編碼是一種基于區間劃分的算術編碼方式。這種編碼方式的效率很高,接近信息熵值,但算法相對復雜,編解碼速度較慢。CAVLC是一種可變長編碼,它根據已編碼語法元素的情況動態調整編碼中使用的碼表,在編碼過程中有些語法元素是組合編碼的,當對這些元素進行查找時就會耗費很長的時間。因此對CAVLC的優化顯得格外重要。

1 原碼表查找算法
??? 原碼表的存儲結構為二維表結構。存儲的內容為碼字,二維坐標分別代表解碼后的兩個語法元素。對于二維表結構。若通過坐標查找內容是很容易的;而通過內容查找坐標,就需要對整個表進行遍歷。JM中的碼表查找算法就是通過遍歷整個碼表實現的,步驟如下:
??? (1)取碼表的中的一個碼字;
??? (2)根據碼字長度從碼流中取出相應長度的bit;
??? (3)比較此碼字和bit串,若相同則查找成功,否則若碼表中還有碼字,回步驟(1),否則查找失敗。

2 算法的優化分析
2.1 基于前綴零分組子表搜索算法
???
基于上下文自適應的變長編碼的解碼算法需要不斷的讀取碼流,判斷,直到在碼表中找到該碼字,如此反復,直至解碼整個塊。由此可見該過程的時間空間復雜度都是相當高的。由于變長碼為霍夫曼前綴碼,所以可以根據碼表的特性,按照碼字長度將原來的一個碼表,按照碼字長度對原碼表進行分割,以Coeff_token碼表為例,原碼表如表1所示,表中NC=-1。

H.264解碼器中CAVLC碼表查找算法的分析與優化

??? 在參考模型中,搜索碼表算法過程如下:
??? (1)從最短碼長開始,讀出該長度二進制數據流對應的碼字;
??? (2)遍歷碼表,如找到該碼字進行步驟(4),否則進入(3);
??? (3)碼字長度加1,重定位指針位置,重復步驟(2);
??? (4)讀取該碼字對應值,更新指針位置。
??? 從上面過程中不難發現,碼字長度的不確定性使得在讀取字節流時只能一次次的試探,導致了效率的下降。如果可以將變長碼的讀取采取固定的策略,一次讀取固定的長度,之后再做判斷,再讀取一定長度,這樣將判斷的次數也固定,從理論上可以降低不斷搜索和重定位指針帶來的時間和空間復雜性。利用可以利用碼表中碼字前綴零數目的不同,將表1拆分為兩個子表,如表2,表3所示NC為-1。

H.264解碼器中CAVLC碼表查找算法的分析與優化

??? 改進后的碼表搜索算法如下:
??? (1)讀取最大碼字長度的二進制流;
??? (2)根據不同的前綴零位數、右移位、判零以確定碼字所在子表;
??? (3)直接根據碼值讀取對應值,更新指針位置。
??? 新的搜索過程不但避免了不確定性,而且無需遍歷碼表,這樣可以在一定程度上提高變長解碼的效率。

H.264解碼器中CAVLC碼表查找算法的分析與優化

??? 按照改進的算法步驟,解碼時,首先從字節流中讀取8位碼字,由于前綴零個數分為大于3和小于3的兩種情形,所以右移5位,若為零,則查找表2,否則查找表 1,根據碼值直接解碼出±1個數,非零系數數目。此外在設計代碼時,還可利用二叉搜索樹的特性,設計搜索過程,提高解碼效率.

2.2 二叉樹一子表混合法
??? 拆分成子表后建立的數組中存在冗余現象。如當0≤N<2且Pre-Zeros<6時,一共有13個碼字。為了保留原先的查表方式以TC和 Tls為矩陣下標的特點,必須要用4×7矩陣,多余位置零。由于實際搜索的對象是矩陣,怎么確定Pre-Zeros值,以保證在分塊數一定的情況下,使用的矩陣較小,成為提高搜索效率的關鍵。從表中可以看到,對不同的N值對應的列,子表之間的Pre-zeros的分界點選取了不同的閾值。按照表2中的分塊方法,矩陣的平均大小為4×6.5。相比JM中使用一個4×17矩陣,搜索效率理論上可以提高(17-6.5)/6.5=1.615倍(假設每張子表的使用概率相同)。以0≤N<2的一張VLC表為例,共分成4張子表。從查找一個碼字的比較次數來看。

H.264解碼器中CAVLC碼表查找算法的分析與優化
??? 可知,子表法查找比較次數的理論最小值為H.264解碼器中CAVLC碼表查找算法的分析與優化此時要求n=s2。如果在第一個步驟(確定子表)中改為采用二分法,則H.264解碼器中CAVLC碼表查找算法的分析與優化這種情況下就可以對以上碼表中前綴連零再細化,將相同連零個數的碼字放在一起,增加子表數而減少子表中的碼字結點數,可以進一步提高查找效率。
??? 從以上分析可見,二叉樹的查找效率是最高的。因此可以將二叉樹應用到子表法中,對每一張子表分別建樹。對于二叉樹來說,查找時間與樹的深度有關。觀察子表中的碼字,發現它們都有不同長度的連零作為前綴,如果直接建樹將導致樹的不平衡并增加了樹的深度。為了解決這個問題,可以考慮在同一張子表中為每個碼字去除相同個數的連零前綴,然后建立二叉樹。在解碼時,先忽略這些連零個數,再進行樹的查找。在最理想情況下,這種查找方法的一次查找的平均比較次數為:

??? H.264解碼器中CAVLC碼表查找算法的分析與優化
??? 對第一張VLC表采用二叉樹一子表法的最大比較次數:

??? H.264解碼器中CAVLC碼表查找算法的分析與優化
??? 幾種算法的對比與復雜度分析如表4所示。

H.264解碼器中CAVLC碼表查找算法的分析與優化

??? 空間復雜度也是需要考慮的問題。JM參考實現中為Tls和TC的聯合碼表建立了2個3×4×17的三維數組共需要408 B的存儲空間。二叉樹法經過統計,一棵樹共有124個結點,其中葉結點62個,其余62個結點為根結點或枝結點。建3棵二叉樹所需要的空間為 (62×4+62×2)×3=1 116 B。子表法將碼表分成12張子表,每張子表用2個二維數組表示,而數組的平均大小為4×6.5,則共要4×6.5×12×2=624 B。

3 結 語
??? H.264是現在視頻編解碼領域研究的熱點也是未來發展的方向,它將代替MPEG2成為主流的信源壓縮標準。H.264應用領域非常廣泛。將H.264的編解碼速度盡可能的提高,可以使其在更多的領域中應用,如數字電視,消費電子類產品,網絡通信,可視電話等現在熱門領域。在此專門對于CAVLC碼表查找給出了改進方案,通過這三種改進方案,避免了對整個碼表的查找,對碼表的查找在效率上有了很大提高。具有明顯的實用意義.

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

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

相關文章

python求加速度_如何利用Python 為自然語言處理加速度

自去年發布 Python 的指代消解包(coreference resolution package)之后&#xff0c;很多用戶開始用它來構建許多應用程序&#xff0c;而這些應用與我們最初的對話應用完全不同。利用 spaCy 和一點點 Cython 給 NLP 加速。自去年發布 Python 的指代消解包(coreference resolutio…

druid.properties文件的配置

# druid.properties文件的配置 driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql://127.0.0.1:3306/plan usernameroot password # 初始化連接數量 initialSize5 # 最大連接數 maxActive10 # 最大超時時間 maxWait3000

jquery+easyui開發、培訓文檔

目 錄 1.... Accordion&#xff08;可折疊標簽&#xff09;....................................................................................... 2 1.1 實例.............................................................................................…

HAProxy用法詳解 全網最詳細中文文檔

一、HAProxy簡介&#xff08;1&#xff09;HAProxy 是一款提供高可用性、負載均衡以及基于TCP&#xff08;第四層&#xff09;和HTTP&#xff08;第七層&#xff09;應用的代理軟件&#xff0c;支持虛擬主機&#xff0c;它是免費、快速并且可靠的一種解決方案。 HAProxy特別適用…

mp4文件格式系列

mp4文件格式系列1 - 綜述Overview and Introduction Core Concepts MP4文件格式中&#xff0c;所有的內容存在一個稱為movie的容器中。一個movie可以由多個tracks組成。每個track就是一個隨時間變化的媒體序列&#xff0c;例如&#xff0c;視頻幀序列。track里的每個時間單…

JDBC筆記-李偉杰版

JDBC 03 2019/8/1 9:51:41 筆記網站 全球加速: http://zaixianke.com 北京節點: http://itdage.cnJDBC 事務 *** 在dos命令行操作oracle時 , 執行DML , 需要結束事務 (commit提交 或 rollback回退) 在JDBC中, 事務是自動提交的, 每執行一條DML語句, 事務就自動提交一次…

局域網網絡風暴檢測工具_【思唯網絡學院】從原理到配置,最全的VLAN說明就在這了!...

有關VLAN的技術標準IEEE 802.1Q早在1999年6月份就由IEEE委員正式頒布實施了&#xff0c;而且最早的VLNA技術早在1996年Cisco(思科)公司就提出了。隨著幾年來的發展&#xff0c;VLAN技術得到廣泛的支持&#xff0c;在大大小小的企業網絡中廣泛應用&#xff0c;成為當前最為熱門的…

SQL server 基本語句

--查詢數據庫是否存在 if exists ( select * from sysdatabases where [name]TestDB) print Yes, the DB exists else print No, need a new one? --新建一個數據庫 create database TestDB on ( name TestData, filename G:\DBS\KeyTest.mdf, size 3, filegrowth 2 ) log…

pythonselenium模擬登陸爬取信息_python3 使用selenium模擬登陸天眼查抓取數據

由于之前用Scrapy 抓了一些公司的名稱&#xff0c;但是沒有準確的聯系方式&#xff0c;所以就自己就學習了一下使用selenium自動化工具&#xff0c;速度比較慢&#xff0c;網上也有很多這方面的代碼&#xff0c;但是大部分的網頁解析部分都出錯了&#xff0c;可能是這種網站定時…

mp4格式

下面的軟件下載地址&#xff1a;http://download.csdn.net/source/2607382 ftyp: 這是一個筐&#xff0c;可以裝mdat等其他Box。 例&#xff1a;00 00 00 14 66 74 79 70 69 73 6F 6D 00 00 02 00 6D 70 34 31 語義為&#xff1a;ftyp: Major brand: isom Minor version: 5…

PyQt5案例匯總(簡潔版)

01菜單欄 import sys from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication from PyQt5.QtGui import QIconclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):exitAct QAction(QIcon(exit.png), &Exit,…

個人關于浮動的理解

浮動帶來的影響&#xff1a; ①. 能夠讓浮動之后的元素布局產生混亂 &#xff08;元素浮動后脫離了標準文檔流&#xff0c;它的布局也就不再遵循標準文檔流的規則&#xff0c;多個浮動元素在一起的時候就會隨著窗口的變化而變化&#xff0c;也就失去了穩定的布局&#xff09; ②…

接口測試 rest-assured 使用指南

轉載&#xff1a;https://testerhome.com/topics/7060 原文&#xff1a;https://github.com/rest-assured/rest-assured/wiki/Usage本文github地址&#xff1a;https://github.com/RookieTester/rest-assured-doc 注意&#xff0c;如果您正在使用1.9.0或者更早的版本請參考舊文…

python中格式化字符串的作用_python中字符串格式化的意義(化妝)

格式 描述%%百分號標記 #就是輸出一個%%c字符及其ASCII碼%s字符串%d有符號整數(十進制)%u無符號整數(十進制)%o無符號整數(八進制)%x無符號整數(十六進制)%X無符號整數(十六進制大寫字符)%e浮點數字(科學計數法)%E浮點數字(科學計數法&#xff0c;用E代替e)%f浮點數字(用小數點…

MongoDB的快速手動安裝

就是關于MongoDB主從庫的安裝配置和啟動。網上關于MongoDB的安裝有大量的文章供大家學習。我這里提供一個Windows環境下MongoDB主從庫的快速手動安裝的方法&#xff0c;只需要三步即可。 先下載的安裝包&#xff0c;解壓縮后找到bin文件夾&#xff0c;將bin文件夾拷貝至你自己的…

MP4音頻解碼信息

文章轉載自&#xff1a;http://blog.csdn.net/flyingqr/archive/2010/02/02/5282600.aspx 版權歸原作者&#xff0c;編輯&#xff1a;小乙哥 MP4文件格式分為頭部和數據兩部分&#xff0c;頭部是由許多被稱作Atom的結構單元嵌套或排列而成&#xff0c;數據部分則完全為實際數據…

時序圖 分支_UML用例圖

UML用例圖用例圖有以下東東:用例參與者關聯系統邊界用例使用橢圓來表示&#xff0c;橢圓里邊寫上用例的名稱:這里的用例可以理解為一個動作或行為,或者一個對象。參與者用一個小人兒,在小人兒下面寫上參與者名稱,例如學生:關聯用一條線表示:把很多個用例放到一個大的矩形框里。…

Python腳本實現漢子轉拼音

起步 中華文化博大精深&#xff0c;是中華民族的財富&#xff0c;吸收和繼承發揚中 華文化&#xff0c;是現代每個炎黃子孫無可推卸的天職。 今天小編就交大家用python寫一個腳本,實現漢子和拼音之間的轉換 pinyin.py 漢字轉拼音,With Python Example: from pinyin impor…

MySQL innodb_table_stats表不存在的解決方法

在做實驗時&#xff0c;使用mysqldump命令報錯[rootlinux-mysql02 3306]# mysqldump -uroot -p123456 -S /u02/data/3306/mysql.sock -A -B --events | gzip > /opt/rep.sql.gzmysqldump: Got error: 1146: Table mysql.innodb_index_stats doesnt exist when using LOCK TA…

自定義封裝 banner 組件

1. 效果圖預覽 2.基本功能 一個簡單方便的輪播圖組件&#xff0c;基于viewpager 基礎上進行的封裝。可設置 項目中圖片&#xff0c;網絡圖片&#xff0c; View&#xff1b;支持循環自動播放&#xff0c;手勢滑動切換&#xff0c;item點擊事件,可設置 點點的樣式寬高、顏色、大小…