[vlc-devel] [PATCH 2/5] vout: lock only when needed
Steve Lhomme
robux4 at ycbcr.xyz
Mon Jun 3 15:56:59 CEST 2019
On 2019-06-03 15:41, Thomas Guillem wrote:
> ---
> src/video_output/video_output.c | 72 +++++++++++++++++++++------------
> 1 file changed, 47 insertions(+), 25 deletions(-)
>
> diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
> index d9f91e9e68..0a89f11651 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -259,12 +259,14 @@ void vout_PutSubpicture( vout_thread_t *vout, subpicture_t *subpic )
> vout_thread_sys_t *sys = vout->p;
> assert(!sys->dummy);
>
> - vlc_mutex_lock(&sys->spu_lock);
> if (sys->spu != NULL)
> + {
> + vlc_mutex_lock(&sys->spu_lock);
> spu_PutSubpicture(sys->spu, subpic);
> + vlc_mutex_unlock(&sys->spu_lock);
> + }
> else
> subpicture_Delete(subpic);
> - vlc_mutex_unlock(&sys->spu_lock);
> }
>
> int vout_RegisterSubpictureChannel( vout_thread_t *vout )
> @@ -272,10 +274,12 @@ int vout_RegisterSubpictureChannel( vout_thread_t *vout )
> assert(!vout->p->dummy);
> int channel = VOUT_SPU_CHANNEL_AVAIL_FIRST;
>
> - vlc_mutex_lock(&vout->p->spu_lock);
> if (vout->p->spu)
> + {
> + vlc_mutex_lock(&vout->p->spu_lock);
> channel = spu_RegisterChannel(vout->p->spu);
> - vlc_mutex_unlock(&vout->p->spu_lock);
> + vlc_mutex_unlock(&vout->p->spu_lock);
> + }
>
> return channel;
> }
> @@ -283,10 +287,12 @@ int vout_RegisterSubpictureChannel( vout_thread_t *vout )
> void vout_SetSubpictureClock( vout_thread_t *vout, vlc_clock_t *clock )
> {
> assert(!vout->p->dummy);
> - vlc_mutex_lock(&vout->p->spu_lock);
> if (vout->p->spu)
> + {
> + vlc_mutex_lock(&vout->p->spu_lock);
> spu_clock_Set(vout->p->spu, clock);
> - vlc_mutex_unlock(&vout->p->spu_lock);
> + vlc_mutex_unlock(&vout->p->spu_lock);
> + }
> }
>
> void vout_FlushSubpictureChannel( vout_thread_t *vout, int channel )
> @@ -294,20 +300,24 @@ void vout_FlushSubpictureChannel( vout_thread_t *vout, int channel )
> vout_thread_sys_t *sys = vout->p;
> assert(!sys->dummy);
>
> - vlc_mutex_lock(&sys->spu_lock);
> if (sys->spu != NULL)
> + {
> + vlc_mutex_lock(&sys->spu_lock);
> spu_ClearChannel(vout->p->spu, channel);
> - vlc_mutex_unlock(&sys->spu_lock);
> + vlc_mutex_unlock(&sys->spu_lock);
> + }
> }
>
> void vout_SetSpuHighlight( vout_thread_t *vout,
> const vlc_spu_highlight_t *spu_hl )
> {
> assert(!vout->p->dummy);
> - vlc_mutex_lock(&vout->p->spu_lock);
> if (vout->p->spu)
> + {
> + vlc_mutex_lock(&vout->p->spu_lock);
> spu_SetHighlight(vout->p->spu, spu_hl);
> - vlc_mutex_unlock(&vout->p->spu_lock);
> + vlc_mutex_unlock(&vout->p->spu_lock);
> + }
> }
>
> /**
> @@ -583,19 +593,23 @@ void vout_ControlChangeFilters(vout_thread_t *vout, const char *filters)
> void vout_ControlChangeSubSources(vout_thread_t *vout, const char *filters)
> {
> assert(!vout->p->dummy);
> - vlc_mutex_lock(&vout->p->spu_lock);
> if (likely(vout->p->spu != NULL))
> + {
> + vlc_mutex_lock(&vout->p->spu_lock);
> spu_ChangeSources(vout->p->spu, filters);
> - vlc_mutex_unlock(&vout->p->spu_lock);
> + vlc_mutex_unlock(&vout->p->spu_lock);
> + }
> }
>
> void vout_ControlChangeSubFilters(vout_thread_t *vout, const char *filters)
> {
> assert(!vout->p->dummy);
> - vlc_mutex_lock(&vout->p->spu_lock);
> if (likely(vout->p->spu != NULL))
> + {
> + vlc_mutex_lock(&vout->p->spu_lock);
> spu_ChangeFilters(vout->p->spu, filters);
> - vlc_mutex_unlock(&vout->p->spu_lock);
> + vlc_mutex_unlock(&vout->p->spu_lock);
> + }
> }
>
> void vout_ChangeSubMargin(vout_thread_t *vout, int margin)
> @@ -1070,7 +1084,8 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
>
> video_format_t fmt_spu_rot;
> video_format_ApplyRotation(&fmt_spu_rot, &fmt_spu);
> - subpicture_t *subpic = spu_Render(sys->spu,
> + subpicture_t *subpic = !sys->spu ? NULL
> + : spu_Render(sys->spu,
> subpicture_chromas, &fmt_spu_rot,
> &vd->source, system_now,
> render_subtitle_date, sys->spu_rate,
> @@ -1306,13 +1321,13 @@ static void vout_FlushUnlocked(vout_thread_t *vout, bool below,
> vlc_clock_Reset(vout->p->clock);
> vlc_clock_SetDelay(vout->p->clock, vout->p->delay);
>
> - vlc_mutex_lock(&vout->p->spu_lock);
> if (vout->p->spu)
> {
> + vlc_mutex_lock(&vout->p->spu_lock);
> spu_clock_Reset(vout->p->spu);
> spu_clock_SetDelay(vout->p->spu, vout->p->spu_delay);
> + vlc_mutex_unlock(&vout->p->spu_lock);
Apart from this one that makes 2 calls (non atomic), all the others seem
to be equivalent to the lock that already exists in the spu. Maybe one
of them can be removed ?
> }
> - vlc_mutex_unlock(&vout->p->spu_lock);
> }
>
> void vout_Flush(vout_thread_t *vout, vlc_tick_t date)
> @@ -1373,19 +1388,24 @@ void vout_ChangeRate(vout_thread_t *vout, float rate)
> void vout_ChangeSpuDelay(vout_thread_t *vout, vlc_tick_t delay)
> {
> assert(!vout->p->dummy);
> - vlc_mutex_lock(&vout->p->spu_lock);
> if (vout->p->spu)
> + {
> + vlc_mutex_lock(&vout->p->spu_lock);
> spu_clock_SetDelay(vout->p->spu, delay);
> - vout->p->spu_delay = delay;
> - vlc_mutex_unlock(&vout->p->spu_lock);
> + vout->p->spu_delay = delay;
> + vlc_mutex_unlock(&vout->p->spu_lock);
> + }
> }
>
> void vout_ChangeSpuRate(vout_thread_t *vout, float rate)
> {
> assert(!vout->p->dummy);
> - vlc_mutex_lock(&vout->p->spu_lock);
> - vout->p->spu_rate = rate;
> - vlc_mutex_unlock(&vout->p->spu_lock);
> + if (vout->p->spu)
> + {
> + vlc_mutex_lock(&vout->p->spu_lock);
> + vout->p->spu_rate = rate;
> + vlc_mutex_unlock(&vout->p->spu_lock);
> + }
This change doesn't seem necessary. If the goal is to protect the
variable maybe it could be a vlc_atomic_float ?
> }
>
> static void ThreadProcessMouseState(vout_thread_t *vout,
> @@ -1725,10 +1745,12 @@ void vout_Close(vout_thread_t *vout)
> vout_control_Dead(&sys->control);
> vout_chrono_Clean(&sys->render);
>
> - vlc_mutex_lock(&sys->spu_lock);
> if (sys->spu)
> + {
> + vlc_mutex_lock(&sys->spu_lock);
> spu_Destroy(sys->spu);
> - vlc_mutex_unlock(&sys->spu_lock);
> + vlc_mutex_unlock(&sys->spu_lock);
> + }
>
> vout_Release(vout);
> }
> --
> 2.20.1
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
>
More information about the vlc-devel
mailing list