FFmpeg源码剖析-通用:av_register_all()

FFMpeg 源码分析(1)av_register_all() FFMpeg 源码分析(1)av_register_all()一般我们使用FFMpeg做编解码都会先调用`av_register_all()`这个函数开头,完成基本的初始化工作。而至于它具体初始化了哪些东西呢,我们直接从代码里面来看吧。 void av_register_all(void) { static int initialized; //标志位指示是否已经初始化 阅读详情
av_register_all()函数的定义在 libavformat/allformats.c,
它的作用的注册ffmpeg的各种mux和demux。

1. 函数主体

void av_register_all(void)
{
    static int initialized;

    if (initialized)
        return;
    avcodec_register_all();

    /* (de)muxers */
    REGISTER_MUXER   (A64,              a64);
    REGISTER_DEMUXER (AA,               aa);
    ...

    /* image demuxers */
    REGISTER_DEMUXER (IMAGE_BMP_PIPE,        image_bmp_pipe);
    REGISTER_DEMUXER (IMAGE_DDS_PIPE,        image_dds_pipe);
    ...

    /* external libraries */
    REGISTER_MUXER   (CHROMAPRINT,      chromaprint);
    REGISTER_DEMUXER (LIBGME,           libgme);
    ...

    initialized = 1;
}

2. demux的注册

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

宏展开后:
{
  extern AVInputFormat ff_aa_muxer;
  if (CONFIG_A64_MUXER)
    av_register_input_format(&ff_aa_muxer);
}

libavformat/format.c

/** head of registered input format linked list */
static AVInputFormat *first_iformat = NULL;
/** head of registered output format linked list */
static AVOutputFormat *first_oformat = NULL;

static AVInputFormat **last_iformat = &first_iformat;
static AVOutputFormat **last_oformat = &first_oformat;
​
void av_register_input_format(AVInputFormat *format)
{
    AVInputFormat **p = last_iformat;

    // Note, format could be added after the first 2 checks but that implies that *p is no longer NULL
    while(p != &format->next && !format->next && avpriv_atomic_ptr_cas((void * volatile *)p, NULL, format))
        p = &(*p)->next;

    if (!format->next)
        last_iformat = &format->next;
}
将新的用于处理输入format的demux添加到链表的尾部;

3. mux的注册

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

宏展开后:
{
  extern AVOutputFormat ff_a64_muxer;
  if (CONFIG_A64_MUXER)
    av_register_output_format(&ff_a64_muxer);
}

liavformat/format.c

/** head of registered input format linked list */
static AVInputFormat *first_iformat = NULL;
/** head of registered output format linked list */
static AVOutputFormat *first_oformat = NULL;

static AVInputFormat **last_iformat = &first_iformat;
static AVOutputFormat **last_oformat = &first_oformat;

void av_register_output_format(AVOutputFormat *format)
{
    AVOutputFormat **p = last_oformat;

    // Note, format could be added after the first 2 checks but that implies that *p is no longer NULL
    while(p != &format->next && !format->next && avpriv_atomic_ptr_cas((void * volatile *)p, NULL, format))
        p = &(*p)->next;

    if (!format->next)
        last_oformat = &format->next;
}

将新的用于处理输入format的mux添加到链表的尾部;
从学龄前开始解读FFMPEG代码 之 av_register_all函数 从学龄前开始解读FFMPEG代码 之 av_register_all函数开始FFMPEG学龄前知识学习之前想说的一些话从第一个函数开始之av_register_all()ff_thread_once()av_format_next_initav_format_init_next()关于muxer_list.c和demuxer_list.coutdev_list 和 indev_list以及跟avdevice_register_all()的关系 开始FFMPEG学龄前知识学习之前想说的一些话 自从接触到视频编 阅读详情

相关推荐

ffmpeg源码简析(二)av_register_all(),avcodec_register_all()

av_register_all()该函数在所有基于ffmpeg的应用程序中几乎都是第一个被调用的。只有调用了该函数,才能使用复用器,编码器等。av_register_all()调用了avcodec_register_all()。avcodec_register_all()注册了和编解码器有关的组件:硬件加速器,解码器,编码器,Parser,Bitstream Filter。av_register_a

WangShuo的专栏 5204

FFmpeg关键函数介绍

在FFmpeg中av_read_frame函数的作用是读取码流中的若干音频帧或者1帧数据。在解码视频时,每解码一个视频帧,需要先调用av_read_frame获取1帧视频的压缩数据,然后才能对该数据进行解码。avformat_open_input的主要功能是打开一个文件,读取header,不会涉及打开编码器。srcSlice[],:输入图像的每个颜色通道的数据指针。srcStride[]:输入图像的每个颜色通道的跨度。dst[]:输出图像的每个颜色通道数据指针。srcSliceH:处理多少行。

weixin_63357306的博客 1307

ffmpeg源码分析之av_register_all()

1.muxer/demuxer使用的结构是AVOutp

BIGBurning 5722

ffmpeg4.2.2 av_register_all()的分析

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) Hiboat源代码: 基于Qt-ffmpeg写的一个多媒体播放器 ffmpeg4.2.2 av_register_all()的分析 1. av_register_all()介绍    av_register_all()是所有基于ffmpeg的应用程序中第一个被调用的函数, 只有调用了该函数,才能正常使用ffmpeg的各项功能,...

手中沙的博客 7825

cygwin环境下ffmpeg中av_register_all()函数,警告过时问题。

开发环境介绍 这一次代码环境比较复杂,我使用的分别是VS2017与CygWin编译C文件 项目遇见的问题 1.VS2017中使用av_register_all(),显示4996错误。 2.cygwin环境中av_register_all() 函数已被声明,但是不能通过VS环境中的行为,解决函数已被声明的解决办法 项目源码 /* * Copyright (c) 2017 Liming Sha...

weixin_37772659的博客 5194

从学龄前开始解读FFMPEG代码 之 avcodec_register_all函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

zzyincsdn的博客 1918

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

前一阵子看了一下ffmpeg的源代码,并且做了一些注释,在此贴出来以作备忘。 本文分析一下ffmpeg注册复用器,编码器等的函数av_register_all()。该函数在所有基于ffmpeg的应用程序中几乎都是第一个被调用的。只有调用了该函数,才能使用复用器,编码器等。 可见解复用器注册都是用 REGISTER_DEMUXER  (X,x) 例如: REGISTER_DEM

雷霄骅(leixiaohua1020)的专栏 11万+

SimpleFOC STM32实战:基于F103与HAL库,剖析速度环与电流环的协同控制

本文详细介绍了基于STM32F103与HAL库的SimpleFOC实战应用,重点剖析速度闭环控制与电流环的协同工作原理。通过开发环境搭建、参数调试技巧及性能优化方案,帮助开发者高效实现无刷电机精准控制,适用于机器人、无人机等高精度应用场景。

weixin_29170327的博客 476

FFMpeg (一) av_register_all()

FFMpeg (一) av_register_all()

qq_37705525的博客 4846

OpenDRIVE车道计算避坑指南:为什么你的poly3曲线总对不齐?

本文深入解析OpenDRIVE标准中车道几何计算的三大核心难题:参数化三次多项式(ParamPoly3)的坐标系转换与参数映射、车道偏移与宽度的优先级判定,以及螺旋线(Spiral)接续的平滑性保障。通过实战案例与代码示例,提供了一套避免车道线错位与曲率不连续的精确计算与验证方法,是高精地图开发与仿真场景构建的实用避坑指南。

q9w8e7r6t5的博客 424

手把手教你用VS Code + Codex在WSL中高效编程(避坑指南)

本文提供了一份详细的避坑指南,教你如何在WSL环境中高效配置和使用VS Code与OpenAI Codex。文章核心在于解决WSL内Codex扩展的OAuth登录失败问题,推荐将扩展安装在Windows本地,并通过UNC路径直接访问WSL文件系统,从而实现AI辅助编程与Linux开发环境的无缝结合,提升编码效率。

weixin_28677451的博客 1065

ffmpeg源码分析:av_register_all()和avcodec_register_all()

一、av_register_all() 二、avcodec_register_all() 一、av_register_all() av_register_all()注册所有的demuxer,muxer,outdev,indev设备。其定义在文件libavformat\allformats.c中,如下所示: void av_register_all(void) { ff_thread_once(&av_format_next_init, av_format_init_ne...

yangguoyu8023的博客 3720

企业级智能问数开发的核心痛点与技术聚焦

本文介绍了企业级智能问数系统开发的三大核心问题和解决方案:语义解析不精准、SQL生成不健壮、企业适配难落地。文章从开发者视角出发,详细拆解了NLU语义解析、SQL生成、对话记忆、企业级适配四大核心模块的技术实现。 在技术选型方面,推荐了LangChain+DeepSeek-R1、FAISS/Milvus、SQLAlchemy等工具链组合。针对企业级需求,重点讲解了: 语义解析模块的意图识别优化和要素提取技术 SQL生成模块的语法校验与性能优化方案 对话记忆模块的Redis存储实现 企业级适配的三层防护体系和

lamehsl的专栏 1047

FFmpeg源码(一)梦开始的地方——av_register_all()

av_register_all() 本篇主要解析av_register_all()所在文件libavformat–allformats.c及av_register_all()在调用过程中引用到的libavcodec–allcodecs.c。 ffmpeg注册复用器,编码器等的函数av_register_all()。该函数在所有基于ffmpeg的应用程序中几乎都是第一个被调用的。只有调用了该函数,才...

Dengzm94 2993

别再为授权费头疼了!手把手教你免授权搞定西门子、马扎克等12种主流数控机床的数据采集

本文提供了一套免授权采集西门子、马扎克等12种主流数控机床数据的实战指南,帮助中小型机加工车间节省80%以上的采集成本。通过TCP/UDP协议逆向工程和跨平台数据整合,实现经济、灵活且可持续的数据采集方案,涵盖设备兼容性处理、数据频率优化等关键问题。

weixin_26873711的博客 709

【数字IC验证进阶】正则表达式(Regular Expression)快速入门指南

在芯片开发过程中,正则表达式的使用非常常见。初次上手晦涩难懂,多用几次爱不释手!

悟已往之不谏 知来者之可追 1441

FFRMPEG4.1源码分析之 av_register_all() && avdevice_register_all()

目录 0 前言 1 av_register_all 1.1 基本信息 1.2函数声明 1.3源码 1.3.1 av_ register_all && av_register_input_format && av_register_output_format 1.3.2ff_thread_once 1.3.3av_format_init_nex...

ice_ly000的博客 6238

推荐11个顶级的Claude Code Skills

ClaudeCode的Skills系统为程序员提供了11个强大的AI辅助工具,包括代码审查、重构建议、单元测试生成、API文档自动生成、性能分析、安全扫描、数据库迁移脚本生成、CI/CD配置、依赖管理、ER图生成和日志分析等功能。这些"技能包"可大幅提升开发效率,从代码质量到协作沟通全方位优化工作流程。用户可根据需求选择2-3个核心功能开始尝试,熟练后还可自定义Skills。该系统需要配合Anthropic的API使用,建议先在小型项目测试再应用于核心业务。

分享AI、区块链技术及应用,未来已来 1852

FFmpeg源码分析:avcodec_register_all()注册编解码器

FFmpeg的avcodec_register_all()用于注册编解码器,FFmpeg4.0版本以前是调用该方法,运行期把所有编译的编解码器添加到链表。但是FFmpeg4.0版本以后,改为编译期自动生成编解码数组,还有解析器数组。

徐福记456 3万+

WPF在特定领域的应用:打造一款专业的图像编辑工具

WPF在特定领域的应用:打造一款专业的图像编辑工具,在软件开发的广阔领域中,Windows Presentation Foundation(WPF)以其强大的图形渲染能力和丰富的用户界面控件,为开发者提供了构建高性能、美观应用程序的平台。图像编辑工具作为一种对图形处理要求极高的应用类型,WPF 的特性使其成为理想的选择。本文将深入探讨如何使用 WPF 打造一款专业的图像编辑工具,涵盖从基础概念到实际代码实现的各个方面。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 6万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

FFMPEG源码分析一 av_register_all()

我们在使用FFMPEG库时,第一个调用的就是av_register_all(),这个函数到底做了什么,有什么用,这里做个简单分析。本文基于雷霄骅博客学习而来。详情请移步。

yunxiaobaobei的博客 968

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

FFmpeg源码分析:av_register_all()注册封装器与解封装器

FFmpeg中av_register_all()函数用于注册所有muxers、demuxers与protocols。FFmpeg4.0以前是用链表存储muxer/demuxer,FFmpeg4.0以后改为数组存储,并且av_register_all方法已被标记为过时,av_register_input_format和av_register_output_format也被标记为过时。

徐福记456 3万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

FFmpeg源码分析:avdevice_register_all()注册设备

FFmpeg的avdevice_register_all()用于注册输入/输出设备,属于libavdevice模块,是libavformat模块的补充,包含muxers与demuxers两部分。设备与平台相关,比如Android、iOS、Windows、Mac、Linux等不同平台提供不同设备。

徐福记456 3万+

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

本文分析一下ffmpeg注册编解码器等的函数avcodec_register_all()(注意不是av_register_all(),那是注册所有东西的)。该函数在所有基于ffmpeg的应用程序中几乎都是第一个被调用的。只有调用了该函数,才能使用编解码器等。 之前已经写过一篇文章了: ffmpeg 源代码简单分析 : av_register_all() 其实注册编解码器和注册复用器解复用

雷霄骅(leixiaohua1020)的专栏 4万+

FFmpeg源码分析:avfilter_register_all()注册AVFilter

FFmpeg的avfilter_register_all()用于注册所有AVFilter滤镜,包括音频、视频、音视频。但是FFmpeg4.0以后,注册函数已经被标记为过时,保留该方法是为了兼容以前版本。改为编译期自动生成AVFilter,保存在数组中。

徐福记456 3万+
上一篇: FFmpeg源码剖析-通用:avcodec_register_all()
下一篇: 程序人生的四个象限和两条主线
北雨南萍
北雨南萍 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄20年 2665粉丝 453原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北雨南萍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值