FFmpeg原始碼簡單分析:libavdevice的avdevice_register_all(),
本文簡單記錄一下FFmpeg中libavdevice註冊裝置的函數avdevice_register_all()。avdevice_register_all()在編程中的使用樣本可以參考文章:
《最簡單的基於FFmpeg的AVDevice例子(讀取網路攝影機)》
在使用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():註冊輸入裝置和輸出裝置。實際上將上述兩個宏定義合并了。
雷霄驊
leixiaohua1020@126.com
http://blog.csdn.net/leixiaohua1020