Commit 3290a06b authored by Wim Taymans's avatar Wim Taymans

libs/gst/base/gstbasesink.*: Make max-lateness a property.

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.
parent 6367b030
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> 2006-03-06 Wim Taymans <wim@fluendo.com>
* libs/gst/base/gstbasesink.c: (gst_base_sink_wait_clock), * libs/gst/base/gstbasesink.c: (gst_base_sink_wait_clock),
......
...@@ -132,13 +132,16 @@ enum ...@@ -132,13 +132,16 @@ enum
#define DEFAULT_CAN_ACTIVATE_PULL FALSE /* fixme: enable me */ #define DEFAULT_CAN_ACTIVATE_PULL FALSE /* fixme: enable me */
#define DEFAULT_CAN_ACTIVATE_PUSH TRUE #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 enum
{ {
PROP_0, PROP_0,
PROP_PREROLL_QUEUE_LEN, PROP_PREROLL_QUEUE_LEN,
PROP_SYNC PROP_SYNC,
PROP_MAX_LATENESS
}; };
static GstElementClass *parent_class = NULL; static GstElementClass *parent_class = NULL;
...@@ -226,14 +229,21 @@ gst_base_sink_class_init (GstBaseSinkClass * klass) ...@@ -226,14 +229,21 @@ gst_base_sink_class_init (GstBaseSinkClass * klass)
* upstream element, ie, the BUFFER_SIZE event. */ * upstream element, ie, the BUFFER_SIZE event. */
g_object_class_install_property (G_OBJECT_CLASS (klass), g_object_class_install_property (G_OBJECT_CLASS (klass),
PROP_PREROLL_QUEUE_LEN, PROP_PREROLL_QUEUE_LEN,
g_param_spec_uint ("preroll-queue-len", "preroll-queue-len", g_param_spec_uint ("preroll-queue-len", "Preroll queue length",
"Number of buffers to queue during preroll", 0, G_MAXUINT, 0, "Number of buffers to queue during preroll", 0, G_MAXUINT,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); DEFAULT_PREROLL_QUEUE_LEN, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SYNC, 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_spec_boolean ("sync", "Sync", "Sync on the clock", DEFAULT_SYNC,
G_PARAM_READWRITE)); 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 = gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_base_sink_change_state); GST_DEBUG_FUNCPTR (gst_base_sink_change_state);
gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_base_sink_send_event); 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) ...@@ -342,6 +352,7 @@ gst_base_sink_init (GstBaseSink * basesink, gpointer g_class)
basesink->pad_mode = GST_ACTIVATE_NONE; basesink->pad_mode = GST_ACTIVATE_NONE;
basesink->preroll_queue = g_queue_new (); basesink->preroll_queue = g_queue_new ();
basesink->abidata.ABI.clip_segment = gst_segment_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_push = DEFAULT_CAN_ACTIVATE_PUSH;
basesink->can_activate_pull = DEFAULT_CAN_ACTIVATE_PULL; basesink->can_activate_pull = DEFAULT_CAN_ACTIVATE_PULL;
...@@ -382,6 +393,11 @@ gst_base_sink_set_property (GObject * object, guint prop_id, ...@@ -382,6 +393,11 @@ gst_base_sink_set_property (GObject * object, guint prop_id,
sink->sync = g_value_get_boolean (value); sink->sync = g_value_get_boolean (value);
GST_OBJECT_UNLOCK (sink); GST_OBJECT_UNLOCK (sink);
break; 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: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
...@@ -405,6 +421,11 @@ gst_base_sink_get_property (GObject * object, guint prop_id, GValue * value, ...@@ -405,6 +421,11 @@ gst_base_sink_get_property (GObject * object, guint prop_id, GValue * value,
g_value_set_boolean (value, sink->sync); g_value_set_boolean (value, sink->sync);
GST_OBJECT_UNLOCK (sink); GST_OBJECT_UNLOCK (sink);
break; 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: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
...@@ -815,13 +836,16 @@ again: ...@@ -815,13 +836,16 @@ again:
goto again; goto again;
} }
if (status == GST_CLOCK_EARLY && jitter > (10 * GST_MSECOND)) { *late = FALSE;
/* FIXME, update clock stats here and do some QoS */
GST_DEBUG_OBJECT (basesink, "late: jitter!! %" G_GINT64_FORMAT "\n", if (basesink->abidata.ABI.max_lateness != -1) {
jitter); if (status == GST_CLOCK_EARLY
*late = TRUE; && jitter > basesink->abidata.ABI.max_lateness) {
} else { /* FIXME, update clock stats here and do some QoS */
*late = FALSE; GST_DEBUG_OBJECT (basesink, "late: jitter!! %" G_GINT64_FORMAT "\n",
jitter);
*late = TRUE;
}
} }
return GST_FLOW_OK; return GST_FLOW_OK;
......
...@@ -91,7 +91,9 @@ struct _GstBaseSink { ...@@ -91,7 +91,9 @@ struct _GstBaseSink {
union { union {
struct { struct {
/* segment used for clipping incomming buffers */ /* 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; } ABI;
/* adding + 0 to mark ABI change to be undone later */ /* adding + 0 to mark ABI change to be undone later */
gpointer _gst_reserved[GST_PADDING_LARGE + 0]; gpointer _gst_reserved[GST_PADDING_LARGE + 0];
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment