libs/gst/base/gstbasesink.*: Make max-lateness a property.
authorWim Taymans <wim.taymans@gmail.com>
Mon, 6 Mar 2006 16:02:37 +0000 (16:02 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Mon, 6 Mar 2006 16:02:37 +0000 (16:02 +0000)
Original commit message from CVS:
* libs/gst/base/gstbasesink.c: (gst_base_sink_class_init),
(gst_base_sink_init), (gst_base_sink_set_property),
(gst_base_sink_get_property), (gst_base_sink_do_sync):
* libs/gst/base/gstbasesink.h:
Make max-lateness a property.

ChangeLog
libs/gst/base/gstbasesink.c
libs/gst/base/gstbasesink.h

index 4dbd8f3a5748e289a254a81059c9fcaa7273ca01..073a1b0bfc010c4089a4e9efa53b968fc3f42cd9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-03-06  Wim Taymans  <wim@fluendo.com>
+
+       * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init),
+       (gst_base_sink_init), (gst_base_sink_set_property),
+       (gst_base_sink_get_property), (gst_base_sink_do_sync):
+       * libs/gst/base/gstbasesink.h:
+       Make max-lateness a property.
+
 2006-03-06  Wim Taymans  <wim@fluendo.com>
 
        * libs/gst/base/gstbasesink.c: (gst_base_sink_wait_clock),
index 818aaccab1aacd6666dd3a30b757517f0ced3497..589f4ba278f4bc4d814cd12576b8c1913f72fc8b 100644 (file)
@@ -132,13 +132,16 @@ enum
 #define DEFAULT_CAN_ACTIVATE_PULL FALSE /* fixme: enable me */
 #define DEFAULT_CAN_ACTIVATE_PUSH TRUE
 
-#define DEFAULT_SYNC TRUE
+#define DEFAULT_PREROLL_QUEUE_LEN      0
+#define DEFAULT_SYNC                   TRUE
+#define DEFAULT_MAX_LATENESS           -1
 
 enum
 {
   PROP_0,
   PROP_PREROLL_QUEUE_LEN,
-  PROP_SYNC
+  PROP_SYNC,
+  PROP_MAX_LATENESS
 };
 
 static GstElementClass *parent_class = NULL;
@@ -226,14 +229,21 @@ gst_base_sink_class_init (GstBaseSinkClass * klass)
    * upstream element, ie, the BUFFER_SIZE event. */
   g_object_class_install_property (G_OBJECT_CLASS (klass),
       PROP_PREROLL_QUEUE_LEN,
-      g_param_spec_uint ("preroll-queue-len", "preroll-queue-len",
-          "Number of buffers to queue during preroll", 0, G_MAXUINT, 0,
-          G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+      g_param_spec_uint ("preroll-queue-len", "Preroll queue length",
+          "Number of buffers to queue during preroll", 0, G_MAXUINT,
+          DEFAULT_PREROLL_QUEUE_LEN, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 
   g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SYNC,
       g_param_spec_boolean ("sync", "Sync", "Sync on the clock", DEFAULT_SYNC,
           G_PARAM_READWRITE));
 
+  g_object_class_install_property (G_OBJECT_CLASS (klass),
+      PROP_MAX_LATENESS,
+      g_param_spec_int64 ("max-lateness", "Max Lateness",
+          "Maximum number of nanoseconds that a buffer can be late before it "
+          "is dropped (-1 unlimited)", -1, G_MAXINT64, DEFAULT_MAX_LATENESS,
+          G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
   gstelement_class->change_state =
       GST_DEBUG_FUNCPTR (gst_base_sink_change_state);
   gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_base_sink_send_event);
@@ -342,6 +352,7 @@ gst_base_sink_init (GstBaseSink * basesink, gpointer g_class)
   basesink->pad_mode = GST_ACTIVATE_NONE;
   basesink->preroll_queue = g_queue_new ();
   basesink->abidata.ABI.clip_segment = gst_segment_new ();
+  basesink->abidata.ABI.max_lateness = -1;
 
   basesink->can_activate_push = DEFAULT_CAN_ACTIVATE_PUSH;
   basesink->can_activate_pull = DEFAULT_CAN_ACTIVATE_PULL;
@@ -382,6 +393,11 @@ gst_base_sink_set_property (GObject * object, guint prop_id,
       sink->sync = g_value_get_boolean (value);
       GST_OBJECT_UNLOCK (sink);
       break;
+    case PROP_MAX_LATENESS:
+      GST_OBJECT_LOCK (sink);
+      sink->abidata.ABI.max_lateness = g_value_get_int64 (value);
+      GST_OBJECT_UNLOCK (sink);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -405,6 +421,11 @@ gst_base_sink_get_property (GObject * object, guint prop_id, GValue * value,
       g_value_set_boolean (value, sink->sync);
       GST_OBJECT_UNLOCK (sink);
       break;
+    case PROP_MAX_LATENESS:
+      GST_OBJECT_LOCK (sink);
+      g_value_set_int64 (value, sink->abidata.ABI.max_lateness);
+      GST_OBJECT_UNLOCK (sink);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -815,13 +836,16 @@ again:
     goto again;
   }
 
-  if (status == GST_CLOCK_EARLY && jitter > (10 * GST_MSECOND)) {
-    /* FIXME, update clock stats here and do some QoS */
-    GST_DEBUG_OBJECT (basesink, "late: jitter!! %" G_GINT64_FORMAT "\n",
-        jitter);
-    *late = TRUE;
-  } else {
-    *late = FALSE;
+  *late = FALSE;
+
+  if (basesink->abidata.ABI.max_lateness != -1) {
+    if (status == GST_CLOCK_EARLY
+        && jitter > basesink->abidata.ABI.max_lateness) {
+      /* FIXME, update clock stats here and do some QoS */
+      GST_DEBUG_OBJECT (basesink, "late: jitter!! %" G_GINT64_FORMAT "\n",
+          jitter);
+      *late = TRUE;
+    }
   }
 
   return GST_FLOW_OK;
index a47e10455a3e80e2d82d09ef8c6b5c7fcb4bfde3..7945d39d2c8d682d8005bb79fcf835c391039d1e 100644 (file)
@@ -91,7 +91,9 @@ struct _GstBaseSink {
   union {
     struct {
       /* segment used for clipping incomming buffers */
-      GstSegment  *clip_segment;
+      GstSegment    *clip_segment;
+      /* max amount of time a buffer can be late, -1 no limit. */
+      gint64        max_lateness;
     } ABI;
     /* adding + 0 to mark ABI change to be undone later */
     gpointer _gst_reserved[GST_PADDING_LARGE + 0];