设为首页 加入收藏

TOP

FFmpeg 是如何实现多态的?(一)
2019-09-03 02:41:58 】 浏览:82
Tags:FFmpeg 如何 实现

前言


要解决这个问题,首先需要从函数 av_register_all 说起。


av_register_all
av_register_all 是几乎所有 FFmpeg 程序中第一个被调用的函数,用于注册在编译 FFmpeg 时设置了 --enable 选项的封装器、解封装器、编码器、解码器等。源码如下:


#define REGISTER_MUXER(X, x)                                            \
    {                                                                  \
        extern AVOutputFormat ff_##x##_muxer;                          \
        if (CONFIG_##X##_MUXER)                                        \
            av_register_output_format(&ff_##x##_muxer);                \
    }


#define REGISTER_DEMUXER(X, x)                                          \
    {                                                                  \
        extern AVInputFormat ff_##x##_demuxer;                          \
        if (CONFIG_##X##_DEMUXER)                                      \
            av_register_input_format(&ff_##x##_demuxer);                \
    }


#define REGISTER_MUXDEMUX(X, x) REGISTER_MUXER(X, x); REGISTER_DEMUXER(X, x)


static void register_all(void)
{
    // 注册编解码器
    avcodec_register_all();


    // 注册封装器、解封装器
    /* (de)muxers */
    REGISTER_MUXER  (A64,              a64);
    REGISTER_DEMUXER (AA,              aa);
    REGISTER_DEMUXER (AAC,              aac);
    REGISTER_MUXDEMUX(AC3,              ac3);
    REGISTER_MUXDEMUX(FLV,              flv);
    REGISTER_MUXDEMUX(GIF,              gif);
    ...


    /* image demuxers */
    REGISTER_DEMUXER (IMAGE_BMP_PIPE,        image_bmp_pipe);
    REGISTER_DEMUXER (IMAGE_JPEG_PIPE,      image_jpeg_pipe);
    REGISTER_DEMUXER (IMAGE_SVG_PIPE,        image_svg_pipe);
    REGISTER_DEMUXER (IMAGE_WEBP_PIPE,      image_webp_pipe);
    REGISTER_DEMUXER (IMAGE_PNG_PIPE,        image_png_pipe);
    ...


    /* external libraries */
    REGISTER_MUXER 

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java函数式编程原理以及应用 下一篇Python字符串拼接的几种方法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目