FFmpeg源码分析:avdevice_register_all()注册设备

FFmpeg的avdevice_register_all()用于注册输入/输出设备,属于libavdevice模块,是libavformat模块的补充,包含muxers与demuxers两部分。设备与平台相关,比如Android、iOS、Windows、Mac、Linux等不同平台提供不同设备。

libavdevice模块的描述如下(位于libavdevice/avdevice.h):

/**
 * @defgroup lavd libavdevice
 * Special devices muxing/demuxing library.
 *
 * Libavdevice is a complementary library to @ref libavf "libavformat". It
 * provides various "special" platform-specific muxers and demuxers, e.g. for
 * grabbing devices, audio capture and playback etc.
 *
 * To use libavdevice, simply call avdevice_register_all() to register all
 * compiled muxers and demuxers. They all use standard libavformat API.
 *
 */

描述中有提到,调用avdevice_register_all()来注册所有已编译的muxers/demuxers设备。我们来看下注册设备的方法,位于libavdevice/alldevices.c中:

void avdevice_register_all(void)
{
    avpriv_register_devices(outdev_list, indev_list);
}

内部调用avpriv_register_devices()进行注册,该方法位于libavformat/allformats.c,这就印证上面提及的说法:libavdevice是libavformat的补充。具体代码如下:

void avpriv_register_devices(const AVOutputFormat * const o[], const AVInputFormat * const i[])
{
    ff_mutex_lock(&avpriv_register_devices_mutex);
    outdev_list = o;
    indev_list = i;
    ff_mutex_unlock(&avpriv_register_devices_mutex);
#if FF_API_NEXT
    av_format_init_next();
#endif
}

注册过程很简单,只是给outdev_list和indev_list数组赋值。我们再回头看这两个数组,其实是编译期自动生成的。indev_list数组,在indev_list.c文件中;outdev_list数组,在outdev_list.c文件中。indev_list和outdev_list的设备都是根据alldevices.c中声明的全局变量来生成,变量列表如下:

/* devices */
extern AVInputFormat  ff_alsa_demuxer;
extern AVOutputFormat ff_alsa_muxer;
extern AVInputFormat  ff_android_camera_demuxer;
extern AVOutputFormat ff_audiotoolbox_muxer;
extern AVInputFormat  ff_avfoundation_demuxer;
extern AVInputFormat  ff_bktr_demuxer;
extern AVOutputFormat ff_caca_muxer;
extern AVInputFormat  ff_decklink_demuxer;
extern AVOutputFormat ff_decklink_muxer;
extern AVInputFormat  ff_dshow_demuxer;
extern AVInputFormat  ff_fbdev_demuxer;
extern AVOutputFormat ff_fbdev_muxer;
extern AVInputFormat  ff_gdigrab_demuxer;
extern AVInputFormat  ff_iec61883_demuxer;
extern AVInputFormat  ff_jack_demuxer;
extern AVInputFormat  ff_kmsgrab_demuxer;
extern AVInputFormat  ff_lavfi_demuxer;
extern AVInputFormat  ff_openal_demuxer;
extern AVOutputFormat ff_opengl_muxer;
extern AVInputFormat  ff_oss_demuxer;
extern AVOutputFormat ff_oss_muxer;
extern AVInputFormat  ff_pulse_demuxer;
extern AVOutputFormat ff_pulse_muxer;
extern AVOutputFormat ff_sdl2_muxer;
extern AVInputFormat  ff_sndio_demuxer;
extern AVOutputFormat ff_sndio_muxer;
extern AVInputFormat  ff_v4l2_demuxer;
extern AVOutputFormat ff_v4l2_muxer;
extern AVInputFormat  ff_vfwcap_demuxer;
extern AVInputFormat  ff_xcbgrab_demuxer;
extern AVOutputFormat ff_xv_muxer;

/* external libraries */
extern AVInputFormat  ff_libcdio_demuxer;
extern AVInputFormat  ff_libdc1394_demuxer;

按照平台划分,有Android、iOS、Windows、Mac、Linux等平台。也有跨平台的库、第三方库。

Android设备:

extern AVInputFormat  ff_android_camera_demuxer;

iOS与Mac设备:

extern AVOutputFormat ff_audiotoolbox_muxer;
extern AVInputFormat  ff_avfoundation_demuxer;

linux设备:

extern AVInputFormat  ff_alsa_demuxer;
extern AVOutputFormat ff_alsa_muxer;
extern AVInputFormat  ff_fbdev_demuxer;
extern AVOutputFormat ff_fbdev_muxer;
extern AVInputFormat  ff_v4l2_demuxer;
extern AVOutputFormat ff_v4l2_muxer;

Windows设备:

extern AVInputFormat  ff_decklink_demuxer;
extern AVOutputFormat ff_decklink_muxer;
extern AVInputFormat  ff_dshow_demuxer;
extern AVInputFormat  ff_gdigrab_demuxer;
extern AVOutputFormat ff_sdl2_muxer;
extern AVInputFormat  ff_vfwcap_demuxer;
extern AVInputFormat  ff_xcbgrab_demuxer;
extern AVOutputFormat ff_xv_muxer;

猜你喜欢

转载自blog.csdn.net/u011686167/article/details/121716973
今日推荐