FFmpeg原始碼簡單分析:libavdevice的avdevice_register_all(),

來源:互聯網
上載者:User

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



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.