diff --git a/gst/rtsp-server/rtsp-media-factory.c b/gst/rtsp-server/rtsp-media-factory.c index 082b8ebdd6..1d86c704d5 100644 --- a/gst/rtsp-server/rtsp-media-factory.c +++ b/gst/rtsp-server/rtsp-media-factory.c @@ -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) { diff --git a/gst/rtsp-server/rtsp-media-factory.h b/gst/rtsp-server/rtsp-media-factory.h index 9e8c23fa01..1c7bab9444 100644 --- a/gst/rtsp-server/rtsp-media-factory.h +++ b/gst/rtsp-server/rtsp-media-factory.h @@ -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);