From b8c1ecf268e1b95d02f65ab98c6ad689ddc1a71a Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Tue, 10 Nov 2015 13:52:30 +1100 Subject: [PATCH] glviewconvert: remove set_format We need the caps to be able to 1. check the caps features 2. get the requested texture-target on input/output --- ext/gl/gstglimagesink.c | 29 +++++++++++++++++++++++------ ext/gl/gstglimagesink.h | 1 + ext/gl/gstglstereomix.c | 12 +++++++++--- gst-libs/gst/gl/gstglviewconvert.c | 7 +++---- gst-libs/gst/gl/gstglviewconvert.h | 2 -- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/ext/gl/gstglimagesink.c b/ext/gl/gstglimagesink.c index fa3c894..92a8a32 100644 --- a/ext/gl/gstglimagesink.c +++ b/ext/gl/gstglimagesink.c @@ -1005,6 +1005,10 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition) gst_caps_unref (glimage_sink->out_caps); glimage_sink->out_caps = NULL; } + if (glimage_sink->in_caps) { + gst_caps_unref (glimage_sink->in_caps); + glimage_sink->in_caps = NULL; + } break; } case GST_STATE_CHANGE_READY_TO_NULL: @@ -1172,6 +1176,7 @@ update_output_format (GstGLImageSink * glimage_sink) gboolean input_is_mono = FALSE; GstVideoMultiviewMode mv_mode; GstGLWindow *window = NULL; + GstCaps *out_caps; gboolean ret; *out_info = glimage_sink->in_info; @@ -1213,15 +1218,28 @@ update_output_format (GstGLImageSink * glimage_sink) glimage_sink->out_info.height = MAX (1, glimage_sink->display_rect.h); GST_LOG_OBJECT (glimage_sink, "Set 3D output scale to %d,%d", glimage_sink->display_rect.w, glimage_sink->display_rect.h); + } + + out_caps = gst_video_info_to_caps (out_info); + gst_caps_set_features (out_caps, 0, + gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY)); + + if (glimage_sink->convert_views) { + gst_caps_set_simple (out_caps, "texture-target", G_TYPE_STRING, + GST_GL_TEXTURE_TARGET_2D_STR, NULL); GST_GLIMAGE_SINK_UNLOCK (glimage_sink); - gst_gl_view_convert_set_format (glimage_sink->convert_views, - &glimage_sink->in_info, &glimage_sink->out_info); + gst_gl_view_convert_set_caps (glimage_sink->convert_views, + glimage_sink->in_caps, out_caps); g_object_set (glimage_sink->convert_views, "downmix-mode", glimage_sink->mview_downmix_mode, NULL); GST_GLIMAGE_SINK_LOCK (glimage_sink); } + if (glimage_sink->out_caps) + gst_caps_unref (glimage_sink->out_caps); + glimage_sink->out_caps = out_caps; + glimage_sink->output_mode_changed = FALSE; if (glimage_sink->context) @@ -1231,10 +1249,6 @@ update_output_format (GstGLImageSink * glimage_sink) gst_object_unref (window); } - if (glimage_sink->out_caps) - gst_caps_unref (glimage_sink->out_caps); - glimage_sink->out_caps = gst_video_info_to_caps (out_info); - return ret; } @@ -1257,6 +1271,9 @@ gst_glimage_sink_set_caps (GstBaseSink * bsink, GstCaps * caps) return FALSE; GST_GLIMAGE_SINK_LOCK (glimage_sink); + if (glimage_sink->in_caps) + gst_caps_unref (glimage_sink->in_caps); + glimage_sink->in_caps = gst_caps_ref (caps); glimage_sink->in_info = vinfo; ok = update_output_format (glimage_sink); diff --git a/ext/gl/gstglimagesink.h b/ext/gl/gstglimagesink.h index f7b3bfb..139c04a 100644 --- a/ext/gl/gstglimagesink.h +++ b/ext/gl/gstglimagesink.h @@ -64,6 +64,7 @@ struct _GstGLImageSink /* Input info before 3d stereo output conversion, if any */ GstVideoInfo in_info; + GstCaps *in_caps; /* format/caps we actually hand off to the app */ GstVideoInfo out_info; diff --git a/ext/gl/gstglstereomix.c b/ext/gl/gstglstereomix.c index 7b24739..c342a23 100644 --- a/ext/gl/gstglstereomix.c +++ b/ext/gl/gstglstereomix.c @@ -483,6 +483,7 @@ static gboolean _negotiated_caps (GstVideoAggregator * vagg, GstCaps * caps) { GstGLStereoMix *mix = GST_GL_STEREO_MIX (vagg); + GstCaps *in_caps; GST_LOG_OBJECT (mix, "Configured output caps %" GST_PTR_FORMAT, caps); @@ -498,11 +499,16 @@ _negotiated_caps (GstVideoAggregator * vagg, GstCaps * caps) /* We can configure the view_converter now */ gst_gl_view_convert_set_context (mix->viewconvert, GST_GL_BASE_MIXER (mix)->context); - gst_gl_view_convert_set_format (mix->viewconvert, &mix->mix_info, - &mix->out_info); - return TRUE; + in_caps = gst_video_info_to_caps (&mix->mix_info); + gst_caps_set_features (in_caps, 0, + gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY)); + gst_caps_set_simple (in_caps, "texture-target", G_TYPE_STRING, + GST_GL_TEXTURE_TARGET_2D_STR, NULL); + gst_gl_view_convert_set_caps (mix->viewconvert, in_caps, caps); + + return TRUE; } static gboolean diff --git a/gst-libs/gst/gl/gstglviewconvert.c b/gst-libs/gst/gl/gstglviewconvert.c index 28a5c16..3b524a9 100644 --- a/gst-libs/gst/gl/gstglviewconvert.c +++ b/gst-libs/gst/gl/gstglviewconvert.c @@ -351,8 +351,8 @@ gst_gl_view_convert_set_context (GstGLViewConvert * viewconvert, gst_gl_view_convert_reset (viewconvert); } -gboolean -gst_gl_view_convert_set_format (GstGLViewConvert * viewconvert, +static gboolean +_view_convert_set_format (GstGLViewConvert * viewconvert, GstVideoInfo * in_info, GstVideoInfo * out_info) { g_return_val_if_fail (GST_IS_GL_VIEW_CONVERT (viewconvert), FALSE); @@ -422,7 +422,7 @@ gst_gl_view_convert_set_caps (GstGLViewConvert * viewconvert, if (!gst_video_info_from_caps (&out_info, out_caps)) return FALSE; - return gst_gl_view_convert_set_format (viewconvert, &in_info, &out_info); + return _view_convert_set_format (viewconvert, &in_info, &out_info); } /* Function that can halve the value @@ -1586,7 +1586,6 @@ _init_view_convert (GstGLViewConvert * viewconvert) gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); } - gl->BindTexture (GL_TEXTURE_2D, 0); viewconvert->initted = TRUE; return TRUE; error: diff --git a/gst-libs/gst/gl/gstglviewconvert.h b/gst-libs/gst/gl/gstglviewconvert.h index 26a6df9..60f56f8 100644 --- a/gst-libs/gst/gl/gstglviewconvert.h +++ b/gst-libs/gst/gl/gstglviewconvert.h @@ -78,8 +78,6 @@ struct _GstGLViewConvertClass GType gst_gl_view_convert_get_type (void); GstGLViewConvert * gst_gl_view_convert_new (void); -gboolean gst_gl_view_convert_set_format (GstGLViewConvert *viewconvert, GstVideoInfo *in_info, - GstVideoInfo *out_info); gboolean gst_gl_view_convert_set_caps (GstGLViewConvert * viewconvert, GstCaps * in_caps, GstCaps * out_caps); GstCaps * gst_gl_view_convert_transform_caps (GstGLViewConvert * viewconvert, GstPadDirection direction, GstCaps * caps, GstCaps * filter); -- 2.7.4