summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Schmidt <jan@centricular.com>2016-01-04 01:03:08 +1100
committerJan Schmidt <jan@centricular.com>2016-01-04 01:04:23 +1100
commit40b0736dfd2640f296ff0889709c9b824fde5edd (patch)
treecc0c1d9f6f1506936bc150c4044d852892364b0a
parent1e5eb72532613efb15bb687df68b6fb5048896c0 (diff)
downloadgstreamer-plugins-bad-40b0736dfd2640f296ff0889709c9b824fde5edd.tar.gz
glviewconvert: Fix stereoscopic handling w/ texture-target
The addition of texture-target negotiation broke stereoscopic handling when not in passthrough mode, so fix that.
-rw-r--r--gst-libs/gst/gl/gstglviewconvert.c54
-rw-r--r--gst-libs/gst/gl/gstglviewconvert.h1
2 files changed, 51 insertions, 4 deletions
diff --git a/gst-libs/gst/gl/gstglviewconvert.c b/gst-libs/gst/gl/gstglviewconvert.c
index c2776cba1..d2b213632 100644
--- a/gst-libs/gst/gl/gstglviewconvert.c
+++ b/gst-libs/gst/gl/gstglviewconvert.c
@@ -352,12 +352,16 @@ gst_gl_view_convert_set_context (GstGLViewConvert * viewconvert,
static gboolean
_view_convert_set_format (GstGLViewConvert * viewconvert,
- GstVideoInfo * in_info, GstVideoInfo * out_info)
+ GstVideoInfo * in_info, GstGLTextureTarget from_target,
+ GstVideoInfo * out_info, GstGLTextureTarget to_target)
{
+ gboolean passthrough;
g_return_val_if_fail (GST_IS_GL_VIEW_CONVERT (viewconvert), FALSE);
if (gst_video_info_is_equal (in_info, &viewconvert->in_info) &&
- gst_video_info_is_equal (out_info, &viewconvert->out_info))
+ gst_video_info_is_equal (out_info, &viewconvert->out_info) &&
+ viewconvert->from_texture_target == from_target &&
+ viewconvert->to_texture_target == to_target)
return TRUE;
if (GST_VIDEO_INFO_FORMAT (in_info) != GST_VIDEO_FORMAT_RGBA ||
@@ -367,12 +371,22 @@ _view_convert_set_format (GstGLViewConvert * viewconvert,
return FALSE;
}
+ passthrough = gst_video_info_is_equal (in_info, out_info) &&
+ from_target == to_target;
+
+ if (!passthrough && to_target != GST_GL_TEXTURE_TARGET_2D
+ && to_target != GST_GL_TEXTURE_TARGET_RECTANGLE)
+ return FALSE;
+
/* FIXME: Compare what changed and decide if we need a full reset or not */
GST_OBJECT_LOCK (viewconvert);
gst_gl_view_convert_reset (viewconvert);
viewconvert->in_info = *in_info;
viewconvert->out_info = *out_info;
+ viewconvert->from_texture_target = from_target;
+ viewconvert->to_texture_target = to_target;
+ viewconvert->caps_passthrough = passthrough;
gst_buffer_replace (&viewconvert->priv->primary_in, NULL);
gst_buffer_replace (&viewconvert->priv->auxilliary_in, NULL);
@@ -397,6 +411,8 @@ gst_gl_view_convert_set_caps (GstGLViewConvert * viewconvert,
{
GstVideoInfo in_info, out_info;
GstCapsFeatures *in_features, *out_features;
+ GstGLTextureTarget from_target = GST_GL_TEXTURE_TARGET_2D;
+ GstGLTextureTarget to_target = GST_GL_TEXTURE_TARGET_2D;
g_return_val_if_fail (GST_IS_GL_VIEW_CONVERT (viewconvert), FALSE);
g_return_val_if_fail (GST_IS_CAPS (in_caps), FALSE);
@@ -421,7 +437,30 @@ gst_gl_view_convert_set_caps (GstGLViewConvert * viewconvert,
if (!gst_video_info_from_caps (&out_info, out_caps))
return FALSE;
- return _view_convert_set_format (viewconvert, &in_info, &out_info);
+ {
+ GstStructure *in_s = gst_caps_get_structure (in_caps, 0);
+ GstStructure *out_s = gst_caps_get_structure (out_caps, 0);
+
+ if (gst_structure_has_field_typed (in_s, "texture-target", G_TYPE_STRING)) {
+ from_target =
+ gst_gl_texture_target_from_string (gst_structure_get_string (in_s,
+ "texture-target"));
+ }
+
+ if (gst_structure_has_field_typed (out_s, "texture-target", G_TYPE_STRING)) {
+ to_target =
+ gst_gl_texture_target_from_string (gst_structure_get_string (out_s,
+ "texture-target"));
+ }
+
+ if (to_target == GST_GL_TEXTURE_TARGET_NONE
+ || from_target == GST_GL_TEXTURE_TARGET_NONE)
+ /* invalid caps */
+ return FALSE;
+ }
+
+ return _view_convert_set_format (viewconvert, &in_info, from_target,
+ &out_info, to_target);
}
/* Function that can halve the value
@@ -2218,7 +2257,8 @@ gst_gl_view_convert_get_output (GstGLViewConvert * viewconvert,
if (priv->input_mode == priv->output_mode &&
priv->input_flags == priv->output_flags &&
viewconvert->in_info.width == viewconvert->out_info.width &&
- viewconvert->in_info.height == viewconvert->out_info.height) {
+ viewconvert->in_info.height == viewconvert->out_info.height &&
+ viewconvert->from_texture_target == viewconvert->to_texture_target) {
/* passthrough - just pass input buffers */
outbuf = gst_buffer_ref (priv->primary_in);
if (in_mode == GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME)
@@ -2226,6 +2266,12 @@ gst_gl_view_convert_get_output (GstGLViewConvert * viewconvert,
goto done_clear_input;
}
+ /* We can't output to OES textures, they're only supported for passthrough */
+ if (viewconvert->to_texture_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES) {
+ ret = GST_FLOW_ERROR;
+ goto done_clear_input;
+ }
+
/* Generate new output buffer(s) */
gst_gl_context_thread_add (viewconvert->context,
(GstGLContextThreadFunc) _do_view_convert, viewconvert);
diff --git a/gst-libs/gst/gl/gstglviewconvert.h b/gst-libs/gst/gl/gstglviewconvert.h
index dda2eef35..8cfa1b270 100644
--- a/gst-libs/gst/gl/gstglviewconvert.h
+++ b/gst-libs/gst/gl/gstglviewconvert.h
@@ -63,6 +63,7 @@ struct _GstGLViewConvert
GstGLTextureTarget from_texture_target;
GstGLTextureTarget to_texture_target;
+ gboolean caps_passthrough;
gboolean initted;
gboolean reconfigure;