FFmpeg 基本API avcodec_find_decoder函数内部调用流程分析
1、avcodec_find_decoder函数定义
在已注册的所有解码器(AVCodec)中,根据指定的 AVCodecID 找到第一个支持它的解码器结构体(AVCodec*)。
const AVCodec *avcodec_find_decoder(enum AVCodecID id)
{const AVCodec *p = NULL;void *i = 0;while ((p = av_codec_iterate(&i))) {if (av_codec_is_decoder(p) && p->id == id)return p;}return NULL;
}
参数:
- id:枚举类型 AVCodecID,表示要查找的解码器类型,例如 AV_CODEC_ID_H264。
返回值: - 成功:返回匹配的 AVCodec *;
- 失败:返回 NULL。
2、avcodec_find_decoder函数内部调用
以下是一个典型的解码器初始化调用栈(如在 FFmpeg 播放器或解复用器中):
main() or demuxing_loop()
└── avformat_open_input()└── avformat_find_stream_info()└── find_decoder()└── avcodec_find_decoder(codec_id)└── av_codec_iterate()└── av_codec_is_decoder()如果是你自己手动写的初始化代码,一般是这样的调用路径:
avcodec_find_decoder(AV_CODEC_ID_H264) // 找到 AVCodec
└── avcodec_alloc_context3(codec) // 分配 AVCodecContext,自动填充 priv_data└── avcodec_open2(avctx, codec, NULL) // 打开解码器,初始化内部结构└── codec->init(avctx) // 调用对应 decode.init 函数,如 h264_decode_init()