FFmpeg 基本API avcodec_alloc_context3函数内部调用流程分析

1、avcodec_alloc_context3函数定义

avcodec_alloc_context3() 是 FFmpeg 中用于分配并初始化解码器或编码器上下文 AVCodecContext 的 API,是绝大多数编解码初始化流程的第一步。

cpp 复制代码
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
- 参数 codec:你打算使用的编解码器(如 ff_hevc_decoder)。可以为 NULL,但通常你会先通过 avcodec_find_decoder() 得到一个有效 AVCodec*。
- 返回值:成功返回指向 AVCodecContext 的指针,失败返回 NULL。

2、avcodec_alloc_context3函数内部调用说明

avcodec_alloc_context3内部分析:

  • 申请一个 AVCodecContext 内存结构体;
  • 填充 codec 类型(如 AVMEDIA_TYPE_VIDEO)和 ID(如 AV_CODEC_ID_HEVC)等基本字段;
  • 初始化内部的默认值(通过 AVOptions 系统);
  • 如 codec->priv_data_size > 0,则为 priv_data 分配内存(如 HEVCContext);
  • 如 codec->priv_class 存在,则为 priv_data 设置默认 AVOptions。
cpp 复制代码
avcodec_alloc_context3(codec)
└── av_mallocz(sizeof(AVCodecContext))                    // 分配 AVCodecContext 结构体
    └── init_context_defaults(s, codec)                  // 填充默认值
        ├── s->codec_type = codec->type
        ├── s->codec_id   = codec->id
        ├── av_opt_set_defaults(s)                        // 初始化 AVOptions
        ├── if (codec->priv_data_size > 0)
        │     └── s->priv_data = av_mallocz(codec->priv_data_size) // 分配私有数据
        └── if (codec->priv_class)
              └── av_opt_set_defaults(s->priv_data)      // 设置 priv_data 的 AVOptions

3、avcodec_alloc_context3函数调用流程图

相关推荐
linweidong3 小时前
C++ 模块化编程(Modules)在大规模系统中的实践难点?
linux·前端·c++
半桔7 小时前
【IO多路转接】高并发服务器实战:Reactor 框架与 Epoll 机制的封装与设计逻辑
linux·运维·服务器·c++·io
HABuo8 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
我在人间贩卖青春9 小时前
C++之多重继承
c++·多重继承
m0_736919109 小时前
C++代码风格检查工具
开发语言·c++·算法
2301_7634724610 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
阿猿收手吧!11 小时前
【C++】std::promise原理与实战解析
c++
m0_7066532311 小时前
分布式系统安全通信
开发语言·c++·算法
Zach_yuan12 小时前
深入浅出 JSONCpp
linux·服务器·网络·c++
寻寻觅觅☆12 小时前
东华OJ-基础题-104-A == B ?(C++)
开发语言·c++