ijkplayer系列13:video_refresh_thread

限于喜欢 提交于 2019-11-30 04:26:12

ffp_video_thread
在这里插入图片描述
这个线程用来处理视频解码。解码的调用流程如下:
以上可以看出,解码流程主动分为以下三部分:

  1. 初始化解码器。
  2. 开启解码器,如果配置了硬解则会尝试去创建硬解码器,没有配置硬解或者尝试创建硬解码器失败则创建软解码器。
  3. 启动解码线程,可以发现硬解和软解最终进入的方法是不同的,后面我们会针对两者分别解析。
    我们先来看下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);
}

可以发现,初始化解码器做的事情比较简单,核心的工作我都备注出来了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!