diff options
author | Tim-Philipp Müller <tim@centricular.com> | 2015-05-27 16:31:23 +0100 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2015-05-27 17:08:47 +0100 |
commit | 2e5df10ed908c28f06c1642dc8b3522c100e4f74 (patch) | |
tree | 8c732a0ed43491154b55be5bdfba3ca5f631f73c /gst | |
parent | b33d30621c5730af771b31509f5492beda1b49b0 (diff) | |
download | gstreamer-plugins-good-2e5df10ed908c28f06c1642dc8b3522c100e4f74.tar.gz |
dynudpsink: keep GCancellable fd around instead of re-creating it constantly
And create it only when starting the element.
Diffstat (limited to 'gst')
-rw-r--r-- | gst/udp/gstdynudpsink.c | 33 | ||||
-rw-r--r-- | gst/udp/gstdynudpsink.h | 1 |
2 files changed, 27 insertions, 7 deletions
diff --git a/gst/udp/gstdynudpsink.c b/gst/udp/gstdynudpsink.c index 2a23ddc48..f9cd5a258 100644 --- a/gst/udp/gstdynudpsink.c +++ b/gst/udp/gstdynudpsink.c @@ -162,7 +162,6 @@ gst_dynudpsink_init (GstDynUDPSink * sink) sink->used_socket = NULL; sink->used_socket_v6 = NULL; - sink->cancellable = g_cancellable_new (); } static void @@ -172,10 +171,6 @@ gst_dynudpsink_finalize (GObject * object) sink = GST_DYNUDPSINK (object); - if (sink->cancellable) - g_object_unref (sink->cancellable); - sink->cancellable = NULL; - if (sink->socket) g_object_unref (sink->socket); sink->socket = NULL; @@ -372,6 +367,26 @@ gst_dynudpsink_get_property (GObject * object, guint prop_id, GValue * value, } } +static void +gst_dynudpsink_create_cancellable (GstDynUDPSink * sink) +{ + GPollFD pollfd; + + sink->cancellable = g_cancellable_new (); + sink->made_cancel_fd = g_cancellable_make_pollfd (sink->cancellable, &pollfd); +} + +static void +gst_dynudpsink_free_cancellable (GstDynUDPSink * sink) +{ + if (sink->made_cancel_fd) { + g_cancellable_release_fd (sink->cancellable); + sink->made_cancel_fd = FALSE; + } + g_object_unref (sink->cancellable); + sink->cancellable = NULL; +} + /* create a socket for sending to remote machine */ static gboolean gst_dynudpsink_start (GstBaseSink * bsink) @@ -381,6 +396,8 @@ gst_dynudpsink_start (GstBaseSink * bsink) udpsink = GST_DYNUDPSINK (bsink); + gst_dynudpsink_create_cancellable (udpsink); + udpsink->external_socket = FALSE; if (udpsink->socket) { @@ -552,6 +569,8 @@ gst_dynudpsink_stop (GstBaseSink * bsink) udpsink->used_socket_v6 = NULL; } + gst_dynudpsink_free_cancellable (udpsink); + return TRUE; } @@ -574,8 +593,8 @@ gst_dynudpsink_unlock_stop (GstBaseSink * bsink) udpsink = GST_DYNUDPSINK (bsink); - g_object_unref (udpsink->cancellable); - udpsink->cancellable = g_cancellable_new (); + gst_dynudpsink_free_cancellable (udpsink); + gst_dynudpsink_create_cancellable (udpsink); return TRUE; } diff --git a/gst/udp/gstdynudpsink.h b/gst/udp/gstdynudpsink.h index 9b82eec8e..6d85bb669 100644 --- a/gst/udp/gstdynudpsink.h +++ b/gst/udp/gstdynudpsink.h @@ -52,6 +52,7 @@ struct _GstDynUDPSink { /* the socket in use */ GSocket *used_socket, *used_socket_v6; gboolean external_socket; + gboolean made_cancel_fd; GCancellable *cancellable; }; |