当前位置: 代码迷 >> GIS >> FFmpeg源代码简略分析:libavdevice的avdevice_register_all()
  详细解决方案

FFmpeg源代码简略分析:libavdevice的avdevice_register_all()

热度:351   发布时间:2016-05-05 06:07:54.0
FFmpeg源代码简单分析:libavdevice的avdevice_register_all()

本文简单记录一下FFmpeg中libavdevice注册设备的函数avdevice_register_all()。

在使用libavdevice之前,必须先运行avdevice_register_all()对设备进行注册,否则就会出错。avdevice_register_all()的注册方式和av_register_all()、avcodec_register_all()这几个函数是类似的。可以参考文章:

《FFmpeg 源代码简单分析:av_register_all()》

avdevice_register_all()代码如下。

/* * 雷霄骅 * http://blog.csdn.net/leixiaohua1020 */#include "config.h"#include "avdevice.h"//输出设备#define REGISTER_OUTDEV(X, x)                                           \    {                                                                   \        extern AVOutputFormat ff_##x##_muxer;                           \        if (CONFIG_##X##_OUTDEV)                                        \            av_register_output_format(&ff_##x##_muxer);                 \    }//输入设备#define REGISTER_INDEV(X, x)                                            \    {                                                                   \        extern AVInputFormat ff_##x##_demuxer;                          \        if (CONFIG_##X##_INDEV)                                         \            av_register_input_format(&ff_##x##_demuxer);                \    }//输入输出设备#define REGISTER_INOUTDEV(X, x) REGISTER_OUTDEV(X, x); REGISTER_INDEV(X, x)void avdevice_register_all(void){    static int initialized;    if (initialized)        return;    initialized = 1;    /* devices */    REGISTER_INOUTDEV(ALSA,             alsa);    REGISTER_INDEV   (AVFOUNDATION,     avfoundation);    REGISTER_INDEV   (BKTR,             bktr);    REGISTER_OUTDEV  (CACA,             caca);    REGISTER_OUTDEV  (DECKLINK,         decklink);    REGISTER_INDEV   (DSHOW,            dshow);    REGISTER_INDEV   (DV1394,           dv1394);    REGISTER_INOUTDEV(FBDEV,            fbdev);    REGISTER_INDEV   (GDIGRAB,          gdigrab);    REGISTER_INDEV   (IEC61883,         iec61883);    REGISTER_INDEV   (JACK,             jack);    REGISTER_INDEV   (LAVFI,            lavfi);    REGISTER_INDEV   (OPENAL,           openal);    REGISTER_OUTDEV  (OPENGL,           opengl);    REGISTER_INOUTDEV(OSS,              oss);    REGISTER_INOUTDEV(PULSE,            pulse);    REGISTER_INDEV   (QTKIT,            qtkit);    REGISTER_OUTDEV  (SDL,              sdl);    REGISTER_INOUTDEV(SNDIO,            sndio);    REGISTER_INOUTDEV(V4L2,             v4l2);//    REGISTER_INDEV   (V4L,              v4l    REGISTER_INDEV   (VFWCAP,           vfwcap);    REGISTER_INDEV   (X11GRAB,          x11grab);    REGISTER_OUTDEV  (XV,               xv);    /* external libraries */    REGISTER_INDEV   (LIBCDIO,          libcdio);    REGISTER_INDEV   (LIBDC1394,        libdc1394);}


从代码中可以看出,avdevice_register_all()调用3个函数进行设备组建的注册:REGISTER_INDEV(),REGISTER_OUTDEV(),REGISTER_INOUTDEV()。上述3个函数实际上是预定义的3个宏:
REGISTER_INDEV():注册输入设备。实际上调用了av_register_input_format()将输入设备注册成一个AVInputFormat。
REGISTER_OUTDEV():注册输出设备。实际上调用了av_register_output_format()将输出设备注册成一个AVOutputFormat。
REGISTER_INOUTDEV():注册输入设备和输出设备。实际上将上述两个宏定义合并了。




雷霄骅
[email protected]
http://blog.csdn.net/leixiaohua1020



  相关解决方案