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阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容