gltestsrc: Add other-context property
authorSebastian Dröge <sebastian@centricular.com>
Mon, 13 Oct 2014 11:25:42 +0000 (13:25 +0200)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:31:48 +0000 (19:31 +0000)
ext/gl/gstgltestsrc.c
ext/gl/gstgltestsrc.h

index 5abeead..2b73b18 100644 (file)
@@ -59,6 +59,7 @@ GST_DEBUG_CATEGORY_STATIC (gl_test_src_debug);
 enum
 {
   PROP_0,
+  PROP_OTHER_CONTEXT,
   PROP_PATTERN,
   PROP_TIMESTAMP_OFFSET,
   PROP_IS_LIVE
@@ -89,6 +90,7 @@ static void gst_gl_test_src_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec);
 static void gst_gl_test_src_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec);
+static void gst_gl_test_src_dispose (GObject * object);
 
 static gboolean gst_gl_test_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps);
 static GstCaps *gst_gl_test_src_fixate (GstBaseSrc * bsrc, GstCaps * caps);
@@ -161,7 +163,13 @@ gst_gl_test_src_class_init (GstGLTestSrcClass * klass)
 
   gobject_class->set_property = gst_gl_test_src_set_property;
   gobject_class->get_property = gst_gl_test_src_get_property;
+  gobject_class->dispose = gst_gl_test_src_dispose;
 
+  g_object_class_install_property (gobject_class, PROP_OTHER_CONTEXT,
+      g_param_spec_object ("other-context",
+          "External OpenGL context",
+          "Give an external OpenGL context with which to share textures",
+          GST_GL_TYPE_CONTEXT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
   g_object_class_install_property (gobject_class, PROP_PATTERN,
       g_param_spec_enum ("pattern", "Pattern",
           "Type of test pattern to generate", GST_TYPE_GL_TEST_SRC_PATTERN,
@@ -389,12 +397,29 @@ gst_gl_test_src_set_pattern (GstGLTestSrc * gltestsrc, gint pattern_type)
 }
 
 static void
+gst_gl_test_src_dispose (GObject * object)
+{
+  GstGLTestSrc *src = GST_GL_TEST_SRC (object);
+
+  if (src->other_context)
+    gst_object_unref (src->other_context);
+  src->other_context = NULL;
+
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
 gst_gl_test_src_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec)
 {
   GstGLTestSrc *src = GST_GL_TEST_SRC (object);
 
   switch (prop_id) {
+    case PROP_OTHER_CONTEXT:
+      if (src->other_context)
+        gst_object_unref (src->other_context);
+      src->other_context = g_value_dup_object (value);
+      break;
     case PROP_PATTERN:
       gst_gl_test_src_set_pattern (src, g_value_get_enum (value));
       break;
@@ -416,6 +441,9 @@ gst_gl_test_src_get_property (GObject * object, guint prop_id,
   GstGLTestSrc *src = GST_GL_TEST_SRC (object);
 
   switch (prop_id) {
+    case PROP_OTHER_CONTEXT:
+      g_value_set_object (value, src->other_context);
+      break;
     case PROP_PATTERN:
       g_value_set_enum (value, src->pattern_type);
       break;
@@ -784,6 +812,16 @@ gst_gl_test_src_decide_allocation (GstBaseSrc * basesrc, GstQuery * query)
     }
   }
 
+  if (src->other_context) {
+    if (!other_context) {
+      other_context = src->other_context;
+    } else {
+      GST_ELEMENT_WARNING (src, LIBRARY, SETTINGS,
+          ("%s", "Cannot share with more than one GL context"),
+          ("%s", "Cannot share with more than one GL context"));
+    }
+  }
+
   if (!src->context) {
     src->context = gst_gl_context_new (src->display);
     if (!gst_gl_context_create (src->context, other_context, &error))
index 0e7d71b..2c60b25 100644 (file)
@@ -108,7 +108,7 @@ struct _GstGLTestSrc {
     GstGLDownload *download;
 
     GstGLDisplay *display;
-    GstGLContext *context;
+    GstGLContext *context, *other_context;
     gint64 timestamp_offset;              /* base offset */
     GstClockTime running_time;            /* total running time */
     gint64 n_frames;                      /* total frames sent */