From 0efee1eb17cd493fd10428568f9ee28909b6198c Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 17 Aug 2004 10:30:17 +0000 Subject: [PATCH] gst/tcp/gstmultifdsink.*: Added option to send a keyframe to clients as the first buffer. Original commit message from CVS: * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), (gst_multifdsink_init), (gst_multifdsink_add), (gst_multifdsink_client_queue_buffer), (gst_multifdsink_set_property), (gst_multifdsink_get_property): * gst/tcp/gstmultifdsink.h: Added option to send a keyframe to clients as the first buffer. Make timeout property writable. --- ChangeLog | 10 ++++++++++ gst/tcp/gstmultifdsink.c | 24 +++++++++++++++++++++++- gst/tcp/gstmultifdsink.h | 2 ++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 1b3c888..ca0e788 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2004-08-17 Wim Taymans + + * gst/tcp/gstmultifdsink.c: (gst_multifdsink_class_init), + (gst_multifdsink_init), (gst_multifdsink_add), + (gst_multifdsink_client_queue_buffer), + (gst_multifdsink_set_property), (gst_multifdsink_get_property): + * gst/tcp/gstmultifdsink.h: + Added option to send a keyframe to clients as the first buffer. + Make timeout property writable. + 2004-08-17 Thomas Vander Stichele patch by: Wim Taymans diff --git a/gst/tcp/gstmultifdsink.c b/gst/tcp/gstmultifdsink.c index 3a4a282..76a8754 100644 --- a/gst/tcp/gstmultifdsink.c +++ b/gst/tcp/gstmultifdsink.c @@ -94,6 +94,7 @@ enum #define DEFAULT_UNITS_SOFT_MAX -1 #define DEFAULT_RECOVER_POLICY GST_RECOVER_POLICY_NONE #define DEFAULT_TIMEOUT 0 +#define DEFAULT_SYNC_CLIENTS FALSE enum { @@ -113,6 +114,7 @@ enum ARG_RECOVER_POLICY, ARG_TIMEOUT, + ARG_SYNC_CLIENTS, ARG_BYTES_TO_SERVE, ARG_BYTES_SERVED, }; @@ -303,7 +305,11 @@ gst_multifdsink_class_init (GstMultiFdSinkClass * klass) g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TIMEOUT, g_param_spec_uint64 ("timeout", "Timeout", "Maximum inactivity timeout in nanoseconds for a client (0 = no limit)", - 0, G_MAXUINT64, DEFAULT_TIMEOUT, G_PARAM_READABLE)); + 0, G_MAXUINT64, DEFAULT_TIMEOUT, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SYNC_CLIENTS, + g_param_spec_boolean ("sync-clients", "Sync clients", + "Sync clients to a keyframe", + DEFAULT_SYNC_CLIENTS, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BYTES_TO_SERVE, g_param_spec_uint64 ("bytes-to-serve", "Bytes to serve", "Number of bytes received to serve to clients", 0, G_MAXUINT64, 0, @@ -377,6 +383,7 @@ gst_multifdsink_init (GstMultiFdSink * this) this->recover_policy = DEFAULT_RECOVER_POLICY; this->timeout = DEFAULT_TIMEOUT; + this->sync_clients = DEFAULT_SYNC_CLIENTS; } void @@ -397,6 +404,7 @@ gst_multifdsink_add (GstMultiFdSink * sink, int fd) client->bytes_sent = 0; client->dropped_buffers = 0; client->avg_queue_size = 0; + client->need_keyunit = sink->sync_clients; /* update start time */ g_get_current_time (&now); @@ -708,6 +716,14 @@ static gboolean gst_multifdsink_client_queue_buffer (GstMultiFdSink * sink, GstTCPClient * client, GstBuffer * buffer) { + if (client->need_keyunit) { + if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_DELTA_UNIT)) { + return TRUE; + } else if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_IN_CAPS)) { + client->need_keyunit = FALSE; + } + } + if (sink->protocol == GST_TCP_PROTOCOL_TYPE_GDP) { guint8 *header; guint len; @@ -1270,6 +1286,9 @@ gst_multifdsink_set_property (GObject * object, guint prop_id, case ARG_TIMEOUT: multifdsink->timeout = g_value_get_uint64 (value); break; + case ARG_SYNC_CLIENTS: + multifdsink->sync_clients = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -1323,6 +1342,9 @@ gst_multifdsink_get_property (GObject * object, guint prop_id, GValue * value, case ARG_TIMEOUT: g_value_set_uint64 (value, multifdsink->timeout); break; + case ARG_SYNC_CLIENTS: + g_value_set_boolean (value, multifdsink->sync_clients); + break; case ARG_BYTES_TO_SERVE: g_value_set_uint64 (value, multifdsink->bytes_to_serve); break; diff --git a/gst/tcp/gstmultifdsink.h b/gst/tcp/gstmultifdsink.h index 840ac70..4a68f5a 100644 --- a/gst/tcp/gstmultifdsink.h +++ b/gst/tcp/gstmultifdsink.h @@ -97,6 +97,7 @@ typedef struct { gboolean caps_sent; gboolean streamheader_sent; + gboolean need_keyunit; /* stats */ guint64 bytes_sent; @@ -142,6 +143,7 @@ struct _GstMultiFdSink { gint units_soft_max; /* max units a client can lag before recovery starts */ GstRecoverPolicy recover_policy; GstClockTime timeout; /* max amount of nanoseconds to remain idle */ + gboolean sync_clients;/* sync clients to keyframe */ /* stats */ gint buffers_queued; /* number of queued buffers */ -- 2.7.4