ffp_video_thread
这个线程用来处理视频解码。解码的调用流程如下:
以上可以看出,解码流程主动分为以下三部分:
- 初始化解码器。
- 开启解码器,如果配置了硬解则会尝试去创建硬解码器,没有配置硬解或者尝试创建硬解码器失败则创建软解码器。
- 启动解码线程,可以发现硬解和软解最终进入的方法是不同的,后面我们会针对两者分别解析。
我们先来看下decoder_init():
static void decoder_init(Decoder *d, AVCodecContext *avctx, PacketQueue *queue, SDL_cond *empty_queue_cond) {
memset(d, 0, sizeof(Decoder));
d->avctx = avctx;
// 保存数据来源的队列引用,这个队列存储了从流中读取的未解码的帧数据
d->queue = queue;
d->empty_queue_cond = empty_queue_cond;
d->start_pts = AV_NOPTS_VALUE;
// 将当前时间点(系统启动至今的毫秒数)作为第一帧解码的时间点
d->first_frame_decoded_time = SDL_GetTickHR();
d->first_frame_decoded = 0;
SDL_ProfilerReset(&d->decode_profiler, -1);
}
可以发现,初始化解码器做的事情比较简单,核心的工作我都备注出来了。
来源:https://blog.csdn.net/a910626/article/details/101074199