qroverlay: Add a qroverlay element that allows overlaying any data
authorThibault Saunier <tsaunier@igalia.com>
Sun, 12 Jul 2020 04:03:04 +0000 (00:03 -0400)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 11 Nov 2020 00:18:32 +0000 (00:18 +0000)
This moves `gstqroverlay.c` to `gstdebugqroverlay.c` and implements
a simple `gstqroverlay` element.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1730>

ext/qroverlay/gstdebugqroverlay.c [new file with mode: 0755]
ext/qroverlay/gstdebugqroverlay.h [new file with mode: 0755]
ext/qroverlay/gstqroverlay.c
ext/qroverlay/gstqroverlay.h
ext/qroverlay/meson.build

diff --git a/ext/qroverlay/gstdebugqroverlay.c b/ext/qroverlay/gstdebugqroverlay.c
new file mode 100755 (executable)
index 0000000..fafc05e
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * GStreamer
+ * Copyright (C) 2006 Stefan Kost <ensonic@users.sf.net>
+ * Copyright (c) 2020 Anthony Violo <anthony.violo@ubicast.eu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:element-debugqroverlay
+ *
+ * This element will build a Json string that contains a description of the
+ * buffer and will convert the string to a QRcode. The QRcode contains a
+ * timestamp, a buffer number, a framerate and some custom extra-data. Each
+ * frame will have a Qrcode overlaid in the video stream. Some properties are
+ * available to set the position and to define its size. You can add custom data
+ * with the properties #debugqroverlay:extra-data-name and
+ * #debugqroverlay:extra-data-array. You can also define the quality of the Qrcode
+ * with #debugqroverlay:qrcode-error-correction. You can also define interval and
+ * span of #debugqroverlay:extra-data-name #debugqroverlay:extra-data-array
+ *
+ * ## Example launch line
+ *
+ * ``` bash
+ * gst-launch -v -m videotestsrc ! debugqroverlay ! fakesink silent=TRUE
+ * ```
+ *
+ * Since: 1.20
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/base/gstbasetransform.h>
+#include <json-glib/json-glib.h>
+
+#include <qrencode.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "gstdebugqroverlay.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_debug_qr_overlay_debug);
+#define GST_CAT_DEFAULT gst_debug_qr_overlay_debug
+
+static gchar *get_qrcode_content (GstBaseQROverlay * filter,
+    GstVideoFrame * frame);
+
+enum
+{
+  PROP_0,
+  PROP_DATA_INTERVAL_BUFFERS,
+  PROP_DATA_SPAN_BUFFERS,
+  PROP_EXTRA_DATA_NAME,
+  PROP_EXTRA_DATA_ARRAY,
+};
+
+struct _GstDebugQROverlay
+{
+  GstBaseQROverlay parent;
+
+  guint32 frame_number;
+  guint array_counter;
+  guint array_size;
+  guint span_frame;
+  guint64 extra_data_interval_buffers;
+  guint64 extra_data_span_buffers;
+  gchar *extra_data_name;
+  gchar *extra_data_str;
+  gchar **extra_data_array;
+  gfloat x_percent;
+  gfloat y_percent;
+  gboolean silent;
+  gboolean extra_data_enabled;
+};
+
+#define DEFAULT_PROP_QUALITY    1
+#define DEFAULT_PROP_PIXEL_SIZE    3
+
+#define gst_debug_qr_overlay_parent_class parent_class
+G_DEFINE_TYPE (GstDebugQROverlay, gst_debug_qr_overlay,
+    GST_TYPE_BASE_QR_OVERLAY);
+
+static void gst_debug_qr_overlay_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec);
+static void gst_debug_qr_overlay_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec);
+
+/* initialize the qroverlay's class */
+static void
+gst_debug_qr_overlay_class_init (GstDebugQROverlayClass * klass)
+{
+  GObjectClass *gobject_class;
+  GstElementClass *gstelement_class;
+
+  gobject_class = (GObjectClass *) klass;
+  gstelement_class = (GstElementClass *) klass;
+
+  GST_DEBUG_CATEGORY_INIT (gst_debug_qr_overlay_debug, "debugqroverlay", 0,
+      "Qrcode overlay element");
+
+  gobject_class->set_property = gst_debug_qr_overlay_set_property;
+  gobject_class->get_property = gst_debug_qr_overlay_get_property;
+
+  g_object_class_install_property (gobject_class,
+      PROP_DATA_INTERVAL_BUFFERS,
+      g_param_spec_int64 ("extra-data-interval-buffers",
+          "extra-data-interval-buffers",
+          "Extra data append into the Qrcode at the first buffer of each "
+          " interval", 0, G_MAXINT64, 60, G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+      PROP_DATA_SPAN_BUFFERS, g_param_spec_int64 ("extra-data-span-buffers",
+          "extra-data-span-buffers",
+          "Numbers of consecutive buffers that the extra data will be inserted "
+          " (counting the first buffer)", 0, G_MAXINT64, 1, G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+      PROP_EXTRA_DATA_NAME, g_param_spec_string ("extra-data-name",
+          "Extra data name",
+          "Json key name for extra append data", NULL, G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+      PROP_EXTRA_DATA_ARRAY, g_param_spec_string ("extra-data-array",
+          "Extra data array",
+          "List of comma separated values that the extra data value will be "
+          " cycled from at each interval, example array structure :"
+          " \"240,480,720,960,1200,1440,1680,1920\"", NULL, G_PARAM_READWRITE));
+
+
+  gst_element_class_set_details_simple (gstelement_class,
+      "qroverlay",
+      "Qrcode overlay containing buffer information",
+      "Overlay Qrcodes over each buffer with buffer information and custom data",
+      "Anthony Violo <anthony.violo@ubicast.eu>");
+
+  gst_type_mark_as_plugin_api (GST_TYPE_BASE_QR_OVERLAY, 0);
+
+  GST_BASE_QR_OVERLAY_CLASS (klass)->get_content =
+      GST_DEBUG_FUNCPTR (get_qrcode_content);
+}
+
+/* initialize the new element
+ * initialize instance structure
+ */
+static void
+gst_debug_qr_overlay_init (GstDebugQROverlay * filter)
+{
+  filter->frame_number = 1;
+  filter->x_percent = 50.0;
+  filter->y_percent = 50.0;
+  filter->array_counter = 0;
+  filter->array_size = 0;
+  filter->extra_data_interval_buffers = 60;
+  filter->extra_data_span_buffers = 1;
+  filter->span_frame = 0;
+}
+
+static void
+gst_debug_qr_overlay_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec)
+{
+  GstDebugQROverlay *filter = GST_DEBUG_QR_OVERLAY (object);
+
+  switch (prop_id) {
+    case PROP_DATA_INTERVAL_BUFFERS:
+      filter->extra_data_interval_buffers = g_value_get_int64 (value);
+      break;
+    case PROP_DATA_SPAN_BUFFERS:
+      filter->extra_data_span_buffers = g_value_get_int64 (value);
+      break;
+    case PROP_EXTRA_DATA_NAME:
+      filter->extra_data_name = g_value_dup_string (value);
+      break;
+    case PROP_EXTRA_DATA_ARRAY:
+    {
+      g_clear_pointer (&filter->extra_data_str, g_free);
+      g_clear_pointer (&filter->extra_data_array, g_strfreev);
+      filter->extra_data_str = g_value_dup_string (value);
+      if (filter->extra_data_str) {
+        filter->extra_data_array = g_strsplit (filter->extra_data_str, ",", -1);
+        filter->array_size = g_strv_length (filter->extra_data_array);
+      }
+      break;
+    }
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_debug_qr_overlay_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec)
+{
+  GstDebugQROverlay *filter = GST_DEBUG_QR_OVERLAY (object);
+
+  switch (prop_id) {
+    case PROP_DATA_INTERVAL_BUFFERS:
+      g_value_set_int64 (value, filter->extra_data_interval_buffers);
+      break;
+    case PROP_DATA_SPAN_BUFFERS:
+      g_value_set_int64 (value, filter->extra_data_span_buffers);
+      break;
+    case PROP_EXTRA_DATA_NAME:
+      g_value_set_string (value, filter->extra_data_name);
+      break;
+    case PROP_EXTRA_DATA_ARRAY:
+      g_value_set_string (value, filter->extra_data_str);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static gchar *
+get_qrcode_content (GstBaseQROverlay * base, GstVideoFrame * frame)
+{
+  GstDebugQROverlay *filter = GST_DEBUG_QR_OVERLAY (base);
+  GstBuffer *buf = frame->buffer;
+  GString *res = g_string_new (NULL);
+  JsonGenerator *jgen;
+  gchar *framerate_string =
+      g_strdup_printf ("%d/%d", frame->info.fps_n, frame->info.fps_d);
+
+  JsonObject *jobj = json_object_new ();
+  JsonNode *root = json_node_new (JSON_NODE_OBJECT);
+
+  json_object_set_int_member (jobj, "TIMESTAMP",
+      (gint64) GST_BUFFER_TIMESTAMP (buf));
+  json_object_set_int_member (jobj, "BUFFERCOUNT",
+      (gint64) filter->frame_number);
+  json_object_set_string_member (jobj, "FRAMERATE", framerate_string);
+  json_object_set_string_member (jobj, "NAME", GST_ELEMENT_NAME (filter));
+  g_free (framerate_string);
+
+  if (filter->extra_data_array && filter->extra_data_name &&
+      (filter->frame_number == 1
+          || filter->frame_number % filter->extra_data_interval_buffers == 1
+          || (filter->span_frame > 0
+              && filter->span_frame < filter->extra_data_span_buffers))) {
+    json_object_set_string_member (jobj, filter->extra_data_name,
+        filter->extra_data_array[filter->array_counter]);
+
+    filter->span_frame++;
+    if (filter->span_frame == filter->extra_data_span_buffers) {
+      filter->array_counter++;
+      filter->span_frame = 0;
+      if (filter->array_counter >= filter->array_size)
+        filter->array_counter = 0;
+    }
+  }
+
+  jgen = json_generator_new ();
+  json_node_set_object (root, jobj);
+  json_generator_set_root (jgen, root);
+  res = json_generator_to_gstring (jgen, res);
+  g_object_unref (jgen);
+  filter->frame_number++;
+
+  return g_strdup (g_string_free (res, FALSE));
+}
diff --git a/ext/qroverlay/gstdebugqroverlay.h b/ext/qroverlay/gstdebugqroverlay.h
new file mode 100755 (executable)
index 0000000..48d7465
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * GStreamer
+ * Copyright (C) 2006 Stefan Kost <ensonic@users.sf.net>
+ * Copyright (c) 2020 Anthony Violo <anthony.violo@ubicast.eu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_DEBUG_QR_OVERLAY_H__
+#define __GST_DEBUG_QR_OVERLAY_H__
+
+#include "gstbaseqroverlay.h"
+
+G_BEGIN_DECLS
+#define GST_TYPE_DEBUG_QR_OVERLAY (gst_debug_qr_overlay_get_type())
+
+G_DECLARE_FINAL_TYPE (GstDebugQROverlay, gst_debug_qr_overlay, GST, DEBUG_QR_OVERLAY, GstBaseQROverlay);
+
+G_END_DECLS
+#endif /* __GST_DEBUG_QR_OVERLAY_H__ */
index 8766bdb..ca9cbba 100755 (executable)
@@ -2,6 +2,7 @@
  * GStreamer
  * Copyright (C) 2006 Stefan Kost <ensonic@users.sf.net>
  * Copyright (c) 2020 Anthony Violo <anthony.violo@ubicast.eu>
+ * Copyright (c) 2020 Thibault Saunier <tsaunier@igalia.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
  */
 
 /**
- * SECTION:element-debugqroverlay
+ * SECTION:element-qroverlay
  *
- * This element will build a Json string that contains a description of the
- * buffer and will convert the string to a QRcode. The QRcode contains a
- * timestamp, a buffer number, a framerate and some custom extra-data. Each
- * frame will have a Qrcode overlaid in the video stream. Some properties are
- * available to set the position and to define its size. You can add custom data
- * with the properties #qroverlay:extra-data-name and
- * #qroverlay:extra-data-array. You can also define the quality of the Qrcode
- * with #qroverlay:qrcode-error-correction. You can also define interval and
- * span of #qrovlerlay:extra-data-name #qrovlerlay:extra-data-array
+ * Element to set random data on a qroverlay.
  *
  * ## Example launch line
  *
 
 #include "gstqroverlay.h"
 
-GST_DEBUG_CATEGORY_STATIC (gst_debug_qr_overlay_debug);
-#define GST_CAT_DEFAULT gst_debug_qr_overlay_debug
-
-static gchar *get_qrcode_content (GstBaseQROverlay * filter,
-    GstVideoFrame * frame);
+GST_DEBUG_CATEGORY_STATIC (gst_qr_overlay_debug);
+#define GST_CAT_DEFAULT gst_qr_overlay_debug
 
 enum
 {
   PROP_0,
-  PROP_DATA_INTERVAL_BUFFERS,
-  PROP_DATA_SPAN_BUFFERS,
-  PROP_EXTRA_DATA_NAME,
-  PROP_EXTRA_DATA_ARRAY,
+  PROP_DATA,
 };
 
-struct _GstDebugQROverlay
+struct _GstQROverlay
 {
   GstBaseQROverlay parent;
-
-  guint32 frame_number;
-  guint array_counter;
-  guint array_size;
-  guint span_frame;
-  guint64 extra_data_interval_buffers;
-  guint64 extra_data_span_buffers;
-  gchar *extra_data_name;
-  gchar *extra_data_str;
-  gchar **extra_data_array;
-  gfloat x_percent;
-  gfloat y_percent;
-  gboolean silent;
-  gboolean extra_data_enabled;
+  gchar *data;
 };
 
-#define DEFAULT_PROP_QUALITY    1
-#define DEFAULT_PROP_PIXEL_SIZE    3
-
-#define gst_debug_qr_overlay_parent_class parent_class
-G_DEFINE_TYPE (GstDebugQROverlay, gst_debug_qr_overlay,
-    GST_TYPE_BASE_QR_OVERLAY);
-
-static void gst_debug_qr_overlay_set_property (GObject * object, guint prop_id,
-    const GValue * value, GParamSpec * pspec);
-static void gst_debug_qr_overlay_get_property (GObject * object, guint prop_id,
-    GValue * value, GParamSpec * pspec);
-
-/* initialize the qroverlay's class */
-static void
-gst_debug_qr_overlay_class_init (GstDebugQROverlayClass * klass)
-{
-  GObjectClass *gobject_class;
-  GstElementClass *gstelement_class;
-
-  gobject_class = (GObjectClass *) klass;
-  gstelement_class = (GstElementClass *) klass;
-
-  gobject_class->set_property = gst_debug_qr_overlay_set_property;
-  gobject_class->get_property = gst_debug_qr_overlay_get_property;
-
-  g_object_class_install_property (gobject_class,
-      PROP_DATA_INTERVAL_BUFFERS,
-      g_param_spec_int64 ("extra-data-interval-buffers",
-          "extra-data-interval-buffers",
-          "Extra data append into the Qrcode at the first buffer of each "
-          " interval", 0, G_MAXINT64, 60, G_PARAM_READWRITE));
+#define gst_qr_overlay_parent_class parent_class
+G_DEFINE_TYPE (GstQROverlay, gst_qr_overlay, GST_TYPE_BASE_QR_OVERLAY);
 
-  g_object_class_install_property (gobject_class,
-      PROP_DATA_SPAN_BUFFERS, g_param_spec_int64 ("extra-data-span-buffers",
-          "extra-data-span-buffers",
-          "Numbers of consecutive buffers that the extra data will be inserted "
-          " (counting the first buffer)", 0, G_MAXINT64, 1, G_PARAM_READWRITE));
-
-  g_object_class_install_property (gobject_class,
-      PROP_EXTRA_DATA_NAME, g_param_spec_string ("extra-data-name",
-          "Extra data name",
-          "Json key name for extra append data", NULL, G_PARAM_READWRITE));
-
-  g_object_class_install_property (gobject_class,
-      PROP_EXTRA_DATA_ARRAY, g_param_spec_string ("extra-data-array",
-          "Extra data array",
-          "List of comma separated values that the extra data value will be "
-          " cycled from at each interval, example array structure :"
-          " \"240,480,720,960,1200,1440,1680,1920\"", NULL, G_PARAM_READWRITE));
-
-
-  gst_element_class_set_details_simple (gstelement_class,
-      "qroverlay",
-      "Qrcode overlay containing buffer information",
-      "Overlay Qrcodes over each buffer with buffer information and custom data",
-      "Anthony Violo <anthony.violo@ubicast.eu>");
-
-  gst_type_mark_as_plugin_api (GST_TYPE_BASE_QR_OVERLAY, 0);
-
-  GST_BASE_QR_OVERLAY_CLASS (klass)->get_content =
-      GST_DEBUG_FUNCPTR (get_qrcode_content);
-}
-
-/* initialize the new element
- * initialize instance structure
- */
-static void
-gst_debug_qr_overlay_init (GstDebugQROverlay * filter)
+static gchar *
+get_qrcode_content (GstBaseQROverlay * filter, GstVideoFrame * frame)
 {
-  filter->frame_number = 1;
-  filter->x_percent = 50.0;
-  filter->y_percent = 50.0;
-  filter->array_counter = 0;
-  filter->array_size = 0;
-  filter->extra_data_interval_buffers = 60;
-  filter->extra_data_span_buffers = 1;
-  filter->span_frame = 0;
+  return g_strdup (GST_QR_OVERLAY (filter)->data);
 }
 
 static void
-gst_debug_qr_overlay_set_property (GObject * object, guint prop_id,
+gst_qr_overlay_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec)
 {
-  GstDebugQROverlay *filter = GST_DEBUG_QR_OVERLAY (object);
+  GstQROverlay *self = GST_QR_OVERLAY (object);
 
   switch (prop_id) {
-    case PROP_DATA_INTERVAL_BUFFERS:
-      filter->extra_data_interval_buffers = g_value_get_int64 (value);
+    case PROP_DATA:
+      self->data = g_value_dup_string (value);
       break;
-    case PROP_DATA_SPAN_BUFFERS:
-      filter->extra_data_span_buffers = g_value_get_int64 (value);
-      break;
-    case PROP_EXTRA_DATA_NAME:
-      filter->extra_data_name = g_value_dup_string (value);
-      break;
-    case PROP_EXTRA_DATA_ARRAY:
-    {
-      g_clear_pointer (&filter->extra_data_str, g_free);
-      g_clear_pointer (&filter->extra_data_array, g_strfreev);
-      filter->extra_data_str = g_value_dup_string (value);
-      if (filter->extra_data_str) {
-        filter->extra_data_array = g_strsplit (filter->extra_data_str, ",", -1);
-        filter->array_size = g_strv_length (filter->extra_data_array);
-      }
-      break;
-    }
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -203,23 +90,14 @@ gst_debug_qr_overlay_set_property (GObject * object, guint prop_id,
 }
 
 static void
-gst_debug_qr_overlay_get_property (GObject * object, guint prop_id,
+gst_qr_overlay_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec)
 {
-  GstDebugQROverlay *filter = GST_DEBUG_QR_OVERLAY (object);
+  GstQROverlay *self = GST_QR_OVERLAY (object);
 
   switch (prop_id) {
-    case PROP_DATA_INTERVAL_BUFFERS:
-      g_value_set_int64 (value, filter->extra_data_interval_buffers);
-      break;
-    case PROP_DATA_SPAN_BUFFERS:
-      g_value_set_int64 (value, filter->extra_data_span_buffers);
-      break;
-    case PROP_EXTRA_DATA_NAME:
-      g_value_set_string (value, filter->extra_data_name);
-      break;
-    case PROP_EXTRA_DATA_ARRAY:
-      g_value_set_string (value, filter->extra_data_str);
+    case PROP_DATA:
+      g_value_set_string (value, self->data);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -227,62 +105,58 @@ gst_debug_qr_overlay_get_property (GObject * object, guint prop_id,
   }
 }
 
-static gchar *
-get_qrcode_content (GstBaseQROverlay * base, GstVideoFrame * frame)
+static void
+gst_qr_overlay_class_init (GstQROverlayClass * klass)
 {
-  GstDebugQROverlay *filter = GST_DEBUG_QR_OVERLAY (base);
-  GstBuffer *buf = frame->buffer;
-  GString *res = g_string_new (NULL);
-  JsonGenerator *jgen;
-  gchar *framerate_string =
-      g_strdup_printf ("%d/%d", frame->info.fps_n, frame->info.fps_d);
+  GObjectClass *gobject_class;
+  GstElementClass *gstelement_class;
 
-  JsonObject *jobj = json_object_new ();
-  JsonNode *root = json_node_new (JSON_NODE_OBJECT);
+  gobject_class = (GObjectClass *) klass;
+  gstelement_class = (GstElementClass *) klass;
 
-  json_object_set_int_member (jobj, "TIMESTAMP",
-      (gint64) GST_BUFFER_TIMESTAMP (buf));
-  json_object_set_int_member (jobj, "BUFFERCOUNT",
-      (gint64) filter->frame_number);
-  json_object_set_string_member (jobj, "FRAMERATE", framerate_string);
-  json_object_set_string_member (jobj, "NAME", GST_ELEMENT_NAME (filter));
-  g_free (framerate_string);
+  gobject_class->set_property = gst_qr_overlay_set_property;
+  gobject_class->get_property = gst_qr_overlay_get_property;
 
-  if (filter->extra_data_array && filter->extra_data_name &&
-      (filter->frame_number == 1
-          || filter->frame_number % filter->extra_data_interval_buffers == 1
-          || (filter->span_frame > 0
-              && filter->span_frame < filter->extra_data_span_buffers))) {
-    json_object_set_string_member (jobj, filter->extra_data_name,
-        filter->extra_data_array[filter->array_counter]);
+  gst_element_class_set_details_simple (gstelement_class,
+      "qroverlay",
+      "Qrcode overlay containing random data",
+      "Overlay Qrcodes over each buffer with data passed in",
+      "Thibault Saunier <tsaunier@igalia.com>");
 
-    filter->span_frame++;
-    if (filter->span_frame == filter->extra_data_span_buffers) {
-      filter->array_counter++;
-      filter->span_frame = 0;
-      if (filter->array_counter >= filter->array_size)
-        filter->array_counter = 0;
-    }
-  }
+  g_object_class_install_property (gobject_class,
+      PROP_DATA, g_param_spec_string ("data",
+          "Data",
+          "Data to write in the QRCode to be overlaid",
+          NULL,
+          G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING |
+          GST_PARAM_CONTROLLABLE));
 
-  jgen = json_generator_new ();
-  json_node_set_object (root, jobj);
-  json_generator_set_root (jgen, root);
-  res = json_generator_to_gstring (jgen, res);
-  g_object_unref (jgen);
-  filter->frame_number++;
+  GST_BASE_QR_OVERLAY_CLASS (klass)->get_content =
+      GST_DEBUG_FUNCPTR (get_qrcode_content);
+}
 
-  return g_strdup (g_string_free (res, FALSE));
+/* initialize the new element
+ * initialize instance structure
+ */
+static void
+gst_qr_overlay_init (GstQROverlay * filter)
+{
 }
 
+#include "gstdebugqroverlay.h"
+
 static gboolean
 qroverlay_init (GstPlugin * qroverlay)
 {
-  GST_DEBUG_CATEGORY_INIT (gst_debug_qr_overlay_debug, "debugqroverlay", 0,
+  GST_DEBUG_CATEGORY_INIT (gst_qr_overlay_debug, "qroverlay", 0,
       "Qrcode overlay element");
 
-  return gst_element_register (qroverlay, "debugqroverlay", GST_RANK_NONE,
-      GST_TYPE_QR_OVERLAY);
+  if (gst_element_register (qroverlay, "debugqroverlay", GST_RANK_NONE,
+          GST_TYPE_DEBUG_QR_OVERLAY))
+    return gst_element_register (qroverlay, "qroverlay", GST_RANK_NONE,
+        GST_TYPE_QR_OVERLAY);
+
+  return FALSE;
 }
 
 GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
index e980795..adafe9e 100755 (executable)
  * Boston, MA 02111-1307, USA.
  */
 
-#ifndef __GST_DEBUG_QR_OVERLAY_H__
-#define __GST_DEBUG_QR_OVERLAY_H__
+#ifndef __GST_QR_OVERLAY_H__
+#define __GST_QR_OVERLAY_H__
 
 #include "gstbaseqroverlay.h"
 
 G_BEGIN_DECLS
-#define GST_TYPE_QR_OVERLAY (gst_debug_qr_overlay_get_type())
+#define GST_TYPE_QR_OVERLAY (gst_qr_overlay_get_type())
 
-G_DECLARE_FINAL_TYPE (GstDebugQROverlay, gst_debug_qr_overlay, GST, DEBUG_QR_OVERLAY, GstBaseQROverlay);
+G_DECLARE_FINAL_TYPE (GstQROverlay, gst_qr_overlay, GST, QR_OVERLAY, GstBaseQROverlay);
 
 G_END_DECLS
-#endif /* __GST_DEBUG_QR_OVERLAY_H__ */
+#endif /* __GST_QR_OVERLAY_H__ */
index 0c19083..0e4393f 100644 (file)
@@ -1,7 +1,7 @@
 qrencode_dep = dependency('libqrencode', required: get_option('qroverlay'))
 json_dep = dependency('json-glib-1.0', fallback : ['json-glib', 'json_glib_dep'])
 if qrencode_dep.found()
-  gstqroverlay = library('gstqroverlay', ['gstqroverlay.c', 'gstbaseqroverlay.c'],
+  gstqroverlay = library('gstqroverlay', ['gstqroverlay.c', 'gstdebugqroverlay.c', 'gstbaseqroverlay.c'],
     c_args : gst_plugins_bad_args,
     include_directories : [configinc],
     dependencies : [gstvideo_dep, qrencode_dep, json_dep],