navseek: add hold_eos property
authorStéphane Cerveau <scerveau@collabora.com>
Thu, 29 Oct 2020 13:54:16 +0000 (14:54 +0100)
committerStéphane Cerveau <scerveau@collabora.com>
Sun, 1 Nov 2020 14:19:46 +0000 (15:19 +0100)
This property will tell the element to hold
the EOS event and keep it until the next
keystroke.

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

docs/gst_plugins_cache.json
gst/debugutils/gstnavseek.c
gst/debugutils/gstnavseek.h

index 01dc8be..b8590d4 100644 (file)
                     }
                 },
                 "properties": {
+                    "hold-eos": {
+                        "blurb": "Hold eos until the next 'Return' keystroke",
+                        "conditionally-available": false,
+                        "construct": false,
+                        "construct-only": false,
+                        "controllable": false,
+                        "default": "false",
+                        "mutable": "null",
+                        "readable": true,
+                        "type": "gboolean",
+                        "writable": true
+                    },
                     "seek-offset": {
                         "blurb": "Time in seconds to seek by",
                         "conditionally-available": false,
index fd9386c..49e41a2 100644 (file)
@@ -34,7 +34,8 @@
 enum
 {
   PROP_0,
-  PROP_SEEKOFFSET
+  PROP_SEEKOFFSET,
+  PROP_HOLD_EOS,
 };
 
 GstStaticPadTemplate navseek_src_template = GST_STATIC_PAD_TEMPLATE ("src",
@@ -83,6 +84,17 @@ gst_navseek_class_init (GstNavSeekClass * klass)
       PROP_SEEKOFFSET, g_param_spec_double ("seek-offset", "Seek Offset",
           "Time in seconds to seek by", 0.0, G_MAXDOUBLE, 5.0,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * navseek:hold-eos:
+   *
+   * Hold eos until the next 'Return' keystroke.
+   *
+   * Since: 1.20
+   */
+  g_object_class_install_property (gobject_class,
+      PROP_HOLD_EOS, g_param_spec_boolean ("hold-eos", "Hold EOS",
+          "Hold eos until the next 'Return' keystroke", FALSE,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   gst_element_class_add_static_pad_template (element_class,
       &navseek_sink_template);
@@ -109,6 +121,8 @@ gst_navseek_init (GstNavSeek * navseek)
 
   navseek->seek_offset = 5.0;
   navseek->loop = FALSE;
+  navseek->hold_eos = FALSE;
+  navseek->eos = NULL;
   navseek->grab_seg_start = FALSE;
   navseek->grab_seg_end = FALSE;
   navseek->segment_start = GST_CLOCK_TIME_NONE;
@@ -277,6 +291,12 @@ gst_navseek_src_event (GstBaseTransform * trans, GstEvent * event)
           gst_navseek_change_playback_rate (navseek, 1.0);
         } else if (strcmp (key, "space") == 0) {
           gst_navseek_toggle_play_pause (navseek);
+        } else if (strcmp (key, "Return") == 0) {
+          if (navseek->eos) {
+            gst_pad_push_event (GST_BASE_TRANSFORM (navseek)->srcpad,
+                navseek->eos);
+            navseek->eos = NULL;
+          }
         }
       } else {
         break;
@@ -307,6 +327,11 @@ gst_navseek_set_property (GObject * object, guint prop_id,
       navseek->seek_offset = g_value_get_double (value);
       GST_OBJECT_UNLOCK (navseek);
       break;
+    case PROP_HOLD_EOS:
+      GST_OBJECT_LOCK (navseek);
+      navseek->hold_eos = g_value_get_boolean (value);
+      GST_OBJECT_UNLOCK (navseek);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -325,6 +350,11 @@ gst_navseek_get_property (GObject * object, guint prop_id,
       g_value_set_double (value, navseek->seek_offset);
       GST_OBJECT_UNLOCK (navseek);
       break;
+    case PROP_HOLD_EOS:
+      GST_OBJECT_LOCK (navseek);
+      g_value_set_boolean (value, navseek->hold_eos);
+      GST_OBJECT_UNLOCK (navseek);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -341,7 +371,11 @@ gst_navseek_sink_event (GstBaseTransform * trans, GstEvent * event)
       GST_OBJECT_LOCK (navseek);
       if (navseek->loop)
         gst_navseek_segseek (navseek);
+      if (navseek->hold_eos)
+        navseek->eos = event;
       GST_OBJECT_UNLOCK (navseek);
+      if (navseek->eos)
+        return TRUE;
       break;
     default:
       break;
@@ -385,6 +419,11 @@ gst_navseek_start (GstBaseTransform * trans)
 static gboolean
 gst_navseek_stop (GstBaseTransform * trans)
 {
-  /* anything we should be doing here? */
+  GstNavSeek *navseek = GST_NAVSEEK (trans);
+
+  if (navseek->eos) {
+    gst_event_unref (navseek->eos);
+    navseek->eos = NULL;
+  }
   return TRUE;
 }
index 1b9c924..6b596b2 100644 (file)
@@ -45,6 +45,8 @@ struct _GstNavSeek
 
   gdouble seek_offset;
   gboolean loop;
+  gboolean hold_eos;
+  GstEvent* eos;
   gboolean grab_seg_start;
   gboolean grab_seg_end;
   GstClockTime segment_start;