[vlc-devel] [PATCH 08/27] opengl: load filters from command-line arguments
Alexandre Janniaux
ajanni at videolabs.io
Mon Jun 29 15:34:18 CEST 2020
Hi,
If we follow the convention for filters, it should be --gl-filter=
Regards,
--
Alexandre Janniaux
Videolabs
On Thu, Jun 25, 2020 at 02:22:55PM +0200, Romain Vimont wrote:
> Enable OpenGL filters via the --gl-filters command-line option:
>
> vlc file.mkv --gl-filters=filter1:filter2
>
> Co-authored-by: Alexandre Janniaux <ajanni at videolabs.io>
> ---
> modules/video_output/caopengllayer.m | 6 +-
> modules/video_output/ios.m | 9 ++-
> modules/video_output/macosx.m | 6 +-
> modules/video_output/opengl/display.c | 8 ++-
> modules/video_output/opengl/vout_helper.c | 76 +++++++++++++++++++----
> modules/video_output/opengl/vout_helper.h | 6 +-
> modules/video_output/win32/glwin32.c | 6 +-
> 7 files changed, 97 insertions(+), 20 deletions(-)
>
> diff --git a/modules/video_output/caopengllayer.m b/modules/video_output/caopengllayer.m
> index 16e8de1c36..c9772bd62a 100644
> --- a/modules/video_output/caopengllayer.m
> +++ b/modules/video_output/caopengllayer.m
> @@ -57,6 +57,7 @@ vlc_module_begin()
> set_category(CAT_VIDEO)
> set_subcategory(SUBCAT_VIDEO_VOUT)
> set_callback_display(Open, 0)
> + add_opengl_param_gl_filters()
>
> add_opengl_submodule_renderer()
> vlc_module_end()
> @@ -183,8 +184,11 @@ static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
>
> const vlc_fourcc_t *subpicture_chromas;
> if (!OpenglLock(sys->gl)) {
> + char *glfilters_config = var_InheritString(vd, "gl-filters");
> sys->vgl = vout_display_opengl_New(fmt, &subpicture_chromas,
> - sys->gl, &cfg->viewpoint, context);
> + sys->gl, &cfg->viewpoint,
> + context, glfilters_config);
> + free(glfilters_config);
> OpenglUnlock(sys->gl);
> } else
> sys->vgl = NULL;
> diff --git a/modules/video_output/ios.m b/modules/video_output/ios.m
> index 637a140146..1236bd7111 100644
> --- a/modules/video_output/ios.m
> +++ b/modules/video_output/ios.m
> @@ -77,6 +77,7 @@ vlc_module_begin ()
>
> add_shortcut("vout_ios2", "vout_ios")
> add_glopts()
> + add_opengl_param_gl_filters()
>
> add_opengl_submodule_renderer()
> vlc_module_end ()
> @@ -196,9 +197,11 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
> if (vlc_gl_MakeCurrent(sys->gl) != VLC_SUCCESS)
> goto bailout;
>
> - vout_display_opengl_t *vgl = vout_display_opengl_New(fmt, &subpicture_chromas,
> - sys->gl, &cfg->viewpoint,
> - context);
> + char *glfilters_config = var_InheritString(vd, "gl-filters");
> + vout_display_opengl_t *vgl =
> + vout_display_opengl_New(fmt, &subpicture_chromas, sys->gl,
> + &cfg->viewpoint, context, glfilters_config);
> + free(glfilters_config);
> vlc_gl_ReleaseCurrent(sys->gl);
> if (!vgl)
> goto bailout;
> diff --git a/modules/video_output/macosx.m b/modules/video_output/macosx.m
> index a714b59f6e..7a9fedd650 100644
> --- a/modules/video_output/macosx.m
> +++ b/modules/video_output/macosx.m
> @@ -79,6 +79,7 @@ vlc_module_begin ()
> set_callback_display(Open, 300)
> add_shortcut ("macosx", "vout_macosx")
> add_glopts ()
> + add_opengl_param_gl_filters()
>
> add_opengl_submodule_renderer()
> vlc_module_end ()
> @@ -228,8 +229,11 @@ static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
> msg_Err(vd, "Can't attach gl context");
> goto error;
> }
> + char *glfilters_config = var_InheritString(vd, "gl-filters");
> sys->vgl = vout_display_opengl_New (fmt, &subpicture_chromas, sys->gl,
> - &cfg->viewpoint, context);
> + &cfg->viewpoint, context,
> + glfilters_config);
> + free(glfilters_config);
> vlc_gl_ReleaseCurrent(sys->gl);
> if (!sys->vgl) {
> msg_Err(vd, "Error while initializing opengl display.");
> diff --git a/modules/video_output/opengl/display.c b/modules/video_output/opengl/display.c
> index b7f6b44f15..4e7346f764 100644
> --- a/modules/video_output/opengl/display.c
> +++ b/modules/video_output/opengl/display.c
> @@ -68,6 +68,7 @@ vlc_module_begin ()
> add_module("gl", "opengl", NULL, GL_TEXT, PROVIDER_LONGTEXT)
> #endif
> add_glopts ()
> + add_opengl_param_gl_filters()
>
> add_opengl_submodule_renderer()
> vlc_module_end ()
> @@ -138,8 +139,11 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
> if (vlc_gl_MakeCurrent (sys->gl))
> goto error;
>
> - sys->vgl = vout_display_opengl_New (fmt, &spu_chromas, sys->gl,
> - &cfg->viewpoint, context);
> + char *glfilters_config = var_InheritString(vd, "gl-filters");
> + sys->vgl = vout_display_opengl_New(fmt, &spu_chromas, sys->gl,
> + &cfg->viewpoint, context,
> + glfilters_config);
> + free(glfilters_config);
> vlc_gl_ReleaseCurrent (sys->gl);
>
> if (sys->vgl == NULL)
> diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
> index 22ca7350ea..47e078e532 100644
> --- a/modules/video_output/opengl/vout_helper.c
> +++ b/modules/video_output/opengl/vout_helper.c
> @@ -98,11 +98,72 @@ ResizeFormatToGLMaxTexSize(video_format_t *fmt, unsigned int max_tex_size)
> }
> }
>
> +static int
> +LoadFilters(vlc_gl_t *gl, struct vlc_gl_filters *filters,
> + const char *glfilters_config, struct vlc_gl_renderer **out_renderer)
> +{
> + struct vlc_gl_filter *renderer_filter = NULL;
> +
> + if (glfilters_config)
> + {
> + const char *string = glfilters_config;
> + char *next_module = NULL;
> + do
> + {
> + char *name;
> + config_chain_t *config = NULL;
> + char *leftover = config_ChainCreate(&name, &config, string);
> +
> + free(next_module);
> + next_module = leftover;
> + string = next_module; /* const view of next_module */
> +
> + if (name)
> + {
> + struct vlc_gl_filter *filter =
> + vlc_gl_filters_Append(filters, name, config);
> + config_ChainDestroy(config);
> + if (!filter)
> + {
> + msg_Err(gl, "Could not load GL filter: %s", name);
> + free(name);
> + return VLC_EGENERIC;
> + }
> +
> + if (!strcmp("renderer", name))
> + renderer_filter = filter;
> +
> + free(name);
> + }
> + } while (string);
> + }
> +
> + if (!renderer_filter)
> + {
> + /* Append a renderer at the end if it was not provided in the glfilters
> + * list */
> + renderer_filter =
> + vlc_gl_filters_Append(filters, "renderer", NULL);
> + if (!renderer_filter)
> + {
> + msg_Err(gl, "Could not load GL renderer");
> + return VLC_EGENERIC;
> + }
> + }
> +
> + /* The renderer is a special filter: we need its concrete instance to
> + * forward SetViewpoint() */
> + *out_renderer = renderer_filter->sys;
> +
> + return VLC_SUCCESS;
> +}
> +
> vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
> const vlc_fourcc_t **subpicture_chromas,
> vlc_gl_t *gl,
> const vlc_viewpoint_t *viewpoint,
> - vlc_video_context *context)
> + vlc_video_context *context,
> + const char *glfilters_config)
> {
> vout_display_opengl_t *vgl = calloc(1, sizeof(*vgl));
> if (!vgl)
> @@ -150,20 +211,13 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
> goto delete_interop;
> }
>
> - /* The renderer is the only filter, for now */
> - struct vlc_gl_filter *renderer_filter =
> - vlc_gl_filters_Append(vgl->filters, "renderer", NULL);
> - if (!renderer_filter)
> + ret = LoadFilters(gl, vgl->filters, glfilters_config, &vgl->renderer);
> + if (ret != VLC_SUCCESS)
> {
> - msg_Warn(gl, "Could not create renderer for %4.4s",
> - (const char *) &fmt->i_chroma);
> + msg_Err(gl, "Could not load filters: %s", glfilters_config);
> goto delete_filters;
> }
>
> - /* The renderer is a special filter: we need its concrete instance to
> - * forward SetViewpoint() */
> - vgl->renderer = renderer_filter->sys;
> -
> vgl->sub_interop = vlc_gl_interop_NewForSubpictures(gl, api);
> if (!vgl->sub_interop)
> {
> diff --git a/modules/video_output/opengl/vout_helper.h b/modules/video_output/opengl/vout_helper.h
> index 482eabb554..1d84201d94 100644
> --- a/modules/video_output/opengl/vout_helper.h
> +++ b/modules/video_output/opengl/vout_helper.h
> @@ -84,13 +84,17 @@
> add_module("glinterop", "glinterop", NULL, GLINTEROP_TEXT, GLINTEROP_LONGTEXT) \
> add_glopts_placebo ()
>
> +#define add_opengl_param_gl_filters() \
> + add_module_list("gl-filters", "opengl filter", NULL, "GL filters", "GL filters")
> +
> typedef struct vout_display_opengl_t vout_display_opengl_t;
>
> vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
> const vlc_fourcc_t **subpicture_chromas,
> vlc_gl_t *gl,
> const vlc_viewpoint_t *viewpoint,
> - vlc_video_context *context);
> + vlc_video_context *context,
> + const char *glfilters_config);
> void vout_display_opengl_Delete(vout_display_opengl_t *vgl);
>
> int vout_display_opengl_SetViewpoint(vout_display_opengl_t *vgl, const vlc_viewpoint_t*);
> diff --git a/modules/video_output/win32/glwin32.c b/modules/video_output/win32/glwin32.c
> index c09f543d84..3aebe25180 100644
> --- a/modules/video_output/win32/glwin32.c
> +++ b/modules/video_output/win32/glwin32.c
> @@ -54,6 +54,7 @@ vlc_module_begin()
> add_shortcut("glwin32", "opengl")
> set_callback_display(Open, 275)
> add_glopts()
> + add_opengl_param_gl_filters()
>
> add_opengl_submodule_renderer()
> vlc_module_end()
> @@ -153,8 +154,11 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
> const vlc_fourcc_t *subpicture_chromas;
> if (vlc_gl_MakeCurrent (sys->gl))
> goto error;
> + char *glfilters_config = var_InheritString(vd, "gl-filters");
> sys->vgl = vout_display_opengl_New(&fmt, &subpicture_chromas, sys->gl,
> - &cfg->viewpoint, context);
> + &cfg->viewpoint, context,
> + glfilters_config);
> + free(glfilters_config);
> vlc_gl_ReleaseCurrent (sys->gl);
> if (!sys->vgl)
> goto error;
> --
> 2.27.0
>
More information about the vlc-devel
mailing list