2 * Copyright (C) 2008 Wim Taymans <wim.taymans at gmail.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
20 * SECTION:rtsp-stream-transport
21 * @short_description: A media stream transport configuration
22 * @see_also: #GstRTSPStream
24 * Last reviewed on 2013-07-11 (1.0.0)
30 #include "rtsp-stream-transport.h"
32 #define GST_RTSP_STREAM_TRANSPORT_GET_PRIVATE(obj) \
33 (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_RTSP_STREAM_TRANSPORT, GstRTSPStreamTransportPrivate))
35 struct _GstRTSPStreamTransportPrivate
37 GstRTSPStream *stream;
39 GstRTSPSendFunc send_rtp;
40 GstRTSPSendFunc send_rtcp;
42 GDestroyNotify notify;
44 GstRTSPKeepAliveFunc keep_alive;
45 gpointer ka_user_data;
46 GDestroyNotify ka_notify;
50 GstRTSPTransport *transport;
61 GST_DEBUG_CATEGORY_STATIC (rtsp_stream_transport_debug);
62 #define GST_CAT_DEFAULT rtsp_stream_transport_debug
64 static void gst_rtsp_stream_transport_finalize (GObject * obj);
66 G_DEFINE_TYPE (GstRTSPStreamTransport, gst_rtsp_stream_transport,
70 gst_rtsp_stream_transport_class_init (GstRTSPStreamTransportClass * klass)
72 GObjectClass *gobject_class;
74 g_type_class_add_private (klass, sizeof (GstRTSPStreamTransportPrivate));
76 gobject_class = G_OBJECT_CLASS (klass);
78 gobject_class->finalize = gst_rtsp_stream_transport_finalize;
80 GST_DEBUG_CATEGORY_INIT (rtsp_stream_transport_debug, "rtspmediatransport",
81 0, "GstRTSPStreamTransport");
85 gst_rtsp_stream_transport_init (GstRTSPStreamTransport * trans)
87 GstRTSPStreamTransportPrivate *priv =
88 GST_RTSP_STREAM_TRANSPORT_GET_PRIVATE (trans);
94 gst_rtsp_stream_transport_finalize (GObject * obj)
96 GstRTSPStreamTransportPrivate *priv;
97 GstRTSPStreamTransport *trans;
99 trans = GST_RTSP_STREAM_TRANSPORT (obj);
102 /* remove callbacks now */
103 gst_rtsp_stream_transport_set_callbacks (trans, NULL, NULL, NULL, NULL);
104 gst_rtsp_stream_transport_set_keepalive (trans, NULL, NULL, NULL);
107 gst_rtsp_transport_free (priv->transport);
109 G_OBJECT_CLASS (gst_rtsp_stream_transport_parent_class)->finalize (obj);
113 * gst_rtsp_stream_transport_new:
114 * @stream: a #GstRTSPStream
115 * @tr: (transfer full): a GstRTSPTransport
117 * Create a new #GstRTSPStreamTransport that can be used to manage
118 * @stream with transport @tr.
120 * Returns: a new #GstRTSPStreamTransport
122 GstRTSPStreamTransport *
123 gst_rtsp_stream_transport_new (GstRTSPStream * stream, GstRTSPTransport * tr)
125 GstRTSPStreamTransportPrivate *priv;
126 GstRTSPStreamTransport *trans;
128 g_return_val_if_fail (GST_IS_RTSP_STREAM (stream), NULL);
129 g_return_val_if_fail (tr != NULL, NULL);
131 trans = g_object_new (GST_TYPE_RTSP_STREAM_TRANSPORT, NULL);
133 priv->stream = stream;
134 priv->transport = tr;
140 * gst_rtsp_stream_transport_get_stream:
141 * @trans: a #GstRTSPStreamTransport
143 * Get the #GstRTSPStream used when constructing @trans.
145 * Returns: (transfer none): the stream used when constructing @trans.
148 gst_rtsp_stream_transport_get_stream (GstRTSPStreamTransport * trans)
150 g_return_val_if_fail (GST_IS_RTSP_STREAM_TRANSPORT (trans), NULL);
152 return trans->priv->stream;
156 * gst_rtsp_stream_transport_set_callbacks:
157 * @trans: a #GstRTSPStreamTransport
158 * @send_rtp: (scope notified): a callback called when RTP should be sent
159 * @send_rtcp: (scope notified): a callback called when RTCP should be sent
160 * @user_data: user data passed to callbacks
161 * @notify: called with the user_data when no longer needed.
163 * Install callbacks that will be called when data for a stream should be sent
164 * to a client. This is usually used when sending RTP/RTCP over TCP.
167 gst_rtsp_stream_transport_set_callbacks (GstRTSPStreamTransport * trans,
168 GstRTSPSendFunc send_rtp, GstRTSPSendFunc send_rtcp,
169 gpointer user_data, GDestroyNotify notify)
171 GstRTSPStreamTransportPrivate *priv;
173 g_return_if_fail (GST_IS_RTSP_STREAM_TRANSPORT (trans));
177 priv->send_rtp = send_rtp;
178 priv->send_rtcp = send_rtcp;
180 priv->notify (priv->user_data);
181 priv->user_data = user_data;
182 priv->notify = notify;
186 * gst_rtsp_stream_transport_set_keepalive:
187 * @trans: a #GstRTSPStreamTransport
188 * @keep_alive: a callback called when the receiver is active
189 * @user_data: user data passed to callback
190 * @notify: called with the user_data when no longer needed.
192 * Install callbacks that will be called when RTCP packets are received from the
193 * receiver of @trans.
196 gst_rtsp_stream_transport_set_keepalive (GstRTSPStreamTransport * trans,
197 GstRTSPKeepAliveFunc keep_alive, gpointer user_data, GDestroyNotify notify)
199 GstRTSPStreamTransportPrivate *priv;
201 g_return_if_fail (GST_IS_RTSP_STREAM_TRANSPORT (trans));
205 priv->keep_alive = keep_alive;
207 priv->ka_notify (priv->ka_user_data);
208 priv->ka_user_data = user_data;
209 priv->ka_notify = notify;
214 * gst_rtsp_stream_transport_set_transport:
215 * @trans: a #GstRTSPStreamTransport
216 * @tr: (transfer full): a client #GstRTSPTransport
218 * Set @tr as the client transport. This function takes ownership of the
222 gst_rtsp_stream_transport_set_transport (GstRTSPStreamTransport * trans,
223 GstRTSPTransport * tr)
225 GstRTSPStreamTransportPrivate *priv;
227 g_return_if_fail (GST_IS_RTSP_STREAM_TRANSPORT (trans));
228 g_return_if_fail (tr != NULL);
232 /* keep track of the transports in the stream. */
234 gst_rtsp_transport_free (priv->transport);
235 priv->transport = tr;
239 * gst_rtsp_stream_transport_get_transport:
240 * @trans: a #GstRTSPStreamTransport
242 * Get the transport configured in @trans.
244 * Returns: (transfer none): the transport configured in @trans. It remains
245 * valid for as long as @trans is valid.
247 const GstRTSPTransport *
248 gst_rtsp_stream_transport_get_transport (GstRTSPStreamTransport * trans)
250 g_return_val_if_fail (GST_IS_RTSP_STREAM_TRANSPORT (trans), NULL);
252 return trans->priv->transport;
256 * gst_rtsp_stream_transport_set_active:
257 * @trans: a #GstRTSPStreamTransport
258 * @active: new state of @trans
260 * Activate or deactivate datatransfer configured in @trans.
262 * Returns: %TRUE when the state was changed.
265 gst_rtsp_stream_transport_set_active (GstRTSPStreamTransport * trans,
268 GstRTSPStreamTransportPrivate *priv;
271 g_return_val_if_fail (GST_IS_RTSP_STREAM_TRANSPORT (trans), FALSE);
275 if (priv->active == active)
279 res = gst_rtsp_stream_add_transport (priv->stream, trans);
281 res = gst_rtsp_stream_remove_transport (priv->stream, trans);
284 priv->active = active;
290 * gst_rtsp_stream_transport_set_timed_out:
291 * @trans: a #GstRTSPStreamTransport
292 * @timedout: timed out value
294 * Set the timed out state of @trans to @timedout
297 gst_rtsp_stream_transport_set_timed_out (GstRTSPStreamTransport * trans,
300 g_return_if_fail (GST_IS_RTSP_STREAM_TRANSPORT (trans));
302 trans->priv->timed_out = timedout;
306 * gst_rtsp_stream_transport_is_timed_out:
307 * @trans: a #GstRTSPStreamTransport
309 * Check if @trans is timed out.
311 * Returns: %TRUE if @trans timed out.
314 gst_rtsp_stream_transport_is_timed_out (GstRTSPStreamTransport * trans)
316 g_return_val_if_fail (GST_IS_RTSP_STREAM_TRANSPORT (trans), FALSE);
318 return trans->priv->timed_out;
322 * gst_rtsp_stream_transport_send_rtp:
323 * @trans: a #GstRTSPStreamTransport
324 * @buffer: a #GstBuffer
326 * Send @buffer to the installed RTP callback for @trans.
328 * Returns: %TRUE on success
331 gst_rtsp_stream_transport_send_rtp (GstRTSPStreamTransport * trans,
334 GstRTSPStreamTransportPrivate *priv;
335 gboolean res = FALSE;
341 priv->send_rtp (buffer, priv->transport->interleaved.min,
348 * gst_rtsp_stream_transport_send_rtcp:
349 * @trans: a #GstRTSPStreamTransport
350 * @buffer: a #GstBuffer
352 * Send @buffer to the installed RTCP callback for @trans.
354 * Returns: %TRUE on success
357 gst_rtsp_stream_transport_send_rtcp (GstRTSPStreamTransport * trans,
360 GstRTSPStreamTransportPrivate *priv;
361 gboolean res = FALSE;
367 priv->send_rtcp (buffer, priv->transport->interleaved.max,
374 * gst_rtsp_stream_transport_keep_alive:
375 * @trans: a #GstRTSPStreamTransport
377 * Signal the installed keep_alive callback for @trans.
380 gst_rtsp_stream_transport_keep_alive (GstRTSPStreamTransport * trans)
382 GstRTSPStreamTransportPrivate *priv;
386 if (priv->keep_alive)
387 priv->keep_alive (priv->ka_user_data);