vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Jan 27 16:26:20 2019 +0200| [ad90abe6751f1de0ada8b4720d1ab078621fa407] | committer: Rémi Denis-Courmont
vout: flush SPU channel on calling thread There is a mixture of subpicture-related calls, with some running on the calling thread, and others running on the video output thread control loop. The later may be delayed, depending on other video output thread processing, sleeping and pending control requests. This leads to a race condition, and potentially inconsistent ordering of calls on the SPU instance. This patch runs vout_FlushSubpictureChannel() directly on the calling thread and adds a missing check for nonexistent/destroyed SPU. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ad90abe6751f1de0ada8b4720d1ab078621fa407 --- src/video_output/control.h | 1 - src/video_output/video_output.c | 18 ++++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/video_output/control.h b/src/video_output/control.h index 0bb2c2397b..b6b982289a 100644 --- a/src/video_output/control.h +++ b/src/video_output/control.h @@ -34,7 +34,6 @@ enum { VOUT_CONTROL_START, VOUT_CONTROL_STOP, #endif - VOUT_CONTROL_FLUSH_SUBPICTURE, /* integer */ VOUT_CONTROL_CHANGE_FILTERS, /* string */ VOUT_CONTROL_CHANGE_INTERLACE, /* boolean */ diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index 2e3fad4559..b3fe1faf14 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -267,11 +267,17 @@ int vout_RegisterSubpictureChannel( vout_thread_t *vout ) return channel; } + void vout_FlushSubpictureChannel( vout_thread_t *vout, int channel ) { - vout_control_PushInteger(&vout->p->control, VOUT_CONTROL_FLUSH_SUBPICTURE, - channel); + vout_thread_sys_t *sys = vout->p; + + vlc_mutex_lock(&sys->spu_lock); + if (sys->spu != NULL) + spu_ClearChannel(vout->p->spu, channel); + vlc_mutex_unlock(&sys->spu_lock); } + void vout_SetSpuHighlight( vout_thread_t *vout, const vlc_spu_highlight_t *spu_hl ) { @@ -1185,11 +1191,6 @@ static int ThreadDisplayPicture(vout_thread_t *vout, vlc_tick_t *deadline) return force_refresh ? VLC_EGENERIC : ret; } -static void ThreadFlushSubpicture(vout_thread_t *vout, int channel) -{ - spu_ClearChannel(vout->p->spu, channel); -} - void vout_ChangePause(vout_thread_t *vout, bool is_paused, vlc_tick_t date) { vout_control_Hold(&vout->p->control); @@ -1478,9 +1479,6 @@ static int ThreadControl(vout_thread_t *vout, vout_control_cmd_t cmd) case VOUT_CONTROL_CLEAN: ThreadStop(vout); return 1; - case VOUT_CONTROL_FLUSH_SUBPICTURE: - ThreadFlushSubpicture(vout, cmd.integer); - break; case VOUT_CONTROL_CHANGE_FILTERS: ThreadChangeFilters(vout, NULL, cmd.string != NULL ? _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
