media-factory: add a "media-constructed" signal to GstRTSPMediaFactory
authorEmmanuel Pacaud <emmanuel@gnome.org>
Thu, 30 Jun 2011 08:13:59 +0000 (10:13 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 16 Aug 2011 09:22:55 +0000 (11:22 +0200)
For example, it can be used to retrieve source elements like appsrc, in a more
convenient way than subclassing get_element.

gst/rtsp-server/rtsp-media-factory.c
gst/rtsp-server/rtsp-media-factory.h

index 082b8eb..1d86c70 100644 (file)
@@ -34,9 +34,17 @@ enum
   PROP_LAST
 };
 
+enum
+{
+  SIGNAL_MEDIA_CONSTRUCTED,
+  SIGNAL_LAST
+};
+
 GST_DEBUG_CATEGORY_STATIC (rtsp_media_debug);
 #define GST_CAT_DEFAULT rtsp_media_debug
 
+static guint gst_rtsp_media_factory_signals[SIGNAL_LAST] = { 0 };
+
 static void gst_rtsp_media_factory_get_property (GObject * object, guint propid,
     GValue * value, GParamSpec * pspec);
 static void gst_rtsp_media_factory_set_property (GObject * object, guint propid,
@@ -103,6 +111,12 @@ gst_rtsp_media_factory_class_init (GstRTSPMediaFactoryClass * klass)
           "The kernel UDP buffer size to use", 0, G_MAXUINT,
           DEFAULT_BUFFER_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  gst_rtsp_media_factory_signals[SIGNAL_MEDIA_CONSTRUCTED] =
+      g_signal_new ("media-constructed", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRTSPMediaFactoryClass,
+          media_constructed), NULL, NULL, g_cclosure_marshal_VOID__OBJECT,
+      G_TYPE_NONE, 1, GST_TYPE_RTSP_MEDIA);
+
   klass->gen_key = default_gen_key;
   klass->get_element = default_get_element;
   klass->construct = default_construct;
@@ -490,9 +504,13 @@ gst_rtsp_media_factory_construct (GstRTSPMediaFactory * factory,
 
   if (media == NULL) {
     /* nothing cached found, try to create one */
-    if (klass->construct)
+    if (klass->construct) {
       media = klass->construct (factory, url);
-    else
+      if (media)
+        g_signal_emit (factory,
+            gst_rtsp_media_factory_signals[SIGNAL_MEDIA_CONSTRUCTED], 0, media,
+            NULL);
+    } else
       media = NULL;
 
     if (media) {
index 9e8c23f..1c7bab9 100644 (file)
@@ -93,12 +93,15 @@ struct _GstRTSPMediaFactory {
 struct _GstRTSPMediaFactoryClass {
   GObjectClass  parent_class;
 
-  gchar *           (*gen_key)        (GstRTSPMediaFactory *factory, const GstRTSPUrl *url);
+  gchar *           (*gen_key)         (GstRTSPMediaFactory *factory, const GstRTSPUrl *url);
 
-  GstElement *      (*get_element)    (GstRTSPMediaFactory *factory, const GstRTSPUrl *url);
-  GstRTSPMedia *    (*construct)      (GstRTSPMediaFactory *factory, const GstRTSPUrl *url);
-  void              (*configure)      (GstRTSPMediaFactory *factory, GstRTSPMedia *media);
-  GstElement *      (*create_pipeline)(GstRTSPMediaFactory *factory, GstRTSPMedia *media);
+  GstElement *      (*get_element)     (GstRTSPMediaFactory *factory, const GstRTSPUrl *url);
+  GstRTSPMedia *    (*construct)       (GstRTSPMediaFactory *factory, const GstRTSPUrl *url);
+  void              (*configure)       (GstRTSPMediaFactory *factory, GstRTSPMedia *media);
+  GstElement *      (*create_pipeline) (GstRTSPMediaFactory *factory, GstRTSPMedia *media);
+
+  /* signals */
+  void             (*media_constructed)(GstRTSPMediaFactory *factory, GstRTSPMedia *media);
 };
 
 GType                 gst_rtsp_media_factory_get_type     (void);