media-factory: add a "media-constructed" signal to GstRTSPMediaFactory
[platform/upstream/gstreamer.git] / gst / rtsp-server / rtsp-media-factory.h
index 5a98a96..1c7bab9 100644 (file)
@@ -21,6 +21,7 @@
 #include <gst/rtsp/gstrtspurl.h>
 
 #include "rtsp-media.h"
+#include "rtsp-auth.h"
 
 #ifndef __GST_RTSP_MEDIA_FACTORY_H__
 #define __GST_RTSP_MEDIA_FACTORY_H__
@@ -40,10 +41,17 @@ G_BEGIN_DECLS
 typedef struct _GstRTSPMediaFactory GstRTSPMediaFactory;
 typedef struct _GstRTSPMediaFactoryClass GstRTSPMediaFactoryClass;
 
+#define GST_RTSP_MEDIA_FACTORY_GET_LOCK(f)       (GST_RTSP_MEDIA_FACTORY_CAST(f)->lock)
+#define GST_RTSP_MEDIA_FACTORY_LOCK(f)           (g_mutex_lock(GST_RTSP_MEDIA_FACTORY_GET_LOCK(f)))
+#define GST_RTSP_MEDIA_FACTORY_UNLOCK(f)         (g_mutex_unlock(GST_RTSP_MEDIA_FACTORY_GET_LOCK(f)))
+
 /**
  * GstRTSPMediaFactory:
+ * @lock: mutex protecting the datastructure.
  * @launch: the launch description
- * @streams: the array of #GstRTSPMediaStream objects for this media.
+ * @shared: if media from this factory can be shared between clients
+ * @media_lock: mutex protecting the medias.
+ * @media: hashtable of shared media
  *
  * The definition and logic for constructing the pipeline for a media. The media
  * can contain multiple streams like audio and video.
@@ -51,32 +59,83 @@ typedef struct _GstRTSPMediaFactoryClass GstRTSPMediaFactoryClass;
 struct _GstRTSPMediaFactory {
   GObject       parent;
 
+  GMutex       *lock;
   gchar        *launch;
+  gboolean      shared;
+  gboolean      eos_shutdown;
+  GstRTSPAuth  *auth;
+  guint         buffer_size;
+
+  GMutex       *medias_lock;
+  GHashTable   *medias;
 };
 
 /**
  * GstRTSPMediaFactoryClass:
+ * @gen_key: convert @url to a key for caching shared #GstRTSPMedia objects.
+ *       The default implementation of this function will use the complete URL
+ *       including the query parameters to return a key.
+ * @get_element: Construct and return a #GstElement that is a #GstBin containing
+ *       the elements to use for streaming the media. The bin should contain
+ *       payloaders pay%d for each stream. The default implementation of this
+ *       function returns the bin created from the launch parameter.
  * @construct: the vmethod that will be called when the factory has to create the
- *       #GstRTSPMediaBin for @location.
+ *       #GstRTSPMedia for @url. The default implementation of this
+ *       function calls get_element to retrieve an element and then looks for
+ *       pay%d to create the streams.
+ * @configure: configure the media created with @construct. The default
+ *       implementation will configure the 'shared' property of the media.
+ * @create_pipeline: create a new pipeline or re-use an existing one and
+ *       add the #GstRTSPMedia's element created by @construct to the pipeline.
  *
- * the #GstRTSPMediaFactory class structure.
+ * The #GstRTSPMediaFactory class structure.
  */
 struct _GstRTSPMediaFactoryClass {
   GObjectClass  parent_class;
 
-  GstRTSPMediaBin * (*construct)   (GstRTSPMediaFactory *factory, const gchar *location);
+  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);
+
+  /* signals */
+  void             (*media_constructed)(GstRTSPMediaFactory *factory, GstRTSPMedia *media);
 };
 
 GType                 gst_rtsp_media_factory_get_type     (void);
 
-/* configuring the factory */
+/* creating the factory */
 GstRTSPMediaFactory * gst_rtsp_media_factory_new          (void);
 
-void                  gst_rtsp_media_factory_set_launch   (GstRTSPMediaFactory *factory, const gchar *launch);
+/* configuring the factory */
+void                  gst_rtsp_media_factory_set_launch   (GstRTSPMediaFactory *factory,
+                                                           const gchar *launch);
 gchar *               gst_rtsp_media_factory_get_launch   (GstRTSPMediaFactory *factory);
 
-/* creating the media bin from the factory */
-GstRTSPMediaBin *     gst_rtsp_media_factory_construct    (GstRTSPMediaFactory *factory, const gchar *location);
+void                  gst_rtsp_media_factory_set_shared   (GstRTSPMediaFactory *factory,
+                                                           gboolean shared);
+gboolean              gst_rtsp_media_factory_is_shared    (GstRTSPMediaFactory *factory);
+
+void                  gst_rtsp_media_factory_set_eos_shutdown   (GstRTSPMediaFactory *factory,
+                                                                 gboolean eos_shutdown);
+gboolean              gst_rtsp_media_factory_is_eos_shutdown    (GstRTSPMediaFactory *factory);
+
+void                  gst_rtsp_media_factory_set_auth     (GstRTSPMediaFactory *factory, GstRTSPAuth *auth);
+GstRTSPAuth *         gst_rtsp_media_factory_get_auth     (GstRTSPMediaFactory *factory);
+
+void                  gst_rtsp_media_factory_set_buffer_size    (GstRTSPMediaFactory * factory, guint size);
+guint                 gst_rtsp_media_factory_get_buffer_size    (GstRTSPMediaFactory * factory);
+
+
+/* creating the media from the factory and a url */
+GstRTSPMedia *        gst_rtsp_media_factory_construct    (GstRTSPMediaFactory *factory,
+                                                           const GstRTSPUrl *url);
+
+void                  gst_rtsp_media_factory_collect_streams (GstRTSPMediaFactory *factory,
+                                                              const GstRTSPUrl *url,
+                                                              GstRTSPMedia *media);
 
 G_END_DECLS