From db42945c2c1cfce74b94dd5f024e2ecf9ac327ce Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Tue, 3 Mar 2015 01:49:42 +1100 Subject: [PATCH] rtsp-media-factory: Add functions to set/get the media gtype Allow specifying the GType of a GstRtspMedia subclass to create as a simpler way to get the factory to create a custom GstRtspMedia sub-class, without subclassing GstRtspMediaFactory. --- gst/rtsp-server/rtsp-media-factory.c | 58 +++++++++++++++++++++++++++++++++++- gst/rtsp-server/rtsp-media-factory.h | 4 +++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/gst/rtsp-server/rtsp-media-factory.c b/gst/rtsp-server/rtsp-media-factory.c index e1e169e..b126339 100644 --- a/gst/rtsp-server/rtsp-media-factory.c +++ b/gst/rtsp-server/rtsp-media-factory.c @@ -66,6 +66,8 @@ struct _GstRTSPMediaFactoryPrivate GMutex medias_lock; GHashTable *medias; /* protected by medias_lock */ + + GType media_gtype; }; #define DEFAULT_LAUNCH NULL @@ -243,6 +245,7 @@ gst_rtsp_media_factory_init (GstRTSPMediaFactory * factory) g_mutex_init (&priv->medias_lock); priv->medias = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + priv->media_gtype = GST_TYPE_RTSP_MEDIA; } static void @@ -1091,6 +1094,54 @@ gst_rtsp_media_factory_construct (GstRTSPMediaFactory * factory, return media; } +/** + * gst_rtsp_media_factory_set_media_gtype: + * @factory: a #GstRTSPMediaFactory + * @media_gtype: the GType of the class to create + * + * Configure the GType of the GstRTSPMedia subclass to + * create (by default, overridden construct vmethods + * may of course do something different) + * + * Since: 1.6 + */ +void +gst_rtsp_media_factory_set_media_gtype (GstRTSPMediaFactory * factory, + GType media_gtype) +{ + GstRTSPMediaFactoryPrivate *priv; + + g_return_if_fail (g_type_is_a (media_gtype, GST_TYPE_RTSP_MEDIA)); + + GST_RTSP_MEDIA_FACTORY_LOCK (factory); + priv = factory->priv; + priv->media_gtype = media_gtype; + GST_RTSP_MEDIA_FACTORY_UNLOCK (factory); +} + +/** + * gst_rtsp_media_factory_get_media_gtype: + * @factory: a #GstRTSPMediaFactory + * + * Return the GType of the GstRTSPMedia subclass this + * factory will create. + * + * Since: 1.6 + */ +GType +gst_rtsp_media_factory_get_media_gtype (GstRTSPMediaFactory * factory) +{ + GstRTSPMediaFactoryPrivate *priv; + GType ret; + + GST_RTSP_MEDIA_FACTORY_LOCK (factory); + priv = factory->priv; + ret = priv->media_gtype; + GST_RTSP_MEDIA_FACTORY_UNLOCK (factory); + + return ret; +} + static gchar * default_gen_key (GstRTSPMediaFactory * factory, const GstRTSPUrl * url) { @@ -1157,6 +1208,7 @@ default_construct (GstRTSPMediaFactory * factory, const GstRTSPUrl * url) GstRTSPMedia *media; GstElement *element, *pipeline; GstRTSPMediaFactoryClass *klass; + GType media_gtype; klass = GST_RTSP_MEDIA_FACTORY_GET_CLASS (factory); @@ -1167,8 +1219,12 @@ default_construct (GstRTSPMediaFactory * factory, const GstRTSPUrl * url) if (element == NULL) goto no_element; + GST_RTSP_MEDIA_FACTORY_LOCK (factory); + media_gtype = factory->priv->media_gtype; + GST_RTSP_MEDIA_FACTORY_UNLOCK (factory); + /* create a new empty media */ - media = gst_rtsp_media_new (element); + media = g_object_new (media_gtype, "element", element, NULL); gst_rtsp_media_collect_streams (media); diff --git a/gst/rtsp-server/rtsp-media-factory.h b/gst/rtsp-server/rtsp-media-factory.h index fa36766..1382426 100644 --- a/gst/rtsp-server/rtsp-media-factory.h +++ b/gst/rtsp-server/rtsp-media-factory.h @@ -153,6 +153,10 @@ void gst_rtsp_media_factory_set_transport_mode (GstRTSPMediaFac GstRTSPTransportMode mode); GstRTSPTransportMode gst_rtsp_media_factory_get_transport_mode (GstRTSPMediaFactory *factory); +void gst_rtsp_media_factory_set_media_gtype (GstRTSPMediaFactory * factory, + GType media_gtype); +GType gst_rtsp_media_factory_get_media_gtype (GstRTSPMediaFactory * factory); + /* creating the media from the factory and a url */ GstRTSPMedia * gst_rtsp_media_factory_construct (GstRTSPMediaFactory *factory, const GstRTSPUrl *url); -- 2.7.4