FFmpeg 基本API avcodec_alloc_context3函数内部调用流程分析
1、avcodec_alloc_context3函数定义
avcodec_alloc_context3() 是 FFmpeg 中用于分配并初始化解码器或编码器上下文 AVCodecContext 的 API,是绝大多数编解码初始化流程的第一步。
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。
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