ffplay源码分析3-代码框架 (2)

解复用线程实现如下功能:
[1]. 创建音频、视频、字幕解码线程
[2]. 从输入文件读取packet,根据packet类型(音频、视频、字幕)将这放入不同packet队列

3.4 视频解码线程

视频解码线程从视频packet队列中取数据,解码后存入视频frame队列。

3.4.1 video_thread()

视频解码线程将解码后的帧放入frame队列中。为节省篇幅,如下源码中删除了滤镜filter相关代码。

// 视频解码线程:从视频packet_queue中取数据,解码后放入视频frame_queue static int video_thread(void *arg) { VideoState *is = arg; AVFrame *frame = av_frame_alloc(); double pts; double duration; int ret; AVRational tb = is->video_st->time_base; AVRational frame_rate = av_guess_frame_rate(is->ic, is->video_st, NULL); if (!frame) { return AVERROR(ENOMEM); } for (;;) { ret = get_video_frame(is, frame); if (ret < 0) goto the_end; if (!ret) continue; // 当前帧播放时长 duration = (frame_rate.num && frame_rate.den ? av_q2d((AVRational){frame_rate.den, frame_rate.num}) : 0); // 当前帧显示时间戳 pts = (frame->pts == AV_NOPTS_VALUE) ? NAN : frame->pts * av_q2d(tb); // 将当前帧压入frame_queue ret = queue_picture(is, frame, pts, duration, frame->pkt_pos, is->viddec.pkt_serial); av_frame_unref(frame); if (ret < 0) goto the_end; } the_end: av_frame_free(&frame); return 0; } 3.4.2 get_video_frame()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxwjj.html