2 * Copyright (C) 2008 Wim Taymans <wim.taymans at gmail.com>
3 * Copyright (C) 2015 Centricular Ltd
4 * Author: Sebastian Dröge <sebastian@centricular.com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
22 * SECTION:rtsp-media-factory
23 * @short_description: A factory for media pipelines
24 * @see_also: #GstRTSPMountPoints, #GstRTSPMedia
26 * The #GstRTSPMediaFactory is responsible for creating or recycling
27 * #GstRTSPMedia objects based on the passed URL.
29 * The default implementation of the object can create #GstRTSPMedia objects
30 * containing a pipeline created from a launch description set with
31 * gst_rtsp_media_factory_set_launch().
33 * Media from a factory can be shared by setting the shared flag with
34 * gst_rtsp_media_factory_set_shared(). When a factory is shared,
35 * gst_rtsp_media_factory_construct() will return the same #GstRTSPMedia when
38 * Last reviewed on 2013-07-11 (1.0.0)
41 #include "rtsp-media-factory.h"
43 #define GST_RTSP_MEDIA_FACTORY_GET_LOCK(f) (&(GST_RTSP_MEDIA_FACTORY_CAST(f)->priv->lock))
44 #define GST_RTSP_MEDIA_FACTORY_LOCK(f) (g_mutex_lock(GST_RTSP_MEDIA_FACTORY_GET_LOCK(f)))
45 #define GST_RTSP_MEDIA_FACTORY_UNLOCK(f) (g_mutex_unlock(GST_RTSP_MEDIA_FACTORY_GET_LOCK(f)))
47 struct _GstRTSPMediaFactoryPrivate
49 GMutex lock; /* protects everything but medias */
50 GstRTSPPermissions *permissions;
53 GstRTSPSuspendMode suspend_mode;
54 gboolean eos_shutdown;
55 GstRTSPProfile profiles;
56 GstRTSPLowerTrans protocols;
58 GstRTSPAddressPool *pool;
59 GstRTSPTransportMode transport_mode;
60 gboolean stop_on_disconnect;
61 gchar *multicast_iface;
63 GstClockTime rtx_time;
65 gboolean do_retransmission;
68 GHashTable *medias; /* protected by medias_lock */
74 GstRTSPPublishClockMode publish_clock_mode;
77 #define DEFAULT_LAUNCH NULL
78 #define DEFAULT_SHARED FALSE
79 #define DEFAULT_SUSPEND_MODE GST_RTSP_SUSPEND_MODE_NONE
80 #define DEFAULT_EOS_SHUTDOWN FALSE
81 #define DEFAULT_PROFILES GST_RTSP_PROFILE_AVP
82 #define DEFAULT_PROTOCOLS GST_RTSP_LOWER_TRANS_UDP | GST_RTSP_LOWER_TRANS_UDP_MCAST | \
83 GST_RTSP_LOWER_TRANS_TCP
84 #define DEFAULT_BUFFER_SIZE 0x80000
85 #define DEFAULT_LATENCY 200
86 #define DEFAULT_TRANSPORT_MODE GST_RTSP_TRANSPORT_MODE_PLAY
87 #define DEFAULT_STOP_ON_DISCONNECT TRUE
88 #define DEFAULT_DO_RETRANSMISSION FALSE
102 PROP_STOP_ON_DISCONNECT,
109 SIGNAL_MEDIA_CONSTRUCTED,
110 SIGNAL_MEDIA_CONFIGURE,
114 GST_DEBUG_CATEGORY_STATIC (rtsp_media_debug);
115 #define GST_CAT_DEFAULT rtsp_media_debug
117 static guint gst_rtsp_media_factory_signals[SIGNAL_LAST] = { 0 };
119 static void gst_rtsp_media_factory_get_property (GObject * object, guint propid,
120 GValue * value, GParamSpec * pspec);
121 static void gst_rtsp_media_factory_set_property (GObject * object, guint propid,
122 const GValue * value, GParamSpec * pspec);
123 static void gst_rtsp_media_factory_finalize (GObject * obj);
125 static gchar *default_gen_key (GstRTSPMediaFactory * factory,
126 const GstRTSPUrl * url);
127 static GstElement *default_create_element (GstRTSPMediaFactory * factory,
128 const GstRTSPUrl * url);
129 static GstRTSPMedia *default_construct (GstRTSPMediaFactory * factory,
130 const GstRTSPUrl * url);
131 static void default_configure (GstRTSPMediaFactory * factory,
132 GstRTSPMedia * media);
133 static GstElement *default_create_pipeline (GstRTSPMediaFactory * factory,
134 GstRTSPMedia * media);
136 G_DEFINE_TYPE_WITH_PRIVATE (GstRTSPMediaFactory, gst_rtsp_media_factory,
140 gst_rtsp_media_factory_class_init (GstRTSPMediaFactoryClass * klass)
142 GObjectClass *gobject_class;
144 gobject_class = G_OBJECT_CLASS (klass);
146 gobject_class->get_property = gst_rtsp_media_factory_get_property;
147 gobject_class->set_property = gst_rtsp_media_factory_set_property;
148 gobject_class->finalize = gst_rtsp_media_factory_finalize;
151 * GstRTSPMediaFactory::launch:
153 * The gst_parse_launch() line to use for constructing the pipeline in the
154 * default prepare vmethod.
156 * The pipeline description should return a GstBin as the toplevel element
157 * which can be accomplished by enclosing the description with brackets '('
160 * The description should return a pipeline with payloaders named pay0, pay1,
161 * etc.. Each of the payloaders will result in a stream.
163 * Support for dynamic payloaders can be accomplished by adding payloaders
164 * named dynpay0, dynpay1, etc..
166 g_object_class_install_property (gobject_class, PROP_LAUNCH,
167 g_param_spec_string ("launch", "Launch",
168 "A launch description of the pipeline", DEFAULT_LAUNCH,
169 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
171 g_object_class_install_property (gobject_class, PROP_SHARED,
172 g_param_spec_boolean ("shared", "Shared",
173 "If media from this factory is shared", DEFAULT_SHARED,
174 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
176 g_object_class_install_property (gobject_class, PROP_SUSPEND_MODE,
177 g_param_spec_enum ("suspend-mode", "Suspend Mode",
178 "Control how media will be suspended", GST_TYPE_RTSP_SUSPEND_MODE,
179 DEFAULT_SUSPEND_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
181 g_object_class_install_property (gobject_class, PROP_EOS_SHUTDOWN,
182 g_param_spec_boolean ("eos-shutdown", "EOS Shutdown",
183 "Send EOS down the pipeline before shutting down",
184 DEFAULT_EOS_SHUTDOWN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
186 g_object_class_install_property (gobject_class, PROP_PROFILES,
187 g_param_spec_flags ("profiles", "Profiles",
188 "Allowed transfer profiles", GST_TYPE_RTSP_PROFILE,
189 DEFAULT_PROFILES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
191 g_object_class_install_property (gobject_class, PROP_PROTOCOLS,
192 g_param_spec_flags ("protocols", "Protocols",
193 "Allowed lower transport protocols", GST_TYPE_RTSP_LOWER_TRANS,
194 DEFAULT_PROTOCOLS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
196 g_object_class_install_property (gobject_class, PROP_BUFFER_SIZE,
197 g_param_spec_uint ("buffer-size", "Buffer Size",
198 "The kernel UDP buffer size to use", 0, G_MAXUINT,
199 DEFAULT_BUFFER_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
201 g_object_class_install_property (gobject_class, PROP_LATENCY,
202 g_param_spec_uint ("latency", "Latency",
203 "Latency used for receiving media in milliseconds", 0, G_MAXUINT,
204 DEFAULT_LATENCY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
206 g_object_class_install_property (gobject_class, PROP_TRANSPORT_MODE,
207 g_param_spec_flags ("transport-mode", "Transport Mode",
208 "If media from this factory is for PLAY or RECORD",
209 GST_TYPE_RTSP_TRANSPORT_MODE, DEFAULT_TRANSPORT_MODE,
210 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
212 g_object_class_install_property (gobject_class, PROP_STOP_ON_DISCONNECT,
213 g_param_spec_boolean ("stop-on-disconnect", "Stop On Disconnect",
214 "If media from this factory should be stopped "
215 "when a client disconnects without TEARDOWN",
216 DEFAULT_STOP_ON_DISCONNECT,
217 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
219 g_object_class_install_property (gobject_class, PROP_CLOCK,
220 g_param_spec_object ("clock", "Clock",
221 "Clock to be used by the pipelines created for all "
222 "medias of this factory", GST_TYPE_CLOCK,
223 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
225 gst_rtsp_media_factory_signals[SIGNAL_MEDIA_CONSTRUCTED] =
226 g_signal_new ("media-constructed", G_TYPE_FROM_CLASS (klass),
227 G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTSPMediaFactoryClass,
228 media_constructed), NULL, NULL, g_cclosure_marshal_generic,
229 G_TYPE_NONE, 1, GST_TYPE_RTSP_MEDIA);
231 gst_rtsp_media_factory_signals[SIGNAL_MEDIA_CONFIGURE] =
232 g_signal_new ("media-configure", G_TYPE_FROM_CLASS (klass),
233 G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTSPMediaFactoryClass,
234 media_configure), NULL, NULL, g_cclosure_marshal_generic,
235 G_TYPE_NONE, 1, GST_TYPE_RTSP_MEDIA);
237 klass->gen_key = default_gen_key;
238 klass->create_element = default_create_element;
239 klass->construct = default_construct;
240 klass->configure = default_configure;
241 klass->create_pipeline = default_create_pipeline;
243 GST_DEBUG_CATEGORY_INIT (rtsp_media_debug, "rtspmediafactory", 0,
244 "GstRTSPMediaFactory");
248 gst_rtsp_media_factory_init (GstRTSPMediaFactory * factory)
250 GstRTSPMediaFactoryPrivate *priv =
251 gst_rtsp_media_factory_get_instance_private (factory);
252 factory->priv = priv;
254 priv->launch = g_strdup (DEFAULT_LAUNCH);
255 priv->shared = DEFAULT_SHARED;
256 priv->suspend_mode = DEFAULT_SUSPEND_MODE;
257 priv->eos_shutdown = DEFAULT_EOS_SHUTDOWN;
258 priv->profiles = DEFAULT_PROFILES;
259 priv->protocols = DEFAULT_PROTOCOLS;
260 priv->buffer_size = DEFAULT_BUFFER_SIZE;
261 priv->latency = DEFAULT_LATENCY;
262 priv->transport_mode = DEFAULT_TRANSPORT_MODE;
263 priv->stop_on_disconnect = DEFAULT_STOP_ON_DISCONNECT;
264 priv->publish_clock_mode = GST_RTSP_PUBLISH_CLOCK_MODE_CLOCK;
265 priv->do_retransmission = DEFAULT_DO_RETRANSMISSION;
267 g_mutex_init (&priv->lock);
268 g_mutex_init (&priv->medias_lock);
269 priv->medias = g_hash_table_new_full (g_str_hash, g_str_equal,
270 g_free, g_object_unref);
271 priv->media_gtype = GST_TYPE_RTSP_MEDIA;
275 gst_rtsp_media_factory_finalize (GObject * obj)
277 GstRTSPMediaFactory *factory = GST_RTSP_MEDIA_FACTORY (obj);
278 GstRTSPMediaFactoryPrivate *priv = factory->priv;
281 gst_object_unref (priv->clock);
282 if (priv->permissions)
283 gst_rtsp_permissions_unref (priv->permissions);
284 g_hash_table_unref (priv->medias);
285 g_mutex_clear (&priv->medias_lock);
286 g_free (priv->launch);
287 g_mutex_clear (&priv->lock);
289 g_object_unref (priv->pool);
290 g_free (priv->multicast_iface);
292 G_OBJECT_CLASS (gst_rtsp_media_factory_parent_class)->finalize (obj);
296 gst_rtsp_media_factory_get_property (GObject * object, guint propid,
297 GValue * value, GParamSpec * pspec)
299 GstRTSPMediaFactory *factory = GST_RTSP_MEDIA_FACTORY (object);
303 g_value_take_string (value, gst_rtsp_media_factory_get_launch (factory));
306 g_value_set_boolean (value, gst_rtsp_media_factory_is_shared (factory));
308 case PROP_SUSPEND_MODE:
309 g_value_set_enum (value,
310 gst_rtsp_media_factory_get_suspend_mode (factory));
312 case PROP_EOS_SHUTDOWN:
313 g_value_set_boolean (value,
314 gst_rtsp_media_factory_is_eos_shutdown (factory));
317 g_value_set_flags (value, gst_rtsp_media_factory_get_profiles (factory));
320 g_value_set_flags (value, gst_rtsp_media_factory_get_protocols (factory));
322 case PROP_BUFFER_SIZE:
323 g_value_set_uint (value,
324 gst_rtsp_media_factory_get_buffer_size (factory));
327 g_value_set_uint (value, gst_rtsp_media_factory_get_latency (factory));
329 case PROP_TRANSPORT_MODE:
330 g_value_set_flags (value,
331 gst_rtsp_media_factory_get_transport_mode (factory));
333 case PROP_STOP_ON_DISCONNECT:
334 g_value_set_boolean (value,
335 gst_rtsp_media_factory_is_stop_on_disonnect (factory));
338 g_value_take_object (value, gst_rtsp_media_factory_get_clock (factory));
341 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
346 gst_rtsp_media_factory_set_property (GObject * object, guint propid,
347 const GValue * value, GParamSpec * pspec)
349 GstRTSPMediaFactory *factory = GST_RTSP_MEDIA_FACTORY (object);
353 gst_rtsp_media_factory_set_launch (factory, g_value_get_string (value));
356 gst_rtsp_media_factory_set_shared (factory, g_value_get_boolean (value));
358 case PROP_SUSPEND_MODE:
359 gst_rtsp_media_factory_set_suspend_mode (factory,
360 g_value_get_enum (value));
362 case PROP_EOS_SHUTDOWN:
363 gst_rtsp_media_factory_set_eos_shutdown (factory,
364 g_value_get_boolean (value));
367 gst_rtsp_media_factory_set_profiles (factory, g_value_get_flags (value));
370 gst_rtsp_media_factory_set_protocols (factory, g_value_get_flags (value));
372 case PROP_BUFFER_SIZE:
373 gst_rtsp_media_factory_set_buffer_size (factory,
374 g_value_get_uint (value));
377 gst_rtsp_media_factory_set_latency (factory, g_value_get_uint (value));
379 case PROP_TRANSPORT_MODE:
380 gst_rtsp_media_factory_set_transport_mode (factory,
381 g_value_get_flags (value));
383 case PROP_STOP_ON_DISCONNECT:
384 gst_rtsp_media_factory_set_stop_on_disconnect (factory,
385 g_value_get_boolean (value));
388 gst_rtsp_media_factory_set_clock (factory, g_value_get_object (value));
391 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
396 * gst_rtsp_media_factory_new:
398 * Create a new #GstRTSPMediaFactory instance.
400 * Returns: (transfer full): a new #GstRTSPMediaFactory object.
402 GstRTSPMediaFactory *
403 gst_rtsp_media_factory_new (void)
405 GstRTSPMediaFactory *result;
407 result = g_object_new (GST_TYPE_RTSP_MEDIA_FACTORY, NULL);
413 * gst_rtsp_media_factory_set_permissions:
414 * @factory: a #GstRTSPMediaFactory
415 * @permissions: (transfer none) (nullable): a #GstRTSPPermissions
417 * Set @permissions on @factory.
420 gst_rtsp_media_factory_set_permissions (GstRTSPMediaFactory * factory,
421 GstRTSPPermissions * permissions)
423 GstRTSPMediaFactoryPrivate *priv;
425 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
427 priv = factory->priv;
429 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
430 if (priv->permissions)
431 gst_rtsp_permissions_unref (priv->permissions);
432 if ((priv->permissions = permissions))
433 gst_rtsp_permissions_ref (permissions);
434 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
438 * gst_rtsp_media_factory_get_permissions:
439 * @factory: a #GstRTSPMediaFactory
441 * Get the permissions object from @factory.
443 * Returns: (transfer full) (nullable): a #GstRTSPPermissions object, unref after usage.
446 gst_rtsp_media_factory_get_permissions (GstRTSPMediaFactory * factory)
448 GstRTSPMediaFactoryPrivate *priv;
449 GstRTSPPermissions *result;
451 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), NULL);
453 priv = factory->priv;
455 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
456 if ((result = priv->permissions))
457 gst_rtsp_permissions_ref (result);
458 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
464 * gst_rtsp_media_factory_add_role:
465 * @factory: a #GstRTSPMediaFactory
467 * @fieldname: the first field name
468 * @...: additional arguments
470 * A convenience method to add @role with @fieldname and additional arguments to
471 * the permissions of @factory. If @factory had no permissions, new permissions
472 * will be created and the role will be added to it.
475 gst_rtsp_media_factory_add_role (GstRTSPMediaFactory * factory,
476 const gchar * role, const gchar * fieldname, ...)
478 GstRTSPMediaFactoryPrivate *priv;
481 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
482 g_return_if_fail (role != NULL);
483 g_return_if_fail (fieldname != NULL);
485 priv = factory->priv;
487 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
488 if (priv->permissions == NULL)
489 priv->permissions = gst_rtsp_permissions_new ();
491 va_start (var_args, fieldname);
492 gst_rtsp_permissions_add_role_valist (priv->permissions, role, fieldname,
495 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
499 * gst_rtsp_media_factory_add_role_from_structure:
501 * A convenience wrapper around gst_rtsp_permissions_add_role_from_structure().
502 * If @factory had no permissions, new permissions will be created and the
503 * role will be added to it.
508 gst_rtsp_media_factory_add_role_from_structure (GstRTSPMediaFactory * factory,
509 GstStructure * structure)
511 GstRTSPMediaFactoryPrivate *priv;
512 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
513 g_return_if_fail (GST_IS_STRUCTURE (structure));
515 priv = factory->priv;
517 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
518 if (priv->permissions == NULL)
519 priv->permissions = gst_rtsp_permissions_new ();
521 gst_rtsp_permissions_add_role_from_structure (priv->permissions, structure);
522 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
526 * gst_rtsp_media_factory_set_launch:
527 * @factory: a #GstRTSPMediaFactory
528 * @launch: the launch description
531 * The gst_parse_launch() line to use for constructing the pipeline in the
532 * default prepare vmethod.
534 * The pipeline description should return a GstBin as the toplevel element
535 * which can be accomplished by enclosing the description with brackets '('
538 * The description should return a pipeline with payloaders named pay0, pay1,
539 * etc.. Each of the payloaders will result in a stream.
542 gst_rtsp_media_factory_set_launch (GstRTSPMediaFactory * factory,
543 const gchar * launch)
545 GstRTSPMediaFactoryPrivate *priv;
547 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
548 g_return_if_fail (launch != NULL);
550 priv = factory->priv;
552 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
553 g_free (priv->launch);
554 priv->launch = g_strdup (launch);
555 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
559 * gst_rtsp_media_factory_get_launch:
560 * @factory: a #GstRTSPMediaFactory
562 * Get the gst_parse_launch() pipeline description that will be used in the
563 * default prepare vmethod.
565 * Returns: (transfer full) (nullable): the configured launch description. g_free() after
569 gst_rtsp_media_factory_get_launch (GstRTSPMediaFactory * factory)
571 GstRTSPMediaFactoryPrivate *priv;
574 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), NULL);
576 priv = factory->priv;
578 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
579 result = g_strdup (priv->launch);
580 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
586 * gst_rtsp_media_factory_set_suspend_mode:
587 * @factory: a #GstRTSPMediaFactory
588 * @mode: the new #GstRTSPSuspendMode
590 * Configure how media created from this factory will be suspended.
593 gst_rtsp_media_factory_set_suspend_mode (GstRTSPMediaFactory * factory,
594 GstRTSPSuspendMode mode)
596 GstRTSPMediaFactoryPrivate *priv;
598 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
600 priv = factory->priv;
602 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
603 priv->suspend_mode = mode;
604 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
608 * gst_rtsp_media_factory_get_suspend_mode:
609 * @factory: a #GstRTSPMediaFactory
611 * Get how media created from this factory will be suspended.
613 * Returns: a #GstRTSPSuspendMode.
616 gst_rtsp_media_factory_get_suspend_mode (GstRTSPMediaFactory * factory)
618 GstRTSPMediaFactoryPrivate *priv;
619 GstRTSPSuspendMode result;
621 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory),
622 GST_RTSP_SUSPEND_MODE_NONE);
624 priv = factory->priv;
626 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
627 result = priv->suspend_mode;
628 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
634 * gst_rtsp_media_factory_set_shared:
635 * @factory: a #GstRTSPMediaFactory
636 * @shared: the new value
638 * Configure if media created from this factory can be shared between clients.
641 gst_rtsp_media_factory_set_shared (GstRTSPMediaFactory * factory,
644 GstRTSPMediaFactoryPrivate *priv;
646 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
648 priv = factory->priv;
650 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
651 priv->shared = shared;
652 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
656 * gst_rtsp_media_factory_is_shared:
657 * @factory: a #GstRTSPMediaFactory
659 * Get if media created from this factory can be shared between clients.
661 * Returns: %TRUE if the media will be shared between clients.
664 gst_rtsp_media_factory_is_shared (GstRTSPMediaFactory * factory)
666 GstRTSPMediaFactoryPrivate *priv;
669 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), FALSE);
671 priv = factory->priv;
673 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
674 result = priv->shared;
675 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
681 * gst_rtsp_media_factory_set_eos_shutdown:
682 * @factory: a #GstRTSPMediaFactory
683 * @eos_shutdown: the new value
685 * Configure if media created from this factory will have an EOS sent to the
686 * pipeline before shutdown.
689 gst_rtsp_media_factory_set_eos_shutdown (GstRTSPMediaFactory * factory,
690 gboolean eos_shutdown)
692 GstRTSPMediaFactoryPrivate *priv;
694 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
696 priv = factory->priv;
698 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
699 priv->eos_shutdown = eos_shutdown;
700 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
704 * gst_rtsp_media_factory_is_eos_shutdown:
705 * @factory: a #GstRTSPMediaFactory
707 * Get if media created from this factory will have an EOS event sent to the
708 * pipeline before shutdown.
710 * Returns: %TRUE if the media will receive EOS before shutdown.
713 gst_rtsp_media_factory_is_eos_shutdown (GstRTSPMediaFactory * factory)
715 GstRTSPMediaFactoryPrivate *priv;
718 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), FALSE);
720 priv = factory->priv;
722 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
723 result = priv->eos_shutdown;
724 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
730 * gst_rtsp_media_factory_set_buffer_size:
731 * @factory: a #GstRTSPMedia
732 * @size: the new value
734 * Set the kernel UDP buffer size.
737 gst_rtsp_media_factory_set_buffer_size (GstRTSPMediaFactory * factory,
740 GstRTSPMediaFactoryPrivate *priv;
742 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
744 priv = factory->priv;
746 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
747 priv->buffer_size = size;
748 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
752 * gst_rtsp_media_factory_get_buffer_size:
753 * @factory: a #GstRTSPMedia
755 * Get the kernel UDP buffer size.
757 * Returns: the kernel UDP buffer size.
760 gst_rtsp_media_factory_get_buffer_size (GstRTSPMediaFactory * factory)
762 GstRTSPMediaFactoryPrivate *priv;
765 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), 0);
767 priv = factory->priv;
769 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
770 result = priv->buffer_size;
771 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
777 * gst_rtsp_media_factory_set_address_pool:
778 * @factory: a #GstRTSPMediaFactory
779 * @pool: (transfer none) (nullable): a #GstRTSPAddressPool
781 * configure @pool to be used as the address pool of @factory.
784 gst_rtsp_media_factory_set_address_pool (GstRTSPMediaFactory * factory,
785 GstRTSPAddressPool * pool)
787 GstRTSPMediaFactoryPrivate *priv;
788 GstRTSPAddressPool *old;
790 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
792 priv = factory->priv;
794 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
795 if ((old = priv->pool) != pool)
796 priv->pool = pool ? g_object_ref (pool) : NULL;
799 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
802 g_object_unref (old);
806 * gst_rtsp_media_factory_get_address_pool:
807 * @factory: a #GstRTSPMediaFactory
809 * Get the #GstRTSPAddressPool used as the address pool of @factory.
811 * Returns: (transfer full) (nullable): the #GstRTSPAddressPool of @factory. g_object_unref() after
815 gst_rtsp_media_factory_get_address_pool (GstRTSPMediaFactory * factory)
817 GstRTSPMediaFactoryPrivate *priv;
818 GstRTSPAddressPool *result;
820 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), NULL);
822 priv = factory->priv;
824 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
825 if ((result = priv->pool))
826 g_object_ref (result);
827 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
833 * gst_rtsp_media_factory_set_multicast_iface:
834 * @factory: a #GstRTSPMediaFactory
835 * @multicast_iface: (transfer none) (nullable): a multicast interface name
837 * configure @multicast_iface to be used for @factory.
840 gst_rtsp_media_factory_set_multicast_iface (GstRTSPMediaFactory * media_factory,
841 const gchar * multicast_iface)
843 GstRTSPMediaFactoryPrivate *priv;
846 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (media_factory));
848 priv = media_factory->priv;
850 GST_LOG_OBJECT (media_factory, "set multicast interface %s", multicast_iface);
852 g_mutex_lock (&priv->lock);
853 if ((old = priv->multicast_iface) != multicast_iface)
854 priv->multicast_iface = multicast_iface ? g_strdup (multicast_iface) : NULL;
857 g_mutex_unlock (&priv->lock);
864 * gst_rtsp_media_factory_get_multicast_iface:
865 * @factory: a #GstRTSPMediaFactory
867 * Get the multicast interface used for @factory.
869 * Returns: (transfer full) (nullable): the multicast interface for @factory. g_free() after
873 gst_rtsp_media_factory_get_multicast_iface (GstRTSPMediaFactory * media_factory)
875 GstRTSPMediaFactoryPrivate *priv;
878 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (media_factory), NULL);
880 priv = media_factory->priv;
882 g_mutex_lock (&priv->lock);
883 if ((result = priv->multicast_iface))
884 result = g_strdup (result);
885 g_mutex_unlock (&priv->lock);
891 * gst_rtsp_media_factory_set_profiles:
892 * @factory: a #GstRTSPMediaFactory
893 * @profiles: the new flags
895 * Configure the allowed profiles for @factory.
898 gst_rtsp_media_factory_set_profiles (GstRTSPMediaFactory * factory,
899 GstRTSPProfile profiles)
901 GstRTSPMediaFactoryPrivate *priv;
903 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
905 priv = factory->priv;
907 GST_DEBUG_OBJECT (factory, "profiles %d", profiles);
909 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
910 priv->profiles = profiles;
911 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
915 * gst_rtsp_media_factory_get_profiles:
916 * @factory: a #GstRTSPMediaFactory
918 * Get the allowed profiles of @factory.
920 * Returns: a #GstRTSPProfile
923 gst_rtsp_media_factory_get_profiles (GstRTSPMediaFactory * factory)
925 GstRTSPMediaFactoryPrivate *priv;
928 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory),
929 GST_RTSP_PROFILE_UNKNOWN);
931 priv = factory->priv;
933 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
934 res = priv->profiles;
935 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
941 * gst_rtsp_media_factory_set_protocols:
942 * @factory: a #GstRTSPMediaFactory
943 * @protocols: the new flags
945 * Configure the allowed lower transport for @factory.
948 gst_rtsp_media_factory_set_protocols (GstRTSPMediaFactory * factory,
949 GstRTSPLowerTrans protocols)
951 GstRTSPMediaFactoryPrivate *priv;
953 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
955 priv = factory->priv;
957 GST_DEBUG_OBJECT (factory, "protocols %d", protocols);
959 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
960 priv->protocols = protocols;
961 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
965 * gst_rtsp_media_factory_get_protocols:
966 * @factory: a #GstRTSPMediaFactory
968 * Get the allowed protocols of @factory.
970 * Returns: a #GstRTSPLowerTrans
973 gst_rtsp_media_factory_get_protocols (GstRTSPMediaFactory * factory)
975 GstRTSPMediaFactoryPrivate *priv;
976 GstRTSPLowerTrans res;
978 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory),
979 GST_RTSP_LOWER_TRANS_UNKNOWN);
981 priv = factory->priv;
983 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
984 res = priv->protocols;
985 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
991 * gst_rtsp_media_factory_set_stop_on_disconnect:
992 * @factory: a #GstRTSPMediaFactory
993 * @stop_on_disconnect: the new value
995 * Configure if media created from this factory should be stopped
996 * when a client disconnects without sending TEARDOWN.
999 gst_rtsp_media_factory_set_stop_on_disconnect (GstRTSPMediaFactory * factory,
1000 gboolean stop_on_disconnect)
1002 GstRTSPMediaFactoryPrivate *priv;
1004 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
1006 priv = factory->priv;
1008 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1009 priv->stop_on_disconnect = stop_on_disconnect;
1010 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1014 * gst_rtsp_media_factory_is_stop_on_disconnect:
1015 * @factory: a #GstRTSPMediaFactory
1017 * Get if media created from this factory should be stopped when a client
1018 * disconnects without sending TEARDOWN.
1020 * Returns: %TRUE if the media will be stopped when a client disconnects
1021 * without sending TEARDOWN.
1024 gst_rtsp_media_factory_is_stop_on_disonnect (GstRTSPMediaFactory * factory)
1026 GstRTSPMediaFactoryPrivate *priv;
1029 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), TRUE);
1031 priv = factory->priv;
1033 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1034 result = priv->stop_on_disconnect;
1035 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1041 * gst_rtsp_media_factory_set_retransmission_time:
1042 * @factory: a #GstRTSPMediaFactory
1043 * @time: a #GstClockTime
1045 * Configure the time to store for possible retransmission
1048 gst_rtsp_media_factory_set_retransmission_time (GstRTSPMediaFactory * factory,
1051 GstRTSPMediaFactoryPrivate *priv;
1053 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
1055 priv = factory->priv;
1057 GST_DEBUG_OBJECT (factory, "retransmission time %" G_GUINT64_FORMAT, time);
1059 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1060 priv->rtx_time = time;
1061 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1065 * gst_rtsp_media_factory_get_retransmission_time:
1066 * @factory: a #GstRTSPMediaFactory
1068 * Get the time that is stored for retransmission purposes
1070 * Returns: a #GstClockTime
1073 gst_rtsp_media_factory_get_retransmission_time (GstRTSPMediaFactory * factory)
1075 GstRTSPMediaFactoryPrivate *priv;
1078 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), 0);
1080 priv = factory->priv;
1082 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1083 res = priv->rtx_time;
1084 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1090 * gst_rtsp_media_factory_set_do_retransmission:
1092 * Set whether retransmission requests will be sent for
1098 gst_rtsp_media_factory_set_do_retransmission (GstRTSPMediaFactory * factory,
1099 gboolean do_retransmission)
1101 GstRTSPMediaFactoryPrivate *priv;
1103 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
1105 priv = factory->priv;
1107 GST_DEBUG_OBJECT (factory, "Do retransmission %d", do_retransmission);
1109 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1110 priv->do_retransmission = do_retransmission;
1111 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1115 * gst_rtsp_media_factory_get_do_retransmission:
1117 * Returns: Whether retransmission requests will be sent for receiving media
1122 gst_rtsp_media_factory_get_do_retransmission (GstRTSPMediaFactory * factory)
1124 GstRTSPMediaFactoryPrivate *priv;
1127 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), 0);
1129 priv = factory->priv;
1131 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1132 res = priv->do_retransmission;
1133 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1139 * gst_rtsp_media_factory_set_latency:
1140 * @factory: a #GstRTSPMediaFactory
1141 * @latency: latency in milliseconds
1143 * Configure the latency used for receiving media
1146 gst_rtsp_media_factory_set_latency (GstRTSPMediaFactory * factory,
1149 GstRTSPMediaFactoryPrivate *priv;
1151 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
1153 priv = factory->priv;
1155 GST_DEBUG_OBJECT (factory, "latency %ums", latency);
1157 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1158 priv->latency = latency;
1159 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1163 * gst_rtsp_media_factory_get_latency:
1164 * @factory: a #GstRTSPMediaFactory
1166 * Get the latency that is used for receiving media
1168 * Returns: latency in milliseconds
1171 gst_rtsp_media_factory_get_latency (GstRTSPMediaFactory * factory)
1173 GstRTSPMediaFactoryPrivate *priv;
1176 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), 0);
1178 priv = factory->priv;
1180 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1181 res = priv->latency;
1182 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1188 compare_media (gpointer key, GstRTSPMedia * media1, GstRTSPMedia * media2)
1190 return (media1 == media2);
1194 media_unprepared (GstRTSPMedia * media, GWeakRef * ref)
1196 GstRTSPMediaFactory *factory = g_weak_ref_get (ref);
1197 GstRTSPMediaFactoryPrivate *priv;
1202 priv = factory->priv;
1204 g_mutex_lock (&priv->medias_lock);
1205 g_hash_table_foreach_remove (priv->medias, (GHRFunc) compare_media, media);
1206 g_mutex_unlock (&priv->medias_lock);
1208 g_object_unref (factory);
1212 weak_ref_new (gpointer obj)
1214 GWeakRef *ref = g_slice_new (GWeakRef);
1216 g_weak_ref_init (ref, obj);
1221 weak_ref_free (GWeakRef * ref)
1223 g_weak_ref_clear (ref);
1224 g_slice_free (GWeakRef, ref);
1228 * gst_rtsp_media_factory_construct:
1229 * @factory: a #GstRTSPMediaFactory
1230 * @url: the url used
1232 * Construct the media object and create its streams. Implementations
1233 * should create the needed gstreamer elements and add them to the result
1234 * object. No state changes should be performed on them yet.
1236 * One or more GstRTSPStream objects should be created from the result
1237 * with gst_rtsp_media_create_stream ().
1239 * After the media is constructed, it can be configured and then prepared
1240 * with gst_rtsp_media_prepare ().
1242 * Returns: (transfer full): a new #GstRTSPMedia if the media could be prepared.
1245 gst_rtsp_media_factory_construct (GstRTSPMediaFactory * factory,
1246 const GstRTSPUrl * url)
1248 GstRTSPMediaFactoryPrivate *priv;
1250 GstRTSPMedia *media;
1251 GstRTSPMediaFactoryClass *klass;
1253 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), NULL);
1254 g_return_val_if_fail (url != NULL, NULL);
1256 priv = factory->priv;
1257 klass = GST_RTSP_MEDIA_FACTORY_GET_CLASS (factory);
1259 /* convert the url to a key for the hashtable. NULL return or a NULL function
1260 * will not cache anything for this factory. */
1262 key = klass->gen_key (factory, url);
1266 g_mutex_lock (&priv->medias_lock);
1268 /* we have a key, see if we find a cached media */
1269 media = g_hash_table_lookup (priv->medias, key);
1271 g_object_ref (media);
1275 if (media == NULL) {
1276 /* nothing cached found, try to create one */
1277 if (klass->construct) {
1278 media = klass->construct (factory, url);
1280 g_signal_emit (factory,
1281 gst_rtsp_media_factory_signals[SIGNAL_MEDIA_CONSTRUCTED], 0, media,
1287 /* configure the media */
1288 if (klass->configure)
1289 klass->configure (factory, media);
1291 g_signal_emit (factory,
1292 gst_rtsp_media_factory_signals[SIGNAL_MEDIA_CONFIGURE], 0, media,
1295 /* check if we can cache this media */
1296 if (gst_rtsp_media_is_shared (media) && key) {
1297 /* insert in the hashtable, takes ownership of the key */
1298 g_object_ref (media);
1299 g_hash_table_insert (priv->medias, key, media);
1302 if (!gst_rtsp_media_is_reusable (media)) {
1303 /* when not reusable, connect to the unprepare signal to remove the item
1304 * from our cache when it gets unprepared */
1305 g_signal_connect_data (media, "unprepared",
1306 (GCallback) media_unprepared, weak_ref_new (factory),
1307 (GClosureNotify) weak_ref_free, 0);
1311 g_mutex_unlock (&priv->medias_lock);
1316 GST_INFO ("constructed media %p for url %s", media, url->abspath);
1322 * gst_rtsp_media_factory_set_media_gtype:
1323 * @factory: a #GstRTSPMediaFactory
1324 * @media_gtype: the GType of the class to create
1326 * Configure the GType of the GstRTSPMedia subclass to
1327 * create (by default, overridden construct vmethods
1328 * may of course do something different)
1333 gst_rtsp_media_factory_set_media_gtype (GstRTSPMediaFactory * factory,
1336 GstRTSPMediaFactoryPrivate *priv;
1338 g_return_if_fail (g_type_is_a (media_gtype, GST_TYPE_RTSP_MEDIA));
1340 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1341 priv = factory->priv;
1342 priv->media_gtype = media_gtype;
1343 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1347 * gst_rtsp_media_factory_get_media_gtype:
1348 * @factory: a #GstRTSPMediaFactory
1350 * Return the GType of the GstRTSPMedia subclass this
1351 * factory will create.
1356 gst_rtsp_media_factory_get_media_gtype (GstRTSPMediaFactory * factory)
1358 GstRTSPMediaFactoryPrivate *priv;
1361 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1362 priv = factory->priv;
1363 ret = priv->media_gtype;
1364 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1370 * gst_rtsp_media_factory_set_clock:
1371 * @factory: a #GstRTSPMediaFactory
1372 * @clock: (nullable): the clock to be used by the media factory
1374 * Configures a specific clock to be used by the pipelines
1375 * of all medias created from this factory.
1380 gst_rtsp_media_factory_set_clock (GstRTSPMediaFactory * factory,
1383 GstRTSPMediaFactoryPrivate *priv;
1385 g_return_if_fail (GST_IS_CLOCK (clock) || clock == NULL);
1387 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1388 priv = factory->priv;
1389 priv->clock = clock ? gst_object_ref (clock) : NULL;
1390 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1394 * gst_rtsp_media_factory_get_clock:
1395 * @factory: a #GstRTSPMediaFactory
1397 * Returns the clock that is going to be used by the pipelines
1398 * of all medias created from this factory.
1400 * Returns: (transfer full): The GstClock
1405 gst_rtsp_media_factory_get_clock (GstRTSPMediaFactory * factory)
1407 GstRTSPMediaFactoryPrivate *priv;
1410 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1411 priv = factory->priv;
1412 ret = priv->clock ? gst_object_ref (priv->clock) : NULL;
1413 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1419 * gst_rtsp_media_factory_set_publish_clock_mode:
1420 * @factory: a #GstRTSPMediaFactory
1421 * @mode: the clock publish mode
1423 * Sets if and how the media clock should be published according to RFC7273.
1428 gst_rtsp_media_factory_set_publish_clock_mode (GstRTSPMediaFactory * factory,
1429 GstRTSPPublishClockMode mode)
1431 GstRTSPMediaFactoryPrivate *priv;
1433 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1434 priv = factory->priv;
1435 priv->publish_clock_mode = mode;
1436 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1440 * gst_rtsp_media_factory_get_publish_clock_mode:
1441 * @factory: a #GstRTSPMediaFactory
1443 * Gets if and how the media clock should be published according to RFC7273.
1445 * Returns: The GstRTSPPublishClockMode
1449 GstRTSPPublishClockMode
1450 gst_rtsp_media_factory_get_publish_clock_mode (GstRTSPMediaFactory * factory)
1452 GstRTSPMediaFactoryPrivate *priv;
1453 GstRTSPPublishClockMode ret;
1455 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1456 priv = factory->priv;
1457 ret = priv->publish_clock_mode;
1458 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1464 default_gen_key (GstRTSPMediaFactory * factory, const GstRTSPUrl * url)
1467 const gchar *pre_query;
1471 pre_query = url->query ? "?" : "";
1472 query = url->query ? url->query : "";
1474 gst_rtsp_url_get_port (url, &port);
1476 result = g_strdup_printf ("%u%s%s%s", port, url->abspath, pre_query, query);
1482 default_create_element (GstRTSPMediaFactory * factory, const GstRTSPUrl * url)
1484 GstRTSPMediaFactoryPrivate *priv = factory->priv;
1485 GstElement *element;
1486 GError *error = NULL;
1488 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1489 /* we need a parse syntax */
1490 if (priv->launch == NULL)
1493 /* parse the user provided launch line */
1495 gst_parse_launch_full (priv->launch, NULL, GST_PARSE_FLAG_PLACE_IN_BIN,
1497 if (element == NULL)
1500 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1502 if (error != NULL) {
1503 /* a recoverable error was encountered */
1504 GST_WARNING ("recoverable parsing error: %s", error->message);
1505 g_error_free (error);
1512 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1513 g_critical ("no launch line specified");
1518 g_critical ("could not parse launch syntax (%s): %s", priv->launch,
1519 (error ? error->message : "unknown reason"));
1520 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1522 g_error_free (error);
1527 static GstRTSPMedia *
1528 default_construct (GstRTSPMediaFactory * factory, const GstRTSPUrl * url)
1530 GstRTSPMedia *media;
1531 GstElement *element, *pipeline;
1532 GstRTSPMediaFactoryClass *klass;
1535 klass = GST_RTSP_MEDIA_FACTORY_GET_CLASS (factory);
1537 if (!klass->create_pipeline)
1540 element = gst_rtsp_media_factory_create_element (factory, url);
1541 if (element == NULL)
1544 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1545 media_gtype = factory->priv->media_gtype;
1546 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1548 /* create a new empty media */
1550 g_object_new (media_gtype, "element", element, "transport-mode",
1551 factory->priv->transport_mode, NULL);
1553 gst_rtsp_media_collect_streams (media);
1555 pipeline = klass->create_pipeline (factory, media);
1556 if (pipeline == NULL)
1564 g_critical ("no create_pipeline function");
1569 g_critical ("could not create element");
1574 g_critical ("can't create pipeline");
1575 g_object_unref (media);
1581 default_create_pipeline (GstRTSPMediaFactory * factory, GstRTSPMedia * media)
1583 GstElement *pipeline;
1585 pipeline = gst_pipeline_new ("media-pipeline");
1587 /* FIXME 2.0: This should be done by the caller, not the vfunc. Every
1588 * implementation of the vfunc has to call it otherwise at the end.
1589 * Also it does not allow use to add further behaviour here that could
1590 * be reused by subclasses that chain up */
1591 gst_rtsp_media_take_pipeline (media, GST_PIPELINE_CAST (pipeline));
1597 default_configure (GstRTSPMediaFactory * factory, GstRTSPMedia * media)
1599 GstRTSPMediaFactoryPrivate *priv = factory->priv;
1600 gboolean shared, eos_shutdown, stop_on_disconnect;
1602 GstRTSPSuspendMode suspend_mode;
1603 GstRTSPProfile profiles;
1604 GstRTSPLowerTrans protocols;
1605 GstRTSPAddressPool *pool;
1606 GstRTSPPermissions *perms;
1607 GstClockTime rtx_time;
1609 GstRTSPTransportMode transport_mode;
1611 gchar *multicast_iface;
1612 GstRTSPPublishClockMode publish_clock_mode;
1614 /* configure the sharedness */
1615 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1616 suspend_mode = priv->suspend_mode;
1617 shared = priv->shared;
1618 eos_shutdown = priv->eos_shutdown;
1619 size = priv->buffer_size;
1620 profiles = priv->profiles;
1621 protocols = priv->protocols;
1622 rtx_time = priv->rtx_time;
1623 latency = priv->latency;
1624 transport_mode = priv->transport_mode;
1625 stop_on_disconnect = priv->stop_on_disconnect;
1626 clock = priv->clock ? gst_object_ref (priv->clock) : NULL;
1627 publish_clock_mode = priv->publish_clock_mode;
1628 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1630 gst_rtsp_media_set_suspend_mode (media, suspend_mode);
1631 gst_rtsp_media_set_shared (media, shared);
1632 gst_rtsp_media_set_eos_shutdown (media, eos_shutdown);
1633 gst_rtsp_media_set_buffer_size (media, size);
1634 gst_rtsp_media_set_profiles (media, profiles);
1635 gst_rtsp_media_set_protocols (media, protocols);
1636 gst_rtsp_media_set_retransmission_time (media, rtx_time);
1637 gst_rtsp_media_set_do_retransmission (media, priv->do_retransmission);
1638 gst_rtsp_media_set_latency (media, latency);
1639 gst_rtsp_media_set_transport_mode (media, transport_mode);
1640 gst_rtsp_media_set_stop_on_disconnect (media, stop_on_disconnect);
1641 gst_rtsp_media_set_publish_clock_mode (media, publish_clock_mode);
1644 gst_rtsp_media_set_clock (media, clock);
1645 gst_object_unref (clock);
1648 if ((pool = gst_rtsp_media_factory_get_address_pool (factory))) {
1649 gst_rtsp_media_set_address_pool (media, pool);
1650 g_object_unref (pool);
1652 if ((multicast_iface = gst_rtsp_media_factory_get_multicast_iface (factory))) {
1653 gst_rtsp_media_set_multicast_iface (media, multicast_iface);
1654 g_free (multicast_iface);
1656 if ((perms = gst_rtsp_media_factory_get_permissions (factory))) {
1657 gst_rtsp_media_set_permissions (media, perms);
1658 gst_rtsp_permissions_unref (perms);
1663 * gst_rtsp_media_factory_create_element:
1664 * @factory: a #GstRTSPMediaFactory
1665 * @url: the url used
1667 * Construct and return a #GstElement that is a #GstBin containing
1668 * the elements to use for streaming the media.
1670 * The bin should contain payloaders pay\%d for each stream. The default
1671 * implementation of this function returns the bin created from the
1674 * Returns: (transfer floating): a new #GstElement.
1677 gst_rtsp_media_factory_create_element (GstRTSPMediaFactory * factory,
1678 const GstRTSPUrl * url)
1680 GstRTSPMediaFactoryClass *klass;
1683 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), NULL);
1684 g_return_val_if_fail (url != NULL, NULL);
1686 klass = GST_RTSP_MEDIA_FACTORY_GET_CLASS (factory);
1688 if (klass->create_element)
1689 result = klass->create_element (factory, url);
1697 * gst_rtsp_media_factory_set_transport_mode:
1698 * @factory: a #GstRTSPMediaFactory
1699 * @mode: the new value
1701 * Configure if this factory creates media for PLAY or RECORD modes.
1704 gst_rtsp_media_factory_set_transport_mode (GstRTSPMediaFactory * factory,
1705 GstRTSPTransportMode mode)
1707 GstRTSPMediaFactoryPrivate *priv;
1709 g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
1711 priv = factory->priv;
1713 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1714 priv->transport_mode = mode;
1715 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
1719 * gst_rtsp_media_factory_get_transport_mode:
1720 * @factory: a #GstRTSPMediaFactory
1722 * Get if media created from this factory can be used for PLAY or RECORD
1725 * Returns: The transport mode.
1727 GstRTSPTransportMode
1728 gst_rtsp_media_factory_get_transport_mode (GstRTSPMediaFactory * factory)
1730 GstRTSPMediaFactoryPrivate *priv;
1731 GstRTSPTransportMode result;
1733 g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), FALSE);
1735 priv = factory->priv;
1737 GST_RTSP_MEDIA_FACTORY_LOCK (factory);
1738 result = priv->transport_mode;
1739 GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);