轉載: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 源代碼簡單分析:常見結構體的初始化和銷毀(AVFormatContext,AVFrame等)
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源代碼簡單分析:libswscale的sws_getContext()
FFmpeg源代碼簡單分析:libswscale的sws_scale()
FFmpeg源代碼簡單分析:libavdevice的avdevice_register_all()
FFmpeg源代碼簡單分析:libavdevice的gdigrab
【腳本】
FFmpeg源代碼簡單分析:makefile
FFmpeg源代碼簡單分析:configure
【H.264】
FFmpeg的H.264解碼器源代碼簡單分析:概述
=====================================================
Avdevice.h (libavdevice)
Alldevices.c (libavdevice)
void avdevice_register_all(void);
- 注冊avdevice 多媒體互動裝置
通過分析函數多媒體INDEV OUTDEV在ffmpeg中就是AvInputFormat AvOutputFormat
常見的多媒體裝置:
音頻:oss alsa
視訊:in:dshow avfoundation v4l2 openal
Out:sdl opengl v4l2
例如:
- AVInputFormat ff_v4l2_demuxer = {
- .name = "video4linux2,v4l2",
- .long_name = NULL_IF_CONFIG_SMALL("Video4Linux2 device grab"),
- .priv_data_size = sizeof(struct video_data),
- .read_probe = v4l2_read_probe,
- .read_header = v4l2_read_header,
- .read_packet = v4l2_read_packet,
- .read_close = v4l2_read_close,
- .get_device_list = v4l2_get_device_list,
- .flags = AVFMT_NOFILE,
- .priv_class = &v4l2_class,
- };
REGISTER_INOUTDEV(V4L2, v4l2);
ES:宏定義 函數指針
本文簡單記錄一下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()代碼如下。
[cpp] view plain copy
- #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;
- 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);
- 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():注冊輸入裝置和輸出裝置。實際上将上述兩個宏定義合并了。