[vlc-devel] [PATCH] opengl: split interop constructor for subpictures
Romain Vimont
rom1v at videolabs.io
Wed Jun 17 21:35:18 CEST 2020
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
More information about the vlc-devel
mailing list