From 6a98601b7c96ab6a7986e6fbb06cc460a59d0ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Thu, 28 Mar 2024 15:10:40 -0400 Subject: [PATCH] analyticsoverlay: Add property to linger the drawing for n frames --- .../gstobjectdetectionoverlay.c | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/subprojects/gst-plugins-bad/ext/analyticsoverlay/gstobjectdetectionoverlay.c b/subprojects/gst-plugins-bad/ext/analyticsoverlay/gstobjectdetectionoverlay.c index b9d0dc6660..bdd0ed1128 100644 --- a/subprojects/gst-plugins-bad/ext/analyticsoverlay/gstobjectdetectionoverlay.c +++ b/subprojects/gst-plugins-bad/ext/analyticsoverlay/gstobjectdetectionoverlay.c @@ -67,6 +67,8 @@ struct _GstObjectDetectionOverlay GMutex stream_event_mutex; gboolean flushing; gboolean eos; + guint linger_count; + GstBuffer *lingered_buffer; /* properties */ guint od_outline_color; @@ -76,6 +78,7 @@ struct _GstObjectDetectionOverlay guint labels_color; gdouble labels_stroke_width; gdouble labels_outline_ofs; + guint linger; /* composition */ gboolean attach_compo_to_buffer; @@ -102,6 +105,7 @@ enum PROP_DRAW_LABELS, PROP_LABELS_COLOR, PROP_DRAW, + PROP_LINGER, _PROP_COUNT }; @@ -230,7 +234,7 @@ gst_object_detection_overlay_class_init (GstObjectDetectionOverlayClass * klass) "Color (ARGB) to use for object labels", 0, G_MAXUINT, 0xFFFFFF, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - /** + /** * GstObjectDetectionOverlay:draw * * Control drawing objects @@ -245,6 +249,19 @@ gst_object_detection_overlay_class_init (GstObjectDetectionOverlayClass * klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_PLAYING)); + /** + * GstObjectDetectionOverlay:linger + * + * Linger labels for n frames without updated metadata + * + * Since: 1.26 + */ + g_object_class_install_property (gobject_class, PROP_LINGER, + g_param_spec_uint ("linger", + "Linger", + "Linger labels for n frames without updated metadata", + 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + element_class = (GstElementClass *) klass; gst_element_class_add_static_pad_template (element_class, &sink_template); @@ -332,6 +349,9 @@ gst_object_detection_overlay_set_property (GObject * object, guint prop_id, case PROP_DRAW: overlay->draw = g_value_get_boolean (value); break; + case PROP_LINGER: + overlay->linger = g_value_get_uint (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -357,6 +377,9 @@ gst_object_detection_overlay_get_property (GObject * object, case PROP_DRAW: g_value_set_boolean (value, od_overlay->draw); break; + case PROP_LINGER: + g_value_set_uint (value, od_overlay->linger); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -570,6 +593,8 @@ gst_object_detection_overlay_sink_event (GstBaseTransform * trans, GstCaps *caps; gst_event_parse_caps (event, &caps); ret = gst_object_detection_overlay_setcaps (overlay, caps); + gst_clear_buffer (&overlay->lingered_buffer); + overlay->linger_count = 0; gst_event_unref (event); break; } @@ -577,6 +602,8 @@ gst_object_detection_overlay_sink_event (GstBaseTransform * trans, g_mutex_lock (&overlay->stream_event_mutex); GST_INFO_OBJECT (overlay, "EOS"); overlay->eos = TRUE; + gst_clear_buffer (&overlay->lingered_buffer); + overlay->linger_count = 0; g_mutex_unlock (&overlay->stream_event_mutex); break; case GST_EVENT_FLUSH_START: @@ -590,6 +617,8 @@ gst_object_detection_overlay_sink_event (GstBaseTransform * trans, GST_INFO_OBJECT (overlay, "Flush stop"); overlay->eos = FALSE; overlay->flushing = FALSE; + gst_clear_buffer (&overlay->lingered_buffer); + overlay->linger_count = 0; g_mutex_unlock (&overlay->stream_event_mutex); break; default: @@ -630,6 +659,8 @@ gst_object_detection_overlay_stop (GstBaseTransform * trans) { GstObjectDetectionOverlay *overlay = GST_OBJECT_DETECTION_OVERLAY (trans); + gst_clear_buffer (&overlay->lingered_buffer); + overlay->linger_count = 0; g_clear_object (&overlay->pango_layout); g_clear_object (&overlay->pango_context); gst_clear_buffer (&overlay->canvas); @@ -730,6 +761,21 @@ gst_object_detection_overlay_transform_frame_ip (GstVideoFilter * filter, gst_buffer_get_meta (GST_BUFFER (frame->buffer), GST_ANALYTICS_RELATION_META_API_TYPE); + if (rmeta) { + overlay->linger_count = 0; + if (overlay->linger) + gst_buffer_replace (&overlay->lingered_buffer, frame->buffer); + } else if (overlay->lingered_buffer) { + overlay->linger_count++; + + if (overlay->linger_count > overlay->linger) + gst_clear_buffer (&overlay->lingered_buffer); + else + rmeta = (GstAnalyticsRelationMeta *) + gst_buffer_get_meta (overlay->lingered_buffer, + GST_ANALYTICS_RELATION_META_API_TYPE); + } + if (rmeta) { GST_DEBUG_OBJECT (filter, "received buffer with analytics relation meta");