vlc | branch: master | Romain Vimont <[email protected]> | Tue Jul 7 12:33:51 2020 +0200| [6ca9b311e89468ad5ab2c82c97c2d52d79b3330e] | committer: Alexandre Janniaux
opengl: pass output size to filters A filter may need to specify a different output size. The input size is accessible via the sampler. Co-authored-by: Alexandre Janniaux <[email protected]> Signed-off-by: Alexandre Janniaux <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6ca9b311e89468ad5ab2c82c97c2d52d79b3330e --- modules/video_output/opengl/filter.c | 9 +++++++-- modules/video_output/opengl/filter.h | 6 ++++++ modules/video_output/opengl/filter_priv.h | 6 ++++-- modules/video_output/opengl/filters.c | 23 +++++++++++++++++++---- modules/video_output/opengl/renderer.c | 2 ++ 5 files changed, 38 insertions(+), 8 deletions(-) diff --git a/modules/video_output/opengl/filter.c b/modules/video_output/opengl/filter.c index c4ba0bfb71..80a0459be9 100644 --- a/modules/video_output/opengl/filter.c +++ b/modules/video_output/opengl/filter.c @@ -41,6 +41,8 @@ vlc_gl_filter_New(vlc_object_t *parent, const struct vlc_gl_api *api) return NULL; priv->sampler = NULL; + priv->size_out.width = 0; + priv->size_out.height = 0; struct vlc_gl_filter *filter = &priv->filter; filter->api = api; @@ -58,9 +60,10 @@ ActivateGLFilter(void *func, bool forced, va_list args) vlc_gl_filter_open_fn *activate = func; struct vlc_gl_filter *filter = va_arg(args, struct vlc_gl_filter *); const config_chain_t *config = va_arg(args, config_chain_t *); + struct vlc_gl_tex_size *size_out = va_arg(args, struct vlc_gl_tex_size *); struct vlc_gl_sampler *sampler = va_arg(args, struct vlc_gl_sampler *); - return activate(filter, config, sampler); + return activate(filter, config, size_out, sampler); } #undef vlc_gl_filter_LoadModule @@ -68,10 +71,12 @@ int vlc_gl_filter_LoadModule(vlc_object_t *parent, const char *name, struct vlc_gl_filter *filter, const config_chain_t *config, + struct vlc_gl_tex_size *size_out, struct vlc_gl_sampler *sampler) { filter->module = vlc_module_load(parent, "opengl filter", name, true, - ActivateGLFilter, filter, config, sampler); + ActivateGLFilter, filter, config, size_out, + sampler); if (!filter->module) return VLC_EGENERIC; diff --git a/modules/video_output/opengl/filter.h b/modules/video_output/opengl/filter.h index 8d10002aaa..f6dbd3db23 100644 --- a/modules/video_output/opengl/filter.h +++ b/modules/video_output/opengl/filter.h @@ -26,9 +26,15 @@ struct vlc_gl_filter; +struct vlc_gl_tex_size { + unsigned width; + unsigned height; +}; + typedef int vlc_gl_filter_open_fn(struct vlc_gl_filter *filter, const config_chain_t *config, + struct vlc_gl_tex_size *size_out, struct vlc_gl_sampler *sampler); struct vlc_gl_filter_ops { diff --git a/modules/video_output/opengl/filter_priv.h b/modules/video_output/opengl/filter_priv.h index 365ebd0fa9..50134faf50 100644 --- a/modules/video_output/opengl/filter_priv.h +++ b/modules/video_output/opengl/filter_priv.h @@ -30,6 +30,7 @@ struct vlc_gl_filter_priv { struct vlc_gl_filter filter; + struct vlc_gl_tex_size size_out; struct vlc_gl_sampler *sampler; /* owned */ struct vlc_list node; /**< node of vlc_gl_filters.list */ @@ -46,9 +47,10 @@ int vlc_gl_filter_LoadModule(vlc_object_t *parent, const char *name, struct vlc_gl_filter *filter, const config_chain_t *config, + struct vlc_gl_tex_size *size_out, struct vlc_gl_sampler *sampler); -#define vlc_gl_filter_LoadModule(o, a, b, c, d) \ - vlc_gl_filter_LoadModule(VLC_OBJECT(o), a, b, c, d) +#define vlc_gl_filter_LoadModule(o, a, b, c, d, e) \ + vlc_gl_filter_LoadModule(VLC_OBJECT(o), a, b, c, d, e) void vlc_gl_filter_Delete(struct vlc_gl_filter *filter); diff --git a/modules/video_output/opengl/filters.c b/modules/video_output/opengl/filters.c index 02a2a076ac..47c222f533 100644 --- a/modules/video_output/opengl/filters.c +++ b/modules/video_output/opengl/filters.c @@ -83,14 +83,25 @@ vlc_gl_filters_Append(struct vlc_gl_filters *filters, const char *name, struct vlc_gl_filter_priv *priv = vlc_gl_filter_PRIV(filter); - bool first_filter = vlc_list_is_empty(&filters->list); - if (first_filter) + struct vlc_gl_tex_size size_in; + + struct vlc_gl_filter_priv *prev_filter = + vlc_list_last_entry_or_null(&filters->list, struct vlc_gl_filter_priv, + node); + if (!prev_filter) + { + size_in.width = filters->interop->fmt_out.i_visible_width; + size_in.height = filters->interop->fmt_out.i_visible_height; priv->sampler = vlc_gl_sampler_NewFromInterop(filters->interop); + } else { + size_in = prev_filter->size_out; + video_format_t fmt; video_format_Init(&fmt, VLC_CODEC_RGBA); - // TODO set format width/height + fmt.i_width = fmt.i_visible_width = size_in.width; + fmt.i_height = fmt.i_visible_height = size_in.height; priv->sampler = vlc_gl_sampler_NewFromTexture2D(filters->gl, filters->api, &fmt); @@ -102,8 +113,12 @@ vlc_gl_filters_Append(struct vlc_gl_filters *filters, const char *name, return NULL; } + /* By default, the output size is the same as the input size. The filter + * may change it during its Open(). */ + priv->size_out = size_in; + int ret = vlc_gl_filter_LoadModule(filters->gl, name, filter, config, - priv->sampler); + &priv->size_out, priv->sampler); if (ret != VLC_SUCCESS) { /* Creation failed, do not call close() */ diff --git a/modules/video_output/opengl/renderer.c b/modules/video_output/opengl/renderer.c index 76f4e5378b..6eca51692e 100644 --- a/modules/video_output/opengl/renderer.c +++ b/modules/video_output/opengl/renderer.c @@ -333,9 +333,11 @@ Draw(struct vlc_gl_filter *filter); int vlc_gl_renderer_Open(struct vlc_gl_filter *filter, const config_chain_t *config, + struct vlc_gl_tex_size *size_out, struct vlc_gl_sampler *sampler) { (void) config; + (void) size_out; const opengl_vtable_t *vt = &filter->api->vt; const video_format_t *fmt = &sampler->fmt; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
