From 1991fd0e0df4eee74b62846ddd14c5ec592fcc11 Mon Sep 17 00:00:00 2001
From: Sebastien Escudier <sebastien-devel@celeos.eu>
Date: Fri, 4 Jul 2008 09:52:13 +0200
Subject: [PATCH] Add vod to libvlc_vlm

---
 include/vlc/libvlc_vlm.h |   30 +++++++++++++++++++++++++-
 src/control/vlm.c        |   50 ++++++++++++++++++++++++++++++++++++++++++++++
 src/libvlc.sym           |    2 +
 3 files changed, 80 insertions(+), 2 deletions(-)

diff --git a/include/vlc/libvlc_vlm.h b/include/vlc/libvlc_vlm.h
index a999ff8..68c4354 100644
--- a/include/vlc/libvlc_vlm.h
+++ b/include/vlc/libvlc_vlm.h
@@ -38,7 +38,7 @@ extern "C" {
  * @{
  */
 
-    
+
 /**
  * Release the vlm instance related to the given libvlc_instance_t
  *
@@ -46,7 +46,7 @@ extern "C" {
  * \param p_e an initialized exception pointer
  */
 VLC_PUBLIC_API void libvlc_vlm_release( libvlc_instance_t *, libvlc_exception_t * );
-    
+
 /**
  * Add a broadcast, with one input.
  *
@@ -64,6 +64,21 @@ VLC_PUBLIC_API void libvlc_vlm_add_broadcast( libvlc_instance_t *, char *, char
                                               int, char **, int, int, libvlc_exception_t * );
 
 /**
+ * Add a vod, with one input.
+ *
+ * \param p_instance the instance
+ * \param psz_name the name of the new vod media
+ * \param psz_input the input MRL
+ * \param i_options number of additional options
+ * \param ppsz_options additional options
+ * \param b_enabled boolean for enabling the new vod
+ * \param the muxer of the vod media
+ * \param p_e an initialized exception pointer
+ */
+VLC_PUBLIC_API void libvlc_vlm_add_vod( libvlc_instance_t *, char *, char *, int, char **,
+		                                int, char *, libvlc_exception_t * );
+
+/**
  * Delete a media (VOD or broadcast).
  *
  * \param p_instance the instance
@@ -128,6 +143,17 @@ VLC_PUBLIC_API void libvlc_vlm_set_loop( libvlc_instance_t *, char *, int,
                                          libvlc_exception_t *);
 
 /**
+ * Set a media's vod muxer.
+ *
+ * \param p_instance the instance
+ * \param psz_name the media to work on
+ * \param the new muxer
+ * \param p_e an initialized exception pointer
+ */
+VLC_PUBLIC_API void libvlc_vlm_set_mux( libvlc_instance_t *p_instance, char *psz_name,
+                          char *psz_mux, libvlc_exception_t *p_exception );
+
+/**
  * Edit the parameters of a media. This will delete all existing inputs and
  * add the specified one.
  *
diff --git a/src/control/vlm.c b/src/control/vlm.c
index 968ba69..c825f74 100644
--- a/src/control/vlm.c
+++ b/src/control/vlm.c
@@ -211,6 +211,40 @@ void libvlc_vlm_add_broadcast( libvlc_instance_t *p_instance, char *psz_name,
 #endif
 }
 
+void libvlc_vlm_add_vod( libvlc_instance_t *p_instance, char *psz_name,
+                         char *psz_input, int i_options,
+                         char **ppsz_options, int b_enabled,
+                         char *psz_mux, libvlc_exception_t *p_exception )
+{
+#ifdef ENABLE_VLM
+    vlm_t *p_vlm;
+    vlm_media_t m;
+    int n;
+
+    VLM(p_vlm);
+
+    vlm_media_Init( &m );
+    m.psz_name = strdup( psz_name );
+    m.b_enabled = b_enabled;
+    m.b_vod = true;
+    m.vod.psz_mux = psz_mux ? strdup( psz_mux ) : NULL;
+    if( psz_input )
+        TAB_APPEND( m.i_input, m.ppsz_input, strdup(psz_input) );
+    for( n = 0; n < i_options; n++ )
+        TAB_APPEND( m.i_option, m.ppsz_option, strdup(ppsz_options[n]) );
+
+    if( vlm_Control( p_vlm, VLM_ADD_MEDIA, &m, NULL ) )
+    {
+        vlm_media_Clean( &m );
+        libvlc_exception_raise( p_exception, "Media %s creation failed", psz_name );
+    }
+    vlm_media_Clean( &m );
+#else
+    libvlc_exception_raise( p_exception, "VLM has been disabled in this libvlc." );
+    return VLC_EGENERIC;
+#endif
+}
+
 void libvlc_vlm_del_media( libvlc_instance_t *p_instance, char *psz_name,
                            libvlc_exception_t *p_exception )
 {
@@ -281,6 +315,22 @@ void libvlc_vlm_set_loop( libvlc_instance_t *p_instance, char *psz_name,
 #endif
 }
 
+void libvlc_vlm_set_mux( libvlc_instance_t *p_instance, char *psz_name,
+                          char *psz_mux, libvlc_exception_t *p_exception )
+{
+#ifdef ENABLE_VLM
+#define VLM_CHANGE_CODE { if( p_media->b_vod ) { \
+                            free( p_media->vod.psz_mux ); \
+                            p_media->vod.psz_mux = psz_mux ? strdup( psz_mux ) : NULL; \
+                          } }
+    VLM_CHANGE( "Unable to change %s mux property", VLM_CHANGE_CODE );
+#undef VLM_CHANGE_CODE
+#else
+    libvlc_exception_raise( p_exception, "VLM has been disabled in this libvlc." );
+    return VLC_EGENERIC;
+#endif
+}
+
 void libvlc_vlm_set_output( libvlc_instance_t *p_instance, char *psz_name,
                             char *psz_output,  libvlc_exception_t *p_exception )
 {
diff --git a/src/libvlc.sym b/src/libvlc.sym
index f3b8eb1..ce03edd 100644
--- a/src/libvlc.sym
+++ b/src/libvlc.sym
@@ -184,6 +184,7 @@ libvlc_video_set_teletext
 libvlc_video_set_viewport
 libvlc_video_take_snapshot
 libvlc_vlm_add_broadcast
+libvlc_vlm_add_vod
 libvlc_vlm_add_input
 libvlc_vlm_change_media
 libvlc_vlm_del_media
@@ -201,6 +202,7 @@ libvlc_vlm_seek_media
 libvlc_vlm_set_enabled
 libvlc_vlm_set_input
 libvlc_vlm_set_loop
+libvlc_vlm_set_mux
 libvlc_vlm_set_output
 libvlc_vlm_show_media
 libvlc_vlm_stop_media
-- 
1.5.4.3

