SDL的线程同步模型
1.线程1对互斥量加锁,执行需要线程同步的任务,执行到SDL_CondWait(cond, lock);时释放锁并暂停线程,等待线程1的通知
2.线程2获取到互斥量锁,执行需要线程同步的任务,任务完成后发SDL_CondSignal(cond);通知,并释放锁
3.线程1获取到通知后,获取到锁,处理需要线程同步的任务,任务处理完成后,释放锁
4.上面的过程保证了俩个线程能够同步处理,保证了线程安全
初始化SDL视频显示窗口
1.参数1是窗口显示名程
2.参数2,3是窗口显示位置
3.参数4,5是窗口的宽和高
4.参数6是窗口可能的类型(最后一个好像是初始化的类型,按我们现在的参数就是可以改变大小,初始化为隐藏状态)
SDL_Window这个结构体存放了所有与Window有关的信息,比如长宽、位置、边界等等。
SDL_Renderer这个结构体存放了与所有渲染有关的信息,它被绑定到了SDL_Window,刷新Renderer可以刷新与其绑定的Window。
SDL_Renderer会渲染SDL_Texture,
SDL_Texture与SDL_Surface很像,不同是SDL_Surface仅仅是一个包含像素信息的结构体,
而SDL_Texture是一个高效的特定驱动的像素数据集;
还有一点不同的是SDL_Surface使用软件渲染(CPU)而SDL_Texture使用硬件渲染(GPU)。
启动解码线程decode_thread
1.获取AVFormatContext
2.初始化视频编解码的相关对象
stream_index
AVStream
AVCodecContext
SwsContext
SDL_Texture
分配图像转换所需要的内存空间 *yPlane,*uPlane,*vPlane;
视频packet队列
视频解码线程 video_thread
3.初始化音频编解码相关对象
stream_index
AVStream
AVCodecContext
SwrContext
out_buffer_size
执行SDL_OpenAudio SDL_PauseAudio 这几步开启音频处理(音频处理的线程不是由程序显式创建的,是SDL负责创建的)
音频packet队列
4.循环处理
通过av_read_frame读取packet
如果是视频数据加入视频队列
如果是音频数据加入音频队列
如果俩个队列中未处理的数据达到最大,则休眠10毫秒
5.保持线程不结束
SDL的音频处理流程
1.初始化SDL_AudioSpec结构,wanted_spec.callback指向一个回调函数
2.执行SDL_OpenAudio,参数为SDL_AudioSpec
3.执行SDL_PauseAudio,启动音频处理
4.音频处理线程通过回调函数 wanted_spec.callback 向用户程序要待播放的音频数据
5.SDL播放音频数据
6.循环4,5俩步
解码流程
1.av_read_frame 读取一个packet
2.avcodec_send_packet 解码packet
3.ret = avcodec_receive_frame 接收解码后的frame
if ret==AVERROR(EAGAIN)
说明目前读取的packet不足以解码出当前frame,跳转到1,继续读取下一packet
if ret==AVERROR_EOF
说明这个packet已经完全解码,跳转到1,继续读取下一packet
else
说明解码得到了frame,处理frame
跳转到3,继续获取下一frame