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

转载:http://blog.csdn.net/leixiaohua1020/article/details/41211121

=====================================================

FFmpeg的库函数源代码分析文章列表:

架构图】

FFmpeg源代码结构图 - 解码

FFmpeg源代码结构图 - 编码

【通用】

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

FFmpeg 源代码简单分析:avcodec_register_all()

FFmpeg 源代码简单分析:内存的分配和释放(av_malloc()av_free()等)

FFmpeg 源代码简单分析:常见结构体的初始化和销毁(AVFormatContextAVFrame等)

FFmpeg 源代码简单分析:avio_open2()

FFmpeg 源代码简单分析:av_find_decoder()av_find_encoder()

FFmpeg 源代码简单分析:avcodec_open2()

FFmpeg 源代码简单分析:avcodec_close()

【解码】

图解FFMPEG打开媒体的函数avformat_open_input

FFmpeg 源代码简单分析:avformat_open_input()

FFmpeg 源代码简单分析:avformat_find_stream_info()

FFmpeg 源代码简单分析:av_read_frame()

FFmpeg 源代码简单分析:avcodec_decode_video2()

FFmpeg 源代码简单分析:avformat_close_input()

【编码】

FFmpeg 源代码简单分析:avformat_alloc_output_context2()

FFmpeg 源代码简单分析:avformat_write_header()

FFmpeg 源代码简单分析:avcodec_encode_video()

FFmpeg 源代码简单分析:av_write_frame()

FFmpeg 源代码简单分析:av_write_trailer()

【其它】

FFmpeg源代码简单分析:日志输出系统(av_log()等)

FFmpeg源代码简单分析:结构体成员管理系统-AVClass

FFmpeg源代码简单分析:结构体成员管理系统-AVOption

FFmpeg源代码简单分析:libswscalesws_getContext()

FFmpeg源代码简单分析:libswscalesws_scale()

FFmpeg源代码简单分析:libavdeviceavdevice_register_all()

FFmpeg源代码简单分析:libavdevicegdigrab

【脚本】

FFmpeg源代码简单分析:makefile

FFmpeg源代码简单分析:configure

H.264

FFmpegH.264解码器源代码简单分析:概述

=====================================================


Avdevice.h (libavdevice)

Alldevices.c (libavdevice)

/**

* Initialize libavdevice and register all the input and output devices.

* @warning This function is not thread safe.

*/

void avdevice_register_all(void);

  1. 注册avdevice 多媒体交互设备

通过分析函数多媒体INDEV OUTDEV在ffmpeg中就是AvInputFormat AvOutputFormat

常见的多媒体设备:

音频:oss alsa

视频:in:dshow avfoundation v4l2 openal

    Out:sdl opengl v4l2

例如:

  1. AVInputFormat ff_v4l2_demuxer = {  
  2.     .name           = "video4linux2,v4l2",  
  3.     .long_name      = NULL_IF_CONFIG_SMALL("Video4Linux2 device grab"),  
  4.     .priv_data_size = sizeof(struct video_data),  
  5.     .read_probe     = v4l2_read_probe,  
  6.     .read_header    = v4l2_read_header,  
  7.     .read_packet    = v4l2_read_packet,  
  8.     .read_close     = v4l2_read_close,  
  9.     .get_device_list = v4l2_get_device_list,  
  10.     .flags          = AVFMT_NOFILE,  
  11.     .priv_class     = &v4l2_class,  
  12. };  

REGISTER_INOUTDEV(V4L2, v4l2);

ES:宏定义 函数指针

本文简单记录一下FFmpeglibavdevice注册设备的函数avdevice_register_all()avdevice_register_all()在编程中的使用示例可以参考文章:

最简单的基于FFmpegAVDevice例子(读取摄像头)

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

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

avdevice_register_all()代码如下。

[cpp] view plain copy

  1. /* 
  2.  * 雷霄骅 
  3.  * http://blog.csdn.net/leixiaohua1020 
  4.  */  
  5.    
  6. #include "config.h"  
  7. #include "avdevice.h"  
  8. //输出设备  
  9. #define REGISTER_OUTDEV(X, x)                                           \  
  10.     {                                                                   \  
  11.         extern AVOutputFormat ff_##x##_muxer;                           \  
  12.         if (CONFIG_##X##_OUTDEV)                                        \  
  13.             av_register_output_format(&ff_##x##_muxer);                 \  
  14.     }  
  15. //输入设备  
  16. #define REGISTER_INDEV(X, x)                                            \  
  17.     {                                                                   \  
  18.         extern AVInputFormat ff_##x##_demuxer;                          \  
  19.         if (CONFIG_##X##_INDEV)                                         \  
  20.             av_register_input_format(&ff_##x##_demuxer);                \  
  21.     }  
  22. //输入输出设备  
  23. #define REGISTER_INOUTDEV(X, x) REGISTER_OUTDEV(X, x); REGISTER_INDEV(X, x)  
  24.    
  25. void avdevice_register_all(void)  
  26. {  
  27.     static int initialized;  
  28.    
  29.     if (initialized)  
  30.         return;  
  31.     initialized = 1;  
  32.    
  33.     /* devices */  
  34.     REGISTER_INOUTDEV(ALSA,             alsa);  
  35.     REGISTER_INDEV   (AVFOUNDATION,     avfoundation);  
  36.     REGISTER_INDEV   (BKTR,             bktr);  
  37.     REGISTER_OUTDEV  (CACA,             caca);  
  38.     REGISTER_OUTDEV  (DECKLINK,         decklink);  
  39.     REGISTER_INDEV   (DSHOW,            dshow);  
  40.     REGISTER_INDEV   (DV1394,           dv1394);  
  41.     REGISTER_INOUTDEV(FBDEV,            fbdev);  
  42.     REGISTER_INDEV   (GDIGRAB,          gdigrab);  
  43.     REGISTER_INDEV   (IEC61883,         iec61883);  
  44.     REGISTER_INDEV   (JACK,             jack);  
  45.     REGISTER_INDEV   (LAVFI,            lavfi);  
  46.     REGISTER_INDEV   (OPENAL,           openal);  
  47.     REGISTER_OUTDEV  (OPENGL,           opengl);  
  48.     REGISTER_INOUTDEV(OSS,              oss);  
  49.     REGISTER_INOUTDEV(PULSE,            pulse);  
  50.     REGISTER_INDEV   (QTKIT,            qtkit);  
  51.     REGISTER_OUTDEV  (SDL,              sdl);  
  52.     REGISTER_INOUTDEV(SNDIO,            sndio);  
  53.     REGISTER_INOUTDEV(V4L2,             v4l2);  
  54. //    REGISTER_INDEV   (V4L,              v4l  
  55.     REGISTER_INDEV   (VFWCAP,           vfwcap);  
  56.     REGISTER_INDEV   (X11GRAB,          x11grab);  
  57.     REGISTER_OUTDEV  (XV,               xv);  
  58.    
  59.     /* external libraries */  
  60.     REGISTER_INDEV   (LIBCDIO,          libcdio);  
  61.     REGISTER_INDEV   (LIBDC1394,        libdc1394);  
  62. }  



从代码中可以看出,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()
:注册输入设备和输出设备。实际上将上述两个宏定义合并了。

猜你喜欢

转载自blog.csdn.net/flyztek/article/details/74002533
今日推荐