vlc - avs2 Linux 開發記錄

前面大致的了解了 vlc 解碼器開發的過程以及 vlc-h265 插件開發的實例,于是開始嘗試開發一個支持 avs2 標準的 vlc 播放器



1 內部模塊注冊

1.1 注冊聲明

vlc 的模塊注冊是一套標準的流程,我們的類型應當選擇解碼器 “Decoder”,在我們的核心 .c 文件中添加:

    vlc_module_begin ()  
        set_category( CAT_VIDEO )  
        set_description(  N_("avs2 Decoder library")  )  
        set_capability(  "decoder", 100 )  
        set_callbacks( Open, Close )  
    vlc_module_end ()  

ps :這里的 N_() 是用于創建一個可以被 gettext 輕松轉換的字符串(語種之類的)的形式

  • set_category::標明這個模塊起作用的地方(video)
  • set_description:模塊的描述,添加成功后可以在 ./vlc --list 中顯示
  • set_capability:功能與評分,這里下面會細講
  • set_callbacks:調用模塊時的入口與出口(開關函數)

1.2 功能與評分

set_capability 函數是一開始困惑了我挺久的一個函數,因為我一直不知道后面這個 score 到底要怎么算...

第一個參數很好理解,我們作為一個解碼器功能自然是 "decoder" ,而第二個參數需要的是一個 score,不同的模塊可以選擇不同的 socre(對沒錯,是自己選的),主要功能就是當 vlc 需要一個功能的時候(比如解碼),他會大喊一聲:“解碼器!”,然后所有解碼器們就開始排隊,排隊的依據就是他們的 score ,高個在前,然后由 vlc 給出對應的格式詢問。

這個過程中排隊主要的意義就是優先選擇更愿意接受某種格式的模塊,比如同樣支持 .bin 格式的兩個模塊,一個 score=100 ,一個 score=50 ,最后的結果就是選擇前一個。

當然這里面就有了一個特例—— score=0,在這種情況下這個模塊只有被用戶或 vlc 明確指定的情況下才會被加載,否則不參與前面的排隊。

2 定義自己的模塊主體

注冊之后主要實現解碼器的邏輯與功能,這部分 emmm..... 沒法記,主要就是定義一個自己的數據結構體(上下文之類的),然后實現 Open、Close函數以及我們的 DecoderBlock,完成內部的調用或者其他邏輯。具體實現參照可以參考最開始的第一個拓展閱讀。

3 模塊正式注冊

模塊的正式注冊就是在 vlc 的模塊列表里正式添加我們的模塊,必須修改的文件一個是 vlc/configure.ac 一個是 vlc/modules/codec/Makefile.am (我們的核心代碼與這個 Makefile.am 應該在同一目錄下)。

3.1 configure.ac

這個文件主要是在 autoconf 中設置 vlc ,我們在里面加入一段我們自己的配置:

dnl
dnl  AVS2 decoder module
dnl
AC_ARG_ENABLE(avs2,
  [  --enable-avs2           AVS2 support (default disabled)])
AS_IF([test "${enable_avs2}" != "no"], [
AC_CHECK_HEADERS(cavs2dec.h, [
  VLC_ADD_PLUGIN([avs2])
  ])
])

這里面 dnl 就是注釋的意思,AC_ARG_ENABLE 是在編譯過程中是否編譯該模塊的選擇,如果進行編譯,則檢查頭文件:cavs2dec.h,頭文件存在則執行 VLC_ADD_PLUGIN([avs2]) ,不存在則--(沒寫,需要的話可以寫在第三個參數上)。

3.2 Makefile.am

這個文件是在 make 過程中的模塊加載,我們也添加一下:

### AVS2 Decoder Module ###

libavs2dec_plugin_la_SOURCES = codec/cavs2dec.c
libavs2dec_plugin_la_CPPFLAGS = $(AM_CPPFLAGS)
libavs2dec_plugin_la_CFLAGS = $(AM_CFLAGS)
libavs2dec_plugin_la_LDFLAGS = $(AM_LDFLAGS)
libavs2dec_plugin_la_LIBADD = $(LIBM) -lpthread -lcavs2dec
codec_LTLIBRARIES += libavs2dec_plugin.la

我們編譯最終生成的的插件文件名字叫做 libavs2dec_plugin.la ,一定要注意上面的配置語句要和我們最終的名稱匹配。SOURCE 是我們剛剛編寫的核心代碼,CFLAGS、CPPFLAGS、LDFLAGS 使我們在編譯過程中需要的頭文件和優化項(沒啥特殊需求就和其他模塊一樣),LIBADD 使我們額外需要添加的編譯依賴,這里我們需要 m、pthread 以及暫時在本地 install 過的 cavs2dec 。

4 編譯與查詢

編譯進新模塊和查詢的指令:

./bootstrap
./configure --enable-avs2
make
./vlc -vvv --color --list | grep avs

一定要運行一下 ./bootstrap ,因為我們更改了 configure.ac ,這里面主要是執行了一些 autoconf 命令。
順利運行后我們找到了我們剛剛加入的模塊:

...
avs2dec                avs2 Decoder library
...

5 加入我們的解碼器(TS)

5.1 ts.c
/* check only MPEG2, H.264, AVS2 and VC-1 */
if( p_es->fmt.i_codec != VLC_CODEC_MPGV &&
    p_es->fmt.i_codec != VLC_CODEC_H264 &&
    p_es->fmt.i_codec != VLC_CODEC_AVS2 &&
    p_es->fmt.i_codec != VLC_CODEC_VC1 )
    continue;
5.1 ts_psi.c
p_regs[] = {
        { "AC-3", AUDIO_ES, VLC_CODEC_A52   },
        { "EAC3", AUDIO_ES, VLC_CODEC_EAC3  },
        // ……
        { "avs2", VIDEO_ES, VLC_CODEC_AVS2 },
        { "", UNKNOWN_ES, 0 }

switch( i_stream_type )
    {
    case 0x01:  /* MPEG-1 video */
        es_format_Change( fmt, VIDEO_ES, VLC_CODEC_MPGV );
        fmt->i_original_fourcc = VLC_CODEC_MP1V;
        break;
    case 0x02:  /* MPEG-2 video */
    // ……
    case 0x42:  /* CAVS (Chinese AVS) */
        es_format_Change( fmt, VIDEO_ES, VLC_CODEC_CAVS );
        break;
    case 0x43:  /* AVS2 (Chinese AVS2) */
    case 0xd2:
        es_format_Change( fmt, VIDEO_ES, VLC_CODEC_AVS2 );
        break;
        
5.3 fourcc
#define VLC_CODEC_AVS2            VLC_FOURCC('A','V','S','2')

B(VLC_CODEC_CAVS, "Chinese AVS"),
    A("CAVS"),

6 小插曲—— vlc 界面問題

git clone 了 vlc 的 master (v4.0.0)之后編譯運行 ./vlc 不顯示界面,只能在命令行界面下運行。

仔細看了一下編譯結束后的輸出信息發現有特別多需要的包并沒有被安裝(開始時是跟著編譯缺包的信息裝的),后來在師兄提醒下用了 apt-get build-dep vlc 命令輕松地安上了很多需要的依賴,當然有時候會提醒未指定 deb-src 的問題,需要把 /etc/apt/sources.list 里面必要的語句解除注釋。

再次編譯后輸出:

libvlc configuration
--------------------
version               : 4.0.0-dev
system                : linux
architecture          : x86_64 mmx sse sse2
optimizations         : yes
vlc aliases           : cvlc rvlc

在 vlc 的 Makefile.am 里可以找到

cvlc: make-alias Makefile
    $(AM_V_GEN)$(MKALIAS) dummy

rvlc: make-alias Makefile
    $(AM_V_GEN)$(MKALIAS) rc

svlc: make-alias Makefile
    $(AM_V_GEN)$(MKALIAS) skins2

qvlc: make-alias Makefile
    $(AM_V_GEN)$(MKALIAS) qt

nvlc: make-alias Makefile
    $(AM_V_GEN)$(MKALIAS) ncurses

也就是說我們用于顯示界面的很重要的 qvlc 沒有被編譯進來。
于是在安裝完 QT5 后進行編譯時候使用命令

./configure --enable-qt

出現了一個錯誤

# include QPNI_HEADER 不存在這個文件或目錄

這個錯誤大概是 wayland 與 xwindow 的原因導致頭文件生成出現了問題,于是最終編譯命令就變成了

./configure --enable-debug --enable-qt --disable-wayland --enable-avs2

最后終于成功啦~

附成果截圖:


vlc gui 下查看加載的解碼插件
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容