如何讀H.264的標準和代碼

首先,還是要弄清楚編解碼的流程和 H.264 的關鍵技術,看白皮書就知道了,另外 H.264 綜述類的文章和別人的學位論文一般也會講到; 其次,弄清楚代碼的各個函數實現的功能,這個可以看看 JM 代碼里各個函數前面的函數說明; 最后,弄清楚標準各個章節講的什么內容:這

首先,還是要弄清楚編解碼的流程和 H.264 的關鍵技術,看白皮書就知道了,另外 H.264 綜述類的文章和別人的學位論文一般也會講到;

其次,弄清楚代碼的各個函數實現的功能,這個可以看看 JM 代碼里各個函數前面的函數說明;

最后,弄清楚標準各個章節講的什么內容:這里只說重要的。第三章是名詞解釋,第四章是縮略語,第五章是一些計算方式和運算符號的說明,第六章是與 H.264 相關的一些視頻基礎知識和 H.264 中用到的一些過程推導,第七章是 NALU 及其以下語法結構的語法和語義(如果要知道碼流結構就要看這一章了),第八章是詳細說明解碼過程中某一個模塊的功能怎么完成,第九章是熵編碼,附錄 A 是關于 profile 和 level 的具體規定,附錄 B 是關于如何從字節流中解析 NALU(標準沒有說明如何在 RTP 流中解析 NALU)。

有了上面的基本知識,下面我們結合對碼流的解析過程來講講怎么讀標準:
1、如果是字節流的碼流當然就首先要對字節流進行解析,這就要看附錄 B 了;如果是 RTP 格式的碼流,那首先就要按 RFC3984 來解析了(標準沒有規定 RTP 格式碼流的解析過程);

2、字節流解析完后提取出來的就是 NALU 了,對 NALU 的解析就要看 7.3.1 小節了。第七章中黑色的粗體字都是在碼流中可能出現的語法元素,解碼器的首要任務就是要對這些語法元素進行解析。對于這些碼流中的語法元素我們要進行解析必須知道三個問題:
(1)、什么時候存在于碼流中?這樣我們才能知道當前解析的是哪個語法元素;
(2)、采用什么樣的熵編碼方式?這樣我們才能知道如何解析;
(3)、含義是什么?這樣我們才知道解析出來之后用來干什么。
三個問題的答案分別是:
(1)、有 if 條件關聯的就是可能出現的,沒有 if 條件關聯的就是必然出現的。例如,7.3.1 小節表中的 forbidden_zero_bit 就沒有 if 條件關聯,所以它必然出現在碼流中;
(2)、每個語法表最后一列都對所在行語法元素的熵編碼方式做了規定,而最后一列各個符號具體是代表什么編碼方式那就去看 7.2 小節最后的部分;
(3)、看 7.4 小節與語法表對應的語義部分,例如你查的語法表是 7.3.1,那么該語法表里出現的語法元素的解釋就在 7.4.1 小節中。

3、NALU 的前面三個語法元素所組成的一個字節我們稱為 NALU 頭,其余部分(也就是語法表 7.3.1 中的其余部分)我們稱為 NALU 體。對 NALU 體的解析要看 7.3.2 小節。因為 NALU 有很多種類型,所以要針對 NALU 的不同類型去解析 NALU 體(表 7-1 說明了不同 NALU 對應的語法表)。例如,如果當前的 NALU 是 SPS,那么當然就要看 7.3.1 小節;如果當前的 NALU 是 DPA,那么當然就要看 7.3.2.9.1 小節了;

4、對于屬于 VCL 的 NALU(哪些 NALU 是 VCL NALU 呢?如果你看了 nal_unit_type 的語義,你就應該知道),例如表 7-1 中類型為 5 的 NALU,根據表 7-1 我們知道 NALU 體的語法表是 7.3.2.8。而從 7.3.2.8 我們可以看到,對這種 NALU 的 NALU 體解析實際就是對片級語法進行解析。語法表 7.3.2.8 顯示片級語法解析首先要解析 slice_header()(這種帶括號的表示是另一個語法結構),那么 slice_header() 怎么解析呢?往下看,7.3.3 的所有內容都被第一行的 slice_header() 包括在內,所以 7.3.3 就是對 slice_header() 這個語法層的碼流規定;

5、按照語法表 7.3.2.8 解析完了 slice_header() 就該解析 slice_data() 了。下面以最常見的 I 幀(CAVLC 熵編碼、非 MBAFF)的解析過程為例簡單描述怎么繼續讀標準。這時在碼流中出現的第一個 slice_data() 層的語法元素是語法表 7.3.4 中的 macroblock_layer(),也就是說直接到了宏塊層的語法解析,那就要又要看 7.3.5 小節了;

6、基于我們對編解碼流程的了解,我們知道解碼是一個預測值加殘差得到重建圖像的過程,那么我們下面的解碼過程就要分成兩步走了:首先,得到預測值;其次,得到殘差。基于我們對 H.264 關鍵技術的了解,我們知道 intra 宏塊(提醒:我們舉的例子是 I 幀,因此解析的是 intra 宏塊)的預測值是需要使用到預測模式的,所以我們需要解析語法表 7.3.5 中的 mb_pred(mb_type) 語法層,那么又去看 7.3.5.1 小節。按照 7.3.5.1 小節解析出宏塊或塊的預測方式后我們怎么計算預測值呢?去看標準 8.3 小節;得到預測值后我們繼續按照語法表 7.3.5 解析語法元素直到 residual() 語法層,這就又要去看 7.3.5.3 小節;按照 7.3.5.3 小節解析出殘差系數后我們如何把它還原成真實的殘差呢?去看標準 8.5 小節;

7、預測值和殘差都有了,加起來就是解碼圖像了。解碼的主要工作到此也算基本完成了。當然,上面的過程中還會用到標準其他章節的相關內容(例如,8.5 小節會用到 5.7 小節中定義的 InverseRasterScan),這就留給大家自己去學習了。


上面講了如何讀標準,那么如何讀代碼呢?非常簡單,因為你現在已經知道了代碼中各個函數所實現的功能以及標準各個章節所涉及的內容,那么你就該知道標準某個部分的內容與代碼中的哪個函數對應,因此對于你想詳細了解實現過程的模塊,對照標準去仔細啃那個函數吧。對于代碼中不明白的變量或者參數,把程序跑起來,看第 1 個 MB 解碼時候該變量的值是多少,第 23 個 MB 解碼時候該變量的值是多少……多做幾個觀察值,注意不要選擇特殊位置,然后總結一下規律,這樣你就自然能分析出該變量的作用和含義了。

以上講的是解碼過程,編碼過程就是解碼的反過程,因此同理。

——天之驕子(firstime)——
2008年8月5日

原文:bbs.chinavideo.org/viewthread.php?tid=4164

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

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

相關文章

Kafka官方文檔翻譯——實現

IMPLEMENTATION 1. API Design Producer APIs Producer API封裝了底層兩個Producer: kafka.producer.SyncProducerkafka.producer.async.AsyncProducerclass Producer {/* Sends the data, partitioned by key to the topic using either the *//* synchronous or t…

【機器學習】熵、決策樹、隨機森林 總結

一、熵 公式: ?∑i1np(xi)?log2p(xi)-\sum_{i 1}^{n}{p(xi)*log_2p(xi)}?i1∑n?p(xi)?log2?p(xi) ∑i1np(xi)?log21p(xi)\sum_{i1}^{n}p(xi)*log_2\frac{1}{p(xi)}i1∑n?p(xi)?log2?p(xi)1? import numpy as np# 賬號是否真實:3no&#xff…

HDU 4857 逃生(拓撲排序)

拓撲排序 一.定義 對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序&#xff0c;是將G中所有頂點排成一個線性序列&#xff0c;使得圖中任意一對頂點u和v&#xff0c;若<u&#xff0c;v> ∈E(G)&#xff0c;則u在線性序列中出現在v之前。 通常&#xff0c;…

關于deepin系統安裝design compiler的問題解答

關于deepin系統安裝design compiler的問題解答 Design?Compiler是Synopsys綜合軟件的核心產品。它提供約束驅動時序最優化&#xff0c;并支持眾多的設計類型&#xff0c;把設計者的HDL描述綜合成與工藝相關的門級設計&#xff1b;它能夠從速度、面積和功耗等方面來優化組合電…

iOS 數據持久化-- FMDB

一、簡介 1.什么是FMDB FMDB是iOS平臺的SQLite數據庫框架 FMDB以OC的方式封裝了SQLite的C語言API 2.FMDB的優點 使用起來更加面向對象&#xff0c;省去了很多麻煩、冗余的C語言代碼 對比蘋果自帶的Core Data框架&#xff0c;更加輕量級和靈活 提供了多線程安全的數據庫操作方法…

【機器學習】交叉驗證篩選參數K值和weight

交叉驗證 導包 import numpy as npfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn import datasets#model_selection &#xff1a;模型選擇 # cross_val_score: 交叉 &#xff0c;validation&#xff1a;驗證&#xff08;測試&#xff09; #交叉驗證 from s…

jqGrid列的統計

$("#List").jqGrid({ url: "${pageContext.request.contextPath}/cbfx/getCbhzList.do", datatype: "json", mtype: GET, colNames:["成本類別","費用","去年同期費用","備注"], colMod…

手機只能簽榮耀!最忠誠代言人胡歌喊你去天貓超品日

在你心中&#xff0c;男神胡歌是什么樣子&#xff1f;“御劍乘風來&#xff0c;除魔天地間。”也許是《仙劍奇俠傳》里飛揚跋扈、青春不羈的俠客李逍遙。“遍識天下英雄路&#xff0c;俯首江左有梅郎。”也許是《瑯铘榜》中才智冠天下&#xff0c;遠在江湖卻名動帝輦的麒麟才子…

歐式距離與曼哈頓距離

歐式距離&#xff0c;其實就是應用勾股定理計算兩個點的直線距離 二維空間的公式 其中&#xff0c; 為點與點之間的歐氏距離&#xff1b;為點到原點的歐氏距離。 三維空間的公式 n維空間的公式 曼哈頓距離&#xff0c;就是表示兩個點在標準坐標系上的絕對軸距之和&#xff1a…

在maven pom.xml中加載不同的properties ,如localhost 和 dev master等jdbc.properties 中的鏈接不一樣...

【參考】&#xff1a;maven pom.xml加載不同properties配置[轉] 首先 看看效果&#xff1a; 點開我們項目中的Maven projects 后&#xff0c;會發現右側 我們profile有個可勾選選項。默認勾選localhost。localhost對應項目啟動后&#xff0c;會加載配置左側localhost文件夾下面…

4.8-全棧Java筆記:包機制

包機制是java中管理類的重要手段。 開發中&#xff0c;我們會遇到大量同名的類&#xff0c;通過包我們很容易對解決類重名的問題&#xff0c;也可以實現對類的有效管理。 包對于類&#xff0c;相當于&#xff0c;文件夾對于文件的作用。package我們通過package實現對類的管理&a…

python安裝以及版本檢測

Windows 安裝 Python 3 目前Python有兩個大版本&#xff0c;分別是 2.X 和 3.X &#xff0c;我們的教程基于最新版本 3.6.1 首先我們需要獲取Python的安裝包&#xff0c;可以從官網獲取&#xff0c;如果你因為沒有VPN工具而無法訪問官網的話&#xff0c;我已經將它放在網盤了&…

【機器學習】梯度下降原理

import numpy as np import matplotlib.pyplot as plt %matplotlib inlinef lambda x :(x-3)**22.5*x-7.5 f2 lambda x :-(x-3)**22.5*x-7.5求解導數 導數為0 取最小值 x np.linspace(-2,5,100) y f(x) plt.plot(x,y)梯度下降求最小值 #導數函數 d lambda x:2*(x-3)*12.…

C語言的面向對象設計-對X264/FFMPEG架構探討

本文貢獻給ZSVC開源社區&#xff08;https://sourceforge.net/projects/zsvc/&#xff09;&#xff0c;他們是來自于中國各高校的年輕學子&#xff0c;是滿懷激情與夢想的人&#xff0c;他們將用自己的勤勞與智慧在世界開源軟件領域為中國留下腳步&#xff0c;該社區提供大量視…

linux gtest安裝

1. 安裝cmake, 具體步驟這里不詳說。 2. 下載源碼&#xff1a;https://codeload.github.com/google/googletest/zip/release-1.8.0 3. 解壓源碼&#xff1a;unzip googletest-release-1.8.0.zip 4. 進入源碼目錄&#xff1a;cd googletest-release-1.8.0 5. 創建并進入目錄buil…

基于物聯網的智能垃圾桶設計

前言 目前我國各城市包括首都正在深入開展爭創國家衛生城市活動&#xff0c;這是全國愛國衛生運動委員會辦公室評選命名的國家級衛生優秀城市的最高榮譽&#xff0c;是一個城市綜合素質的重要標志。沈陽市正在深入開展創建國家衛生城市和建設國家健康城市(以下簡稱“雙城雙創”…

學習實踐 - 收藏集 - 掘金

2道面試題&#xff1a;輸入URL按回車&HTTP2 - 掘金通過幾輪面試&#xff0c;我發現真正那種問答的技術面&#xff0c;寫一堆項目真不如去刷技術文章作用大&#xff0c;因此刷了一段時間的博客和掘金&#xff0c;整理下曾經被問到的2道面試題 從瀏覽器輸入URL按回車到頁面顯…

【機器學習】自己手寫實現線性回歸,梯度下降 原理

導包 import numpy as npimport matplotlib.pyplot as plt %matplotlib inlinefrom sklearn.linear_model import LinearRegression創建數據 X np.linspace(2,10,20).reshape(-1,1)# f(x) wx b y np.random.randint(1,6,size 1)*X np.random.randint(-5,5,size 1)# 噪…

跨站的藝術-XSS Fuzzing 的技巧

作者 | 張祖優(Fooying) 騰訊云 云鼎實驗室 對于XSS的漏洞挖掘過程&#xff0c;其實就是一個使用Payload不斷測試和調整再測試的過程&#xff0c;這個過程我們把它叫做Fuzzing&#xff1b;同樣是Fuzzing&#xff0c;有些人挖洞比較高效&#xff0c;有些人卻不那么容易挖出漏洞…

H.264/AVC視頻壓縮編碼標準的新進展

H .264/AVC是由ISO/IEC與ITU-T組成的聯合視頻組(JVT)制定的新一代視頻壓縮編碼標準&#xff0c;于2003年5月完成制訂。相對于先前的標準&#xff0c;H.264/AVC無論在壓縮效率、還是在網絡適應性方面都有明顯的提高&#xff0c;因此&#xff0c;業界普遍預測其將在未來的視頻應用…