在字幕与视频合并的地方video_image_display(VideoState *is),把每帧都保存为png图片,发现在非嵌入QT情况下,它的每一帧带字幕的图片显示都正常,在嵌入情况下,只有少部分图片缺少字幕,应该来说也可以显示字幕。但字幕基本上只闪了一下。
在跟踪过程中发现一个现象:当保存图片时,SDL中能看到部分字幕,只是闪烁比较厉害,当时感觉是需要Delay一下,于是在video_image_display 中加了Delay,情况要好一些,但闪烁问题一直还是存在,无论把它延时多少
也想把subtitle stream共享到qt中,再在qt中实现视频数据与字幕流合并,但感觉这样实现的逻辑有点复杂,如果没有其它更好的办法只能这样。但个人一直坚信,合并字幕流后的视频里面已经存在字幕数据了,应该能显示才对。
再次对video_image_display进行了分析,它原来的结束是显示SDL_DisplayYUVOverlay(vp->bmp, &rect),而现在把它提前return了,它的调用关系video_refresh_timer->video_display->video_image_display, 调用完成之后,会立即处于后面的逻辑is->pictq_size--;,而这时在QT中正在COPY数据,COPY数据相对来说是比较慢的,在这个生产者与消费者模式下共享内存时,需要加一个同步机制,用于消费者还没有把数据完全COPY出来之前,生产者需要waiting.于是加了两个变量用于同步dts,pts,当dts>pts,让生产者ffplay waiting.
就这样,qt中用SDL渲染dvd subtile基本正常了。
subtitle_thread中加上lock防止dvd subtitle stream被update,但少数subtile还有点闪烁