H.264的CAVLC(編碼.解碼)過程詳解

看264也看到CAVLC來了,把這方面的資料貼在這里:

編碼過程:
假設有一個4*4數據塊 (變化,量化后就送入熵編碼)
{
?? 0 , 3 , -1 , 0,
?? 0, -1 , ??1, 0,
?? 1 , 0 , 0 , 0,
?? 0 , 0 , 0 , 0
}
數據重排列:0301-1-1010……

1
初始值設定:
非零系數的數目(TotalCoeffs = 5
拖尾系數的數目(TrailingOnes= 3
最后一個非零系數前零的數目(Total_zeros = 3
變量NC=1;
(說明:NC值的確定:色度的直流系數NC=-1;其他系數類型NC值是根據當前塊左邊4*4塊的非零系數數目(NA)當前塊上面4*4塊的非零系數數目(NB)求得的,見畢厚杰書P1206.10
suffixLength = 0

i = TotalCoeffs = 5; (
反序編碼)

2 編碼coeff_token

查標準(BS ISO/IEC 14496-10:2003Table 9-5,可得:
If (TotalCoeffs == 5 && TrailingOnes == 3 && 0 <= NC < 2)
coeff_token = 0000 100;
Code output = 0000 100;

3
編碼所有TrailingOnes的符號:
逆序編碼,三個拖尾系數的符號依次是+(0),-(1),-(1);
:
TrailingOne sign[i--] = 0;
TrailingOne sign[i--] = 1;
TrailingOne sign[i--] = 1;
Code output = 0000 100??? 0 11;
4
編碼除了拖尾系數以外非零系數幅值Levels:( 畢書這個例子說的不是很細,而且有個小錯誤)
過程如下:
1)將有符號的Level[ i ]轉換成無符號的levelCode
如果Level[ i ]是正的,levelCode = (Level[ i ]<<1) – 2;??
如果Level[ i ]是負的,levelCode = - (Level[ i ]<<1) – 1;
2)計算level_prefixlevel_prefix = levelCode / (1<<suffixLength)
查表9-6可得所對應的bit string
3)計算level_suffixlevel_suffix = levelCode % (1<<suffixLength)
4)根據suffixLength的值來確定后綴的長度;
5suffixLength ??updata
If ( suffixLength == 0 )
????? suffixLength++

else if ( levelCode > (3<<suffixLength-1) && suffixLength <6)

注:大于預置值就suffixLength++;
???? suffixLength++;

回到例子中,依然按照逆序,Level[i--] = 1;(此時i = 1)
levelCode = 0;level_prefix = 0;
查表9-6,可得level_prefix = 0時對應的bit string = 1;
因為suffixLength初始化為0,故該Level沒有后綴;
因為suffixLength = 0,故suffixLength++;
Code output = 0000 100 011 1;
編碼下一個Level:Level[0] = 3;
levelCode = 4;level_prefix = 2;查表得bit string = 001;
level_suffix = 0;suffixLength = 1;故碼流為0010;
Code output = 0000 100 011 1 0010 ;
i = 0,編碼Level結束。

5)編碼最后一個非零系數前零的數目(TotalZeros):
查表9-7,當TotalCoeffs = 5,total_zero = 3時,bit string = 111;
Code output = 0000 100 011 1 0010 111;

6) 對每個非零系數前零的個數(RunBefore)進行編碼:
i = TotalCoeffs = 5;ZerosLeft = Total_zeros = 3;查表9-10:
依然按照逆序編碼
ZerosLeft =3, run_before = 1, run_before[4]=10;
ZerosLeft =2, run_before = 0 ,run_before[3]=1;
ZerosLeft =2, run_before = 0, run_before[2]=1;
ZerosLeft =2, run_before = 1, run_before[1]=01;
ZerosLeft =1, run_before = 1, run_before[0] 最后一個非零系數不需要碼流來表示
Code output = 0000 100 011 1 0010 111 10 1 1 01 ;
編碼完畢。(CAVLC主要是查表,標準中的表是通過大量實驗的出來的!)

?

?

解碼過程:


接收碼流為:0000 1000 1110 0101 1110 1101

計算NC = 1
解碼詳細過程如下:
1.?????? 根據Coeff_token和NC查表(見標準表9-5),得到非零系數數目TotalCoeffs和拖尾系數數目TrailingOnes
NC = 1選擇對應的表,Coeff_token為0000100,查表得到TotalCoeffs=5 TrailingOnes=3
輸出序列:無
2. 解析拖尾系數
由第一步得到拖尾系數有3個,輸入拖尾系數符號編碼碼流011,得到兩個拖尾系數由先到后是 -1,-1,1
output :-1,-1,1(反序輸出)
3.?????? 解析除拖尾系數外的非零系數的幅值(level)
(1)?????? 確定后綴長度SuffixLength
(2)?????? 根據碼流查表9-6得到前綴LevelPrefix
(3)?????? 根據前綴和后綴,得到

????????????? LevelCode=(levelprefix<<suffixlength)+levelsuffix
(4)?????? Levelcode為偶數 level=(level+2)/2
??????????????? Levelcode為奇數 level=(-level-1)/2
(5)?????? 根據設定的閾值確定是否update Suffixlegth
回到例子中,按照逆序
i=0, Sufixlegth=0,查表9-6,1對應的前綴levelprefix=0,levelcode=0,

???? 計算得到level=1 , i++ , sufixlegth++(第一次都要加)
i=1,sufixlegth=1,查表0010(3為前綴,1位后綴)對應的前綴????? levelprefix=2,計算levelcode=4,level=3,i++
i=2 >= TotalCoeffs-TrailingOnes,除拖尾系數外的非零系數解析完畢
output:3,1,-1,-1,1
4.?????? 解析每個非零系數前零的個數
根據TotalCoeffs=5和輸入碼流111查表9-7得到TotalZeros=3
初始i=TotalCoeffs-1=4 ,zeroleft=TotalZeros=3 , 5個非零系數前零的數目解析如下:
i=4,zeroleft=3,根據碼流10,查表9-10,runbefor=1,

?? 輸出序列:3,1,-1,-1,0,1
i=3,zeroleft=3-1=2,根據碼流1,查表runbefore=0,

輸出序列:3,1,-1,-1,0,1
i=2,zeroleft=2-0=2,根據碼流1,查表runbefore=0,

輸出序列:3,1,-1,-1,0,1
i=1,zeroleft=2-0=2,根據碼流01,查表runbefore=1,

輸出序列:3,0,1,-1,-1,0,1
i=0,zeroleft=2-1=1,輸出序列:0,3,0,1,-1,-1,0,1
5. 解碼完畢,將剩下的元素用0補齊,反序排列就可以得到4*4矩陣。
6. 最后還原為一個4*4數據塊
{
?? 0 , 3 , -1 , 0,
?? 0,?? -1 , 1,?? 0,
?? 1 ,?? 0 , 0 , 0,
?? 0 ,?? 0 , 0 , 0
}

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

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

相關文章

python進程通信方式有幾種_python全棧開發基礎【第二十一篇】互斥鎖以及進程之間的三種通信方式(IPC)以及生產者個消費者模型...

一、互斥鎖進程之間數據隔離&#xff0c;但是共享一套文件系統&#xff0c;因而可以通過文件來實現進程直接的通信&#xff0c;但問題是必須自己加鎖處理。注意&#xff1a;加鎖的目的是為了保證多個進程修改同一塊數據時&#xff0c;同一時間只能有一個修改&#xff0c;即串行…

Python實現修改圖片尺寸

起步 很多小伙伴從網上找的圖片可能圖片尺寸與自己的需求不符合 今天小編就教大家使用python寫一個簡單腳本程序實現修改圖片的尺寸 環境準備 首先我們需要python環境,它的安裝可以參考:python安裝以及版本檢測 其次我們還需要安裝一個python圖形化的庫PIL PIL的安裝,這里…

數據集

https://zhuanlan.zhihu.com/p/25138563轉載于:https://www.cnblogs.com/zhangbojiangfeng/p/7039725.html

常見的攻擊手段及其防御方式

本文簡單介紹幾種常見的攻擊手段及其防御方式 XSS(跨站腳本攻擊)CSRF&#xff08;跨站請求偽造&#xff09;SQL注入DDOSXSS 概念 全稱是跨站腳本攻擊&#xff08;Cross Site Scripting&#xff09;&#xff0c;指攻擊者在網頁中嵌入惡意腳本程序。案列 比如說我寫了一個博客網站…

使用ffmpeg進行h.264編碼

m_fmt->video_codec CODEC_ID_H264; /* 添加視頻流 */ m_video_st av_new_stream(m_oc, 0); if (!m_video_st) { return 0; } m_videocavcodec_alloc_context(); m_videoc m_video_st->codec; /* 視頻相關參數 */ m_videoc->codec_id m_fmt->video_codec; m_…

關于java的關鍵字 transient

我們都知道一個對象只要實現了Serilizable接口&#xff0c;這個對象就可以被序列化&#xff0c;Java的這種序列化模式為開發者提供了很多便利&#xff0c;我們可以不必關系具體序列化的過程&#xff0c;只要這個類實現了Serilizable接口&#xff0c;這個的所有屬性和方法都會自…

python中文件變化監控-watchdog

起步 在python中文件監控主要有兩個庫&#xff0c;一個是pyinotify&#xff0c;一個是watchdog。pyinotify依賴于Linux平臺的inotify&#xff0c;后者則對不同平臺的的事件都進行了封裝。因為我主要用于Windows平臺&#xff0c;所以下面著重介紹watchdog&#xff08;推薦大家閱…

python決策樹分類鳶尾花_基于決策樹—鳶尾花分類

決策樹算法廣泛應用于&#xff1a;語音識別、醫療診斷、客戶關系管理、模式識別、專家系統等&#xff0c;在實際工作中&#xff0c;必須根據數據類型的特點及數據集的大小&#xff0c;選擇合適的算法。本文選擇經典案例——《鳶尾花分類》一、決策樹定義決策樹算法是一種基于實…

希捷宣布出貨雙碟裝1TB硬盤 單碟500GB上市

希捷今天宣布&#xff0c;單碟容量高達500GB的Barracuda 7200.12 1TB硬盤已經出貨。 現有的1TB硬盤產品一般都是三碟裝(此前也有四碟裝)&#xff0c;包括希捷自家的ST31000340AS&#xff0c;但希捷一進率先將其升級為雙碟裝&#xff0c;存儲密度也達到了329Gb每平方英寸。這樣一…

P1334 瑞瑞的木板

題目描述 瑞瑞想要親自修復在他的一個小牧場周圍的圍欄。他測量柵欄并發現他需要N&#xff08;1≤N≤20,000&#xff09;根木板&#xff0c;每根的長度為整數Li&#xff08;1≤Li≤50,000&#xff09;。于是&#xff0c;他神奇地買了一根足夠長的木板&#xff0c;長度為所需的N…

FFMpeg的output_example.c例子分析

該例子講了如何輸出一個libavformat庫所支持格式的媒體文件。 &#xff08;1&#xff09;av_register_all()&#xff0c;初始化libavcodec庫&#xff0c;并注冊所有的編解碼器和格式。 &#xff08;2&#xff09;guess_format()&#xff0c;根據文件名來獲取輸出文件格式&#…

大量數據+同步+多線程_Vulkan 多線程渲染

1. Overview of Vulkan1.1 計算機圖形軟件圖形軟件有兩個大類&#xff1a;專用軟件包&#xff08;special-purpose packages&#xff09;和通用編程軟件包&#xff08;general programming packages&#xff09;。專用軟件包通常提供一種UI設計語言&#xff0c;讓用戶直接生成想…

飛康任命Gartner前分析師擔任亞洲區市場總監

在虛擬化、數據保護和數據遷移領域具備15年創新經驗的美國飛康軟件公司&#xff08;FalconStor Software, Inc.&#xff0c;NASDAQ&#xff1a;FALC&#xff09;近日宣布任命張瑾&#xff08;Jimmie Chang&#xff09;先生擔任該公司亞洲區市場部門負責人。 飛康公司近日面向全…

12_登陸案例

13131轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/7044846.html

如何基于FFMPEG和SDL寫一個少于1000行代碼的視頻播放器

http://blog.csdn.net/eplaylity/archive/2008/12/05/3454431.aspx http://www.cnblogs.com/konyel/tag/SDLGuide%E4%B8%AD%E6%96%87%E8%AF%91%E7%89%88/ ffmpeg文檔http://blog.sina.com.cn/s/blog_46dc65a90100a91b.html http://dranger.com/ffmpeg/ffmpeg.html VLC核心功能部…

Flask 概述

什么是Web Framework&#xff1f; Web Application Framework&#xff08;Web應用程序框架&#xff09;或簡單的Web Framework&#xff08;Web框架&#xff09;表示一個庫和模塊的集合&#xff0c;使Web應用程序開發人員能夠編寫應用程序&#xff0c;而不必擔心協議&#xff0…

(五)Maven中的聚合和繼承

一、為什么要聚合&#xff1f; 定義&#xff1a;我們在開發過程中&#xff0c;創建了2個以上的模塊&#xff0c;每個模塊都是一個獨立的maven project&#xff0c;在開始的時候我們可以獨立的編譯和測試運行每個模塊&#xff0c;但是隨著項目的不斷變大和復雜化&#xff0c;我們…

python堆棧反向輸出列表_python - IPython:將Python腳本的輸出重定向到文件(如bash) - 堆棧內存溢出...

IPython有自己的上下文管理器來捕獲stdout / err &#xff0c;但它沒有重定向到文件&#xff0c;它重定向到一個對象&#xff1a;from IPython.utils import iowith io.capture_output() as captured:%run my_script.pyprint captured.stdout # prints stdout from your script…

關于datagrid

基本在公司使用的datagrid不需要自己寫前臺代碼&#xff0c;只需要自己給grid明確id&#xff0c;url以及列屬性即可。 后臺需要返回一個數據類型&#xff1a;{recordsFiltered2, data[], drawnull, recordsTotal2}&#xff0c;通常返回這個數據類型的話&#xff0c;只需要調用d…

M-JPEG、MPEG4、H.264都有何區別 依維安防論壇

壓縮方式是網絡視頻服務器和網絡攝像機的核心技術&#xff0c;壓縮方式很大程度上決定著圖像的質量、壓縮比、傳輸效率、傳輸速度等性能&#xff0c;它是評價網絡視頻服務器和網絡攝像機性能優劣的重要一環。 隨著多媒體技術的發展&#xff0c;相繼推出了許多壓縮編碼標準&…