vlc-h265插件集成 項(xiàng)目學(xué)習(xí)筆記

昨天剛剛梳理了Hacker Guide/Decoder:如何做一個(gè)解碼器(VLC)浪秘,今天結(jié)合一個(gè)實(shí)際點(diǎn)的 vlc-h265 集成插件的項(xiàng)目看看猪落,試試能不能順利解讀一下新編解碼器集成的思路。

參考項(xiàng)目GitHub地址:strukturag / vlc-libde265靴患。

1 整體感知

先來(lái)看一下項(xiàng)目整體的文件結(jié)構(gòu),大致了解下項(xiàng)目里有哪些模塊:


項(xiàng)目文件結(jié)構(gòu)(git及copyright略)

首先是右側(cè)一堆文件夾(加星號(hào)的是 VLC 沒(méi)有的):

  • *debian:Debian 系統(tǒng)配置文件
  • include:頭文件的存放位置
  • m4:宏處理器存放位置(開(kāi)始是空的涉瘾,編譯完就有了)
  • *patches:補(bǔ)丁存放位置(這里是用于記錄修改的diff信息)
  • src:一大堆的源文件(主要的地方)

然后是左側(cè)一堆文件(加星號(hào)的是 VLC 沒(méi)有的):

  • *.travis.yml:travis的配置文件,用于持續(xù)集成
  • Makefile.am:automake編譯用捷兰,類似Makefile
  • *autogen.sh:auto編譯時(shí)使用的編譯腳本
  • configure.ac:autoconf編譯用立叛,類似configure
  • *prepare-package.sh:依賴和環(huán)境的準(zhǔn)備腳本

注:這里autogen的編譯流程我不太熟,但順序還是 ./configure => make => make install 贡茅,但感覺(jué)這樣在準(zhǔn)備編譯時(shí)文件更加簡(jiǎn)潔秘蛇,在編譯過(guò)程中生成Makefile等等,有更好的理解歡迎指教

2 慢慢開(kāi)始讀代碼

include 是頭文件存放的地方顶考,頭文件在邏輯方面有像目錄一樣的感覺(jué)赁还,所以頭文件或許是個(gè)不錯(cuò)的開(kāi)始。
include 中有兩個(gè)頭文件:

  • libde265_plugin_common.h:聲明了應(yīng)當(dāng)包含的文件和一些宏定義驹沿。嗯...好像并沒(méi)有得到太多的信息艘策,主要是解釋了 VLC_CODEC_HEVC 、 VLC_CODEC_HEV1 和 VLC_CODEC_SCTE_27 三個(gè)宏定義被聲明時(shí) VLC_FOURCC 傳入的參數(shù)區(qū)別渊季。

  • vlc_codecs.h:這是 vlc 自己的頭文件朋蔫,記錄著解復(fù)用和解碼器需要的一些數(shù)據(jù)結(jié)構(gòu)等信息。

頭文件并沒(méi)有給什么指引...所以還是回頭看看 Makefile.am 里有沒(méi)有什么好點(diǎn)的指示却汉。
Makefile.am 的書(shū)寫(xiě)有一個(gè)很好的規(guī)律驯妄,具體對(duì)文件的分析有點(diǎn)長(zhǎng),所以整理成了一個(gè)單獨(dú)的介紹:vlc-libde265 Makefile.am 試讀病涨。
從上面這篇試讀的過(guò)程中我們找到了 h265 插件各個(gè)功能實(shí)現(xiàn)過(guò)程中使用的具體文件富玷,那么下面就是對(duì)這些文件的解讀了。

3 仔仔細(xì)細(xì)讀代碼

3.1 解碼器——libde265_plugin

解碼器除了引用了必須要的 265 頭文件外既穆,核心代碼全部在 src/codec/libde265dec.c 中赎懦,所以想要了解自然要瞅瞅這個(gè)文件里有些啥。文件還是比較正常的幻工,加注釋才900行励两,但為了盡快理解還是先暫時(shí)忽略實(shí)現(xiàn),直接從結(jié)構(gòu)層面去感知一下:

  • struct decoder_sys_t:h265 解碼模塊的各個(gè)描述符
  • function vlc_module_begin:初始化模塊的各個(gè)描述符
  • struct picture_ref_t:vlc 以265格式存儲(chǔ)圖片時(shí)的參考(結(jié)合下面兩個(gè)函數(shù))
  • function ImageFormatToChroma:圖片格式轉(zhuǎn)換(mono/420/422/444)
  • function GetVlcCodec:獲取 vlc 編解碼器(根據(jù)不同格式和參數(shù)返回)
  • function SetDecodeRatio:設(shè)置解碼幀率
  • function Decode:核心的解碼算法部分
  • function ReleasePictureRef:釋放圖像的引用
  • function GetPicture:創(chuàng)建一個(gè)可以直接用于渲染的vlc圖片
  • function GetBuffer:libde265 創(chuàng)建圖像后的回調(diào)
  • function ReleaseBuffer:釋放圖像后的回調(diào)
  • function Open:解碼器探尋
  • function Close:解碼器銷毀

3.2 解復(fù)用——libde265demux_plugin

  • struct struct demux_sys_t:h265 插件使用的數(shù)據(jù)信息定義
  • char[] extensions:支持的擴(kuò)展名
  • function Demux:解復(fù)用的核心邏輯代碼
  • function Control:控制
  • function Close:釋放未被使用的數(shù)據(jù)
  • function Peek:按照增量的大小提前查看數(shù)據(jù)
  • function SearchStartcode:尋找下一個(gè) NAL 的起始位置

3.3 針對(duì)格式插件

h265 插件還專門提供了 mkv囊颅、mp4当悔、TS 格式的專門的解復(fù)用的邏輯,至于為什么...我想大概是 h265 編碼可能主要針對(duì)在這幾個(gè)封裝下的優(yōu)化與壓縮踢代,或者說(shuō)只有在 vlc 解讀這幾個(gè)格式的時(shí)候才會(huì)選擇 h265 編碼去進(jìn)行解碼盲憎,這樣的話其他格式使用其他編碼(h264之類的)的情況下制作 h265 插件就可以只關(guān)心這幾個(gè)封裝了。

4 與上一篇 Wiki 做個(gè)對(duì)比

上一篇文章 Hacker Guide/Decoder:如何做一個(gè)解碼器(VLC)主要是一邊翻譯一邊想入門一下編解碼器的書(shū)寫(xiě)思路胳挎,在這篇文章里提出的編碼器書(shū)寫(xiě)必須要實(shí)現(xiàn)的有以下幾個(gè)方面:

  • 解碼器核心
  • 對(duì)輸入流的獲取
  • 數(shù)據(jù)包的定義及讀取
  • 數(shù)據(jù)包的更改與對(duì)齊
  • 運(yùn)動(dòng)補(bǔ)償?shù)暮瘮?shù)定義
  • IDCT的函數(shù)定義
  • 對(duì)稱多處理的選擇(可選)

總的來(lái)看這個(gè) h265 的項(xiàng)目基目前看到的實(shí)現(xiàn):解碼器的核心實(shí)現(xiàn)饼疙,數(shù)據(jù)包的定義及讀取。輸入流的校驗(yàn)及讀取在每個(gè)具體的封裝格式中實(shí)現(xiàn)慕爬。數(shù)據(jù)包的更改與對(duì)齊窑眯、運(yùn)動(dòng)補(bǔ)償?shù)暮瘮?shù)定義屏积、 IDCT的函數(shù)定義等實(shí)現(xiàn)可以仔細(xì)找找剩下那一堆格式的文件,然后選擇必要的去實(shí)現(xiàn)磅甩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炊林,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子卷要,更是在濱河造成了極大的恐慌渣聚,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僧叉,死亡現(xiàn)場(chǎng)離奇詭異饵逐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)彪标,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門倍权,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人捞烟,你說(shuō)我怎么就攤上這事薄声。” “怎么了题画?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵默辨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我苍息,道長(zhǎng)缩幸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任竞思,我火速辦了婚禮表谊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盖喷。我一直安慰自己爆办,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布课梳。 她就那樣靜靜地躺著距辆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暮刃。 梳的紋絲不亂的頭發(fā)上跨算,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音椭懊,去河邊找鬼诸蚕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挫望。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼狂窑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼媳板!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起泉哈,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛉幸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后丛晦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奕纫,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年烫沙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匹层。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锌蓄,死狀恐怖升筏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘸爽,我是刑警寧澤您访,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站剪决,受9級(jí)特大地震影響灵汪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柑潦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一享言、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渗鬼,春花似錦担锤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至银择,卻和暖如春多糠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浩考。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工夹孔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓搭伤,卻偏偏與公主長(zhǎng)得像只怎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怜俐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355