[vlc-devel] [PATCH v3 05/18] video_output: use filter lock to change filters in the vout thread
Steve Lhomme
robux4 at ycbcr.xyz
Tue Aug 18 16:58:32 CEST 2020
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.
We don't use the control lock anymore, just the filters lock.
Now the filter changes are applied even in frame by frame mode.
Remove related control push/clean functions.
---
src/video_output/control.c | 26 --------------------------
src/video_output/control.h | 4 ----
src/video_output/video_output.c | 33 +++++++++++++++++++++++++++------
3 files changed, 27 insertions(+), 36 deletions(-)
diff --git a/src/video_output/control.c b/src/video_output/control.c
index b4a9a71165f..af1a714dc48 100644
--- a/src/video_output/control.c
+++ b/src/video_output/control.c
@@ -36,17 +36,6 @@ void vout_control_cmd_Init(vout_control_cmd_t *cmd, int type)
cmd->type = type;
}
-void vout_control_cmd_Clean(vout_control_cmd_t *cmd)
-{
- switch (cmd->type) {
- case VOUT_CONTROL_CHANGE_FILTERS:
- free(cmd->string);
- break;
- default:
- break;
- }
-}
-
/* */
void vout_control_Init(vout_control_t *ctrl)
{
@@ -64,10 +53,6 @@ void vout_control_Init(vout_control_t *ctrl)
void vout_control_Clean(vout_control_t *ctrl)
{
/* */
- for (int i = 0; i < ctrl->cmd.i_size; i++) {
- vout_control_cmd_t cmd = ARRAY_VAL(ctrl->cmd, i);
- vout_control_cmd_Clean(&cmd);
- }
ARRAY_RESET(ctrl->cmd);
}
@@ -84,8 +69,6 @@ void vout_control_Push(vout_control_t *ctrl, vout_control_cmd_t *cmd)
if (!ctrl->is_dead) {
ARRAY_APPEND(ctrl->cmd, *cmd);
vlc_cond_signal(&ctrl->wait_request);
- } else {
- vout_control_cmd_Clean(cmd);
}
vlc_mutex_unlock(&ctrl->lock);
}
@@ -114,15 +97,6 @@ void vout_control_PushBool(vout_control_t *ctrl, int type, bool boolean)
vout_control_Push(ctrl, &cmd);
}
-void vout_control_PushString(vout_control_t *ctrl, int type, const char *string)
-{
- vout_control_cmd_t cmd;
-
- vout_control_cmd_Init(&cmd, type);
- cmd.string = string ? strdup(string) : NULL;
- vout_control_Push(ctrl, &cmd);
-}
-
void vout_control_Hold(vout_control_t *ctrl)
{
vlc_mutex_lock(&ctrl->lock);
diff --git a/src/video_output/control.h b/src/video_output/control.h
index eee86c4ca93..ed4613d6c14 100644
--- a/src/video_output/control.h
+++ b/src/video_output/control.h
@@ -28,7 +28,6 @@
/* */
enum {
VOUT_CONTROL_TERMINATE,
- VOUT_CONTROL_CHANGE_FILTERS, /* string */
VOUT_CONTROL_CHANGE_INTERLACE, /* boolean */
VOUT_CONTROL_MOUSE_STATE, /* vlc_mouse_t */
@@ -39,13 +38,11 @@ typedef struct {
union {
bool boolean;
- char *string;
vlc_mouse_t mouse;
};
} vout_control_cmd_t;
void vout_control_cmd_Init(vout_control_cmd_t *, int type);
-void vout_control_cmd_Clean(vout_control_cmd_t *);
typedef struct {
vlc_mutex_t lock;
@@ -70,7 +67,6 @@ void vout_control_WaitEmpty(vout_control_t *);
void vout_control_Push(vout_control_t *, vout_control_cmd_t *);
void vout_control_PushVoid(vout_control_t *, int type);
void vout_control_PushBool(vout_control_t *, int type, bool boolean);
-void vout_control_PushString(vout_control_t *, int type, const char *string);
void vout_control_Wake(vout_control_t *);
void vout_control_Hold(vout_control_t *);
void vout_control_Release(vout_control_t *);
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index c95fd0dfa74..2ac85f43af3 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -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;
@@ -717,8 +719,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)
@@ -1087,6 +1103,8 @@ static int ThreadDisplayPreparePicture(vout_thread_sys_t *vout, bool reuse,
picture = filter_chain_VideoFilter(sys->filter.chain_static, decoded);
}
+ sys->filter.changed = false;
+
vlc_mutex_unlock(&sys->filter.lock);
if (!picture)
@@ -1413,6 +1431,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;
@@ -1829,9 +1854,6 @@ static void *Thread(void *object)
switch(cmd.type) {
case VOUT_CONTROL_TERMINATE:
return NULL; /* no need to clean &cmd */
- case VOUT_CONTROL_CHANGE_FILTERS:
- ThreadChangeFilters(vout, cmd.string, NULL, false);
- break;
case VOUT_CONTROL_CHANGE_INTERLACE:
ThreadChangeFilters(vout, NULL, &cmd.boolean, false);
break;
@@ -1839,7 +1861,6 @@ static void *Thread(void *object)
ThreadProcessMouseState(vout, &cmd.mouse);
break;
}
- vout_control_cmd_Clean(&cmd);
}
deadline = VLC_TICK_INVALID;
--
2.26.2
More information about the vlc-devel
mailing list