[vlc-devel] [PATCH] opengl: split interop constructor for subpictures

Romain Vimont rom1v at videolabs.io
Thu Jun 18 11:17:35 CEST 2020


On Thu, Jun 18, 2020 at 10:15:03AM +0200, Alexandre Janniaux wrote:
> Hi,
> 
> I don't have any issues with this patch being merged in order
> to ease the rest of your patchset, but having a single interop
> for multiple pictures (eg. a subpicture) at the same time looks
> against the original design.

There is one interop for video pictures (the renderer/filters) and one
interop for (all) subpictures (the sub_renderer).

This was already the case in VLC3: there was one opengl_tex_converter_t
instance per "struct prgm", and there were 2 prgm instances (the main
program and the subpicture program). I did not change that.

> 
> Regards,
> --
> Alexandre Janniaux
> Videolabs
> 
> On Wed, Jun 17, 2020 at 09:35:18PM +0200, Romain Vimont wrote:
> > Expose a separate "constructor" for creating an interop used for
> > subpictures.
> >
> > This avoids a "subpics" flag, and make explicit that context and fmt are
> > not used for SPU.
> > ---
> >  modules/video_output/opengl/interop.c     | 80 +++++++++++++----------
> >  modules/video_output/opengl/interop.h     |  7 +-
> >  modules/video_output/opengl/vout_helper.c |  4 +-
> >  3 files changed, 52 insertions(+), 39 deletions(-)
> >
> > diff --git a/modules/video_output/opengl/interop.c b/modules/video_output/opengl/interop.c
> > index 8bd71110dc73..07f8c0c950c9 100644
> > --- a/modules/video_output/opengl/interop.c
> > +++ b/modules/video_output/opengl/interop.c
> > @@ -31,8 +31,7 @@
> >
> >  struct vlc_gl_interop *
> >  vlc_gl_interop_New(struct vlc_gl_t *gl, const struct vlc_gl_api *api,
> > -                   vlc_video_context *context, const video_format_t *fmt,
> > -                   bool subpics)
> > +                   vlc_video_context *context, const video_format_t *fmt)
> >  {
> >      struct vlc_gl_interop *interop = vlc_object_create(gl, sizeof(*interop));
> >      if (!interop)
> > @@ -48,46 +47,57 @@ vlc_gl_interop_New(struct vlc_gl_t *gl, const struct vlc_gl_api *api,
> >      interop->api = api;
> >      interop->vt = &api->vt;
> >
> > -    int ret;
> > -    if (subpics)
> > +    const vlc_chroma_description_t *desc =
> > +        vlc_fourcc_GetChromaDescription(fmt->i_chroma);
> > +
> > +    if (desc == NULL)
> >      {
> > -        interop->fmt.i_chroma = VLC_CODEC_RGB32;
> > -        /* Normal orientation and no projection for subtitles */
> > -        interop->fmt.orientation = ORIENT_NORMAL;
> > -        interop->fmt.projection_mode = PROJECTION_MODE_RECTANGULAR;
> > -        interop->fmt.primaries = COLOR_PRIMARIES_UNDEF;
> > -        interop->fmt.transfer = TRANSFER_FUNC_UNDEF;
> > -        interop->fmt.space = COLOR_SPACE_UNDEF;
> > -
> > -        ret = opengl_interop_generic_init(interop, false);
> > +        vlc_object_delete(interop);
> > +        return NULL;
> >      }
> > -    else
> > +    if (desc->plane_count == 0)
> >      {
> > -        const vlc_chroma_description_t *desc =
> > -            vlc_fourcc_GetChromaDescription(fmt->i_chroma);
> > +        /* Opaque chroma: load a module to handle it */
> > +        interop->vctx = context;
> > +        interop->module = module_need_var(interop, "glinterop", "glinterop");
> > +    }
> >
> > -        if (desc == NULL)
> > -        {
> > -            vlc_object_delete(interop);
> > -            return NULL;
> > -        }
> > -        if (desc->plane_count == 0)
> > -        {
> > -            /* Opaque chroma: load a module to handle it */
> > -            interop->vctx = context;
> > -            interop->module = module_need_var(interop, "glinterop", "glinterop");
> > -        }
> > +    int ret;
> > +    if (interop->module != NULL)
> > +        ret = VLC_SUCCESS;
> > +    else
> > +    {
> > +        /* Software chroma or gl hw converter failed: use a generic
> > +         * converter */
> > +        ret = opengl_interop_generic_init(interop, true);
> > +    }
> >
> > -        if (interop->module != NULL)
> > -            ret = VLC_SUCCESS;
> > -        else
> > -        {
> > -            /* Software chroma or gl hw converter failed: use a generic
> > -             * converter */
> > -            ret = opengl_interop_generic_init(interop, true);
> > -        }
> > +    if (ret != VLC_SUCCESS)
> > +    {
> > +        vlc_object_delete(interop);
> > +        return NULL;
> >      }
> >
> > +    return interop;
> > +}
> > +
> > +struct vlc_gl_interop *
> > +vlc_gl_interop_NewForSubpictures(struct vlc_gl_t *gl,
> > +                                 const struct vlc_gl_api *api)
> > +{
> > +    struct vlc_gl_interop *interop = vlc_object_create(gl, sizeof(*interop));
> > +    if (!interop)
> > +        return NULL;
> > +
> > +    interop->init = opengl_interop_init_impl;
> > +    interop->ops = NULL;
> > +    interop->gl = gl;
> > +    interop->api = api;
> > +    interop->vt = &api->vt;
> > +
> > +    video_format_Init(&interop->fmt, VLC_CODEC_RGB32);
> > +
> > +    int ret = opengl_interop_generic_init(interop, false);
> >      if (ret != VLC_SUCCESS)
> >      {
> >          vlc_object_delete(interop);
> > diff --git a/modules/video_output/opengl/interop.h b/modules/video_output/opengl/interop.h
> > index 4288da3f2581..9133b681eaa3 100644
> > --- a/modules/video_output/opengl/interop.h
> > +++ b/modules/video_output/opengl/interop.h
> > @@ -153,8 +153,11 @@ struct vlc_gl_interop {
> >
> >  struct vlc_gl_interop *
> >  vlc_gl_interop_New(struct vlc_gl_t *gl, const struct vlc_gl_api *api,
> > -                   vlc_video_context *context, const video_format_t *fmt,
> > -                   bool subpics);
> > +                   vlc_video_context *context, const video_format_t *fmt);
> > +
> > +struct vlc_gl_interop *
> > +vlc_gl_interop_NewForSubpictures(struct vlc_gl_t *gl,
> > +                                 const struct vlc_gl_api *api);
> >
> >  void
> >  vlc_gl_interop_Delete(struct vlc_gl_interop *interop);
> > diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
> > index 5e4ef90213af..526edcb23f2a 100644
> > --- a/modules/video_output/opengl/vout_helper.c
> > +++ b/modules/video_output/opengl/vout_helper.c
> > @@ -133,7 +133,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
> >          (GLint)fmt->i_height > max_tex_size)
> >          ResizeFormatToGLMaxTexSize(fmt, max_tex_size);
> >
> > -    vgl->interop = vlc_gl_interop_New(gl, api, context, fmt, false);
> > +    vgl->interop = vlc_gl_interop_New(gl, api, context, fmt);
> >      if (!vgl->interop)
> >      {
> >          msg_Err(gl, "Could not create interop");
> > @@ -157,7 +157,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
> >
> >      GL_ASSERT_NOERROR(vt);
> >
> > -    vgl->sub_interop = vlc_gl_interop_New(gl, api, NULL, fmt, true);
> > +    vgl->sub_interop = vlc_gl_interop_NewForSubpictures(gl, api);
> >      if (!vgl->sub_interop)
> >      {
> >          msg_Err(gl, "Could not create sub interop");
> > --
> > 2.27.0
> >
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list