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函数调用流程图

相关推荐
jimy124 分钟前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
狗凯之家源码网28 分钟前
吃瓜主题 3.0 视频源码深度评测与实战指南
音视频
会编程的小孩2 小时前
C++ 定时器
c++
沫璃染墨3 小时前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html
美狐美颜sdk5 小时前
视频美颜SDK中的YUV与RGBA格式有什么区别?直播APP开发解析
人工智能·计算机视觉·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
揽星河..5 小时前
【C语言】分支和循环
c语言·c++·算法
音视频牛哥5 小时前
不止于超低延迟:SmartMediaKit iOS Unity3D RTSP/RTMP 播放器的核心竞争力
音视频·unity3d rtsp播放器·unity3d rtmp播放器·smartmediakit·ios unity rtsp·ios unity rtmp·unity3d ios播放器
Fuyo_11196 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
辰辰观影7 小时前
网盘视频播放器怎么选?2026全平台推荐
经验分享·音视频
傲世仙尊7 小时前
继承-类设计层次复用切片转换与菱形继承的死结
c++