FFmpeg源代码简单分析:libavdevice的avdevice

本文简单记录一下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()代码如下。

/* * 雷霄骅 * */#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,v4lREGISTER_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

望着它们,我睡着了。今天已经过去——我生命中所有天中的一天,

FFmpeg源代码简单分析:libavdevice的avdevice

相关文章:

你感兴趣的文章:

标签云: