[vlc-devel] [PATCH 2/5] vout: lock only when needed
Thomas Guillem
thomas at gllm.fr
Mon Jun 3 15:41:33 CEST 2019
---
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);
}
- 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);
+ }
}
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
More information about the vlc-devel
mailing list