From d608636327f5596d03dc3a623413857fd83e84aa Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sat, 21 Nov 2020 19:00:02 -0300 Subject: [PATCH] qroverlay: Reuse the same OverlayComposition object when possible Part-of: --- ext/qroverlay/gstbaseqroverlay.c | 34 +++++++++++++++++++++++-------- ext/qroverlay/gstbaseqroverlay.h | 3 ++- ext/qroverlay/gstdebugqroverlay.c | 5 +++-- ext/qroverlay/gstqroverlay.c | 19 ++++++++++++++--- 4 files changed, 47 insertions(+), 14 deletions(-) diff --git a/ext/qroverlay/gstbaseqroverlay.c b/ext/qroverlay/gstbaseqroverlay.c index 0e647649d7..0936343948 100644 --- a/ext/qroverlay/gstbaseqroverlay.c +++ b/ext/qroverlay/gstbaseqroverlay.c @@ -67,6 +67,7 @@ struct _GstBaseQROverlayPrivate gboolean valid; GstPad *sinkpad, *srcpad; + GstVideoOverlayComposition *prev_overlay; }; #define PRIV(s) gst_base_qr_overlay_get_instance_private (GST_BASE_QR_OVERLAY (s)) @@ -209,6 +210,7 @@ gst_base_qr_overlay_draw_cb (GstBaseQROverlay * self, GstSample * sample, GstBaseQROverlayPrivate *priv = PRIV (self); QRcode *qrcode; gchar *content; + gboolean reuse_previous = FALSE; GstVideoOverlayComposition *overlay = NULL; GstBuffer *buffer = gst_sample_get_buffer (sample); GstSegment *segment = gst_sample_get_segment (sample); @@ -226,15 +228,22 @@ gst_base_qr_overlay_draw_cb (GstBaseQROverlay * self, GstSample * sample, content = GST_BASE_QR_OVERLAY_GET_CLASS (self)->get_content (GST_BASE_QR_OVERLAY - (self), buffer, &priv->info); - GST_INFO_OBJECT (self, "String will be encoded : %s", content); - qrcode = QRcode_encodeString (content, 0, priv->qrcode_quality, QR_MODE_8, 0); + (self), buffer, &priv->info, &reuse_previous); + if (reuse_previous && priv->prev_overlay) { + overlay = gst_video_overlay_composition_ref (priv->prev_overlay); + } else if (content) { + GST_INFO_OBJECT (self, "String will be encoded : %s", content); + qrcode = + QRcode_encodeString (content, 0, priv->qrcode_quality, QR_MODE_8, 0); - if (qrcode) { - GST_DEBUG_OBJECT (self, "String encoded"); - overlay = draw_overlay (GST_BASE_QR_OVERLAY (self), qrcode); - } else { - GST_WARNING_OBJECT (self, "Could not encode content: %s", content); + if (qrcode) { + GST_DEBUG_OBJECT (self, "String encoded"); + overlay = draw_overlay (GST_BASE_QR_OVERLAY (self), qrcode); + gst_mini_object_replace (((GstMiniObject **) & priv->prev_overlay), + (GstMiniObject *) overlay); + } else { + GST_WARNING_OBJECT (self, "Could not encode content: %s", content); + } } g_free (content); @@ -243,6 +252,14 @@ gst_base_qr_overlay_draw_cb (GstBaseQROverlay * self, GstSample * sample, /* GObject vmethod implementations */ +static void +gst_base_qr_overlay_dispose (GObject * object) +{ + GstBaseQROverlayPrivate *priv = PRIV (object); + + gst_mini_object_replace (((GstMiniObject **) & priv->prev_overlay), NULL); +} + /* initialize the qroverlay's class */ static void gst_base_qr_overlay_class_init (GstBaseQROverlayClass * klass) @@ -255,6 +272,7 @@ gst_base_qr_overlay_class_init (GstBaseQROverlayClass * klass) gobject_class->set_property = gst_base_qr_overlay_set_property; gobject_class->get_property = gst_base_qr_overlay_get_property; + gobject_class->dispose = gst_base_qr_overlay_dispose; GST_DEBUG_CATEGORY_INIT (gst_base_qr_overlay_debug, "qroverlay", 0, "Qrcode overlay base class"); diff --git a/ext/qroverlay/gstbaseqroverlay.h b/ext/qroverlay/gstbaseqroverlay.h index 4fcb16a524..5fff863cce 100644 --- a/ext/qroverlay/gstbaseqroverlay.h +++ b/ext/qroverlay/gstbaseqroverlay.h @@ -34,7 +34,8 @@ struct _GstBaseQROverlayClass { GstBinClass parent; - gchar* (*get_content) (GstBaseQROverlay *self, GstBuffer *buf, GstVideoInfo *info); + gchar* (*get_content) (GstBaseQROverlay *self, GstBuffer *buf, GstVideoInfo *info, + gboolean *reuse_previous); }; G_END_DECLS diff --git a/ext/qroverlay/gstdebugqroverlay.c b/ext/qroverlay/gstdebugqroverlay.c index bcd73bceb2..6a7f8e3b6c 100644 --- a/ext/qroverlay/gstdebugqroverlay.c +++ b/ext/qroverlay/gstdebugqroverlay.c @@ -60,7 +60,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_debug_qr_overlay_debug); #define GST_CAT_DEFAULT gst_debug_qr_overlay_debug static gchar *get_qrcode_content (GstBaseQROverlay * base, GstBuffer * buf, - GstVideoInfo * info); + GstVideoInfo * info, gboolean * reuse_prev); enum { @@ -232,7 +232,7 @@ gst_debug_qr_overlay_get_property (GObject * object, guint prop_id, static gchar * get_qrcode_content (GstBaseQROverlay * base, GstBuffer * buf, - GstVideoInfo * info) + GstVideoInfo * info, gboolean * reuse_prev) { GstDebugQROverlay *filter = GST_DEBUG_QR_OVERLAY (base); GString *res = g_string_new (NULL); @@ -242,6 +242,7 @@ get_qrcode_content (GstBaseQROverlay * base, GstBuffer * buf, JsonObject *jobj = json_object_new (); JsonNode *root = json_node_new (JSON_NODE_OBJECT); + *reuse_prev = FALSE; json_object_set_int_member (jobj, "TIMESTAMP", (gint64) GST_BUFFER_TIMESTAMP (buf)); json_object_set_int_member (jobj, "BUFFERCOUNT", diff --git a/ext/qroverlay/gstqroverlay.c b/ext/qroverlay/gstqroverlay.c index a55f70e844..9fc312da6a 100644 --- a/ext/qroverlay/gstqroverlay.c +++ b/ext/qroverlay/gstqroverlay.c @@ -62,16 +62,26 @@ struct _GstQROverlay { GstBaseQROverlay parent; gchar *data; + + gboolean data_changed; }; #define gst_qr_overlay_parent_class parent_class G_DEFINE_TYPE (GstQROverlay, gst_qr_overlay, GST_TYPE_BASE_QR_OVERLAY); static gchar * -get_qrcode_content (GstBaseQROverlay * self, GstBuffer * buf, - GstVideoInfo * info) +get_qrcode_content (GstBaseQROverlay * base, GstBuffer * buf, + GstVideoInfo * info, gboolean * reuse_prev) { - return g_strdup (GST_QR_OVERLAY (self)->data); + gchar *content; + GstQROverlay *self = GST_QR_OVERLAY (base); + + GST_OBJECT_LOCK (self); + content = g_strdup (self->data); + *reuse_prev = self->data_changed; + GST_OBJECT_UNLOCK (self); + + return content; } static void @@ -82,7 +92,10 @@ gst_qr_overlay_set_property (GObject * object, guint prop_id, switch (prop_id) { case PROP_DATA: + GST_OBJECT_LOCK (self); self->data = g_value_dup_string (value); + self->data_changed = TRUE; + GST_OBJECT_UNLOCK (self); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);