Commit 211b02b8 authored by Steve Lhomme's avatar Steve Lhomme
Browse files

video_output: use filter lock to change filters in the vout thread

We don't need to wait when enabling filters, it's OK if we miss the current
frame and apply it in the next loop iteration. The filter changes will
be applied just before the picture is rendered, only once between frames. It is
now done after the control pop deadline, so will eat some of the rendering
time.

We don't use the control lock anymore (from vout_control_PushString), just the
filters lock.

Now the filter changes are applied even in frame by frame mode.
parent 5b2129ed
......@@ -172,6 +172,8 @@ typedef struct vout_thread_sys_t
/* Video filter2 chain */
struct {
vlc_mutex_t lock;
bool changed;
char *new_filters;
char *configuration;
video_format_t src_fmt;
vlc_video_context *src_vctx;
......@@ -771,8 +773,22 @@ void vout_ControlChangeFilters(vout_thread_t *vout, const char *filters)
{
vout_thread_sys_t *sys = VOUT_THREAD_TO_SYS(vout);
assert(!sys->dummy);
vout_control_PushString(&sys->control, VOUT_CONTROL_CHANGE_FILTERS,
filters);
vlc_mutex_lock(&sys->filter.lock);
if (sys->filter.new_filters)
{
if (filters == NULL || strcmp(sys->filter.new_filters, filters))
{
free(sys->filter.new_filters);
sys->filter.new_filters = filters ? strdup(filters) : NULL;
sys->filter.changed = true;
}
}
else if (filters != NULL)
{
sys->filter.new_filters = strdup(filters);
sys->filter.changed = true;
}
vlc_mutex_unlock(&sys->filter.lock);
}
void vout_ControlChangeInterlacing(vout_thread_t *vout, bool set)
......@@ -1059,6 +1075,8 @@ static void ThreadChangeFilters(vout_thread_sys_t *vout,
sys->filter.configuration = filters ? strdup(filters) : NULL;
}
sys->filter.changed = false;
if (!is_locked)
vlc_mutex_unlock(&sys->filter.lock);
}
......@@ -1474,6 +1492,13 @@ static int ThreadDisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
assert(sys->clock);
vlc_mutex_lock(&sys->filter.lock);
if (sys->filter.changed)
{
ThreadChangeFilters(vout, sys->filter.new_filters, NULL, true);
}
vlc_mutex_unlock(&sys->filter.lock);
if (first)
if (ThreadDisplayPreparePicture(vout, true, frame_by_frame, &paused)) /* FIXME not sure it is ok */
return VLC_EGENERIC;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment