本篇分析一下ffplay的数据结构。
(1)VideoState
VideoState结构体,正如名字的含义,管理了一些全局的播放状态。
typedef struct VideoState {
SDL_Thread *read_tid; //读文件线程id
AVInputFormat *iformat; //输入格式
/*
丢弃标志,在切换音视频流和关闭流时,会置为1。
当为1时,读文件线程和解码线程会退出循环或返回错误,以此来终止线程。
*/
int abort_request;
int force_refresh; //强制刷新
int paused; //是否暂停
int last_paused;
int queue_attachments_req; //是否请求attachments(对于mp3来说,就是封面图片)
int seek_req; //seek(前进/后退)标志,为1时表示要seek
int seek_flags; //按字节还是时间seek
int64_t seek_pos; //seek目标位置
int64_t seek_rel; //seek增量
int read_pause_return;
AVFormatContext *ic;
int realtime;
/*
ffplay提供了三种音视频同步的方法:视频同步到音频,音频同步到视频,音视频同步到外部时钟,
*/
Clock audclk; //音频时钟
Clock vidclk; //视频时钟
Clock extclk; //外部时钟
/*
解码后,frame要存于队列中。
*/
FrameQueue