]> git.sesse.net Git - vlc/commitdiff
* all: use sout_ParseCfg. But "standard" can't use it for sap/slp
authorLaurent Aimar <fenrir@videolan.org>
Sat, 24 Apr 2004 03:38:10 +0000 (03:38 +0000)
committerLaurent Aimar <fenrir@videolan.org>
Sat, 24 Apr 2004 03:38:10 +0000 (03:38 +0000)
options (because we can't do the difference between missing option,
option and option="" when option is a string).

modules/stream_out/display.c
modules/stream_out/es.c
modules/stream_out/rtp.c
modules/stream_out/standard.c

index 572de76b2f0ff267d4b24948ff62db709b3a2094..187b4a806e5d01778bbaf08739f882533a1c7ef6 100644 (file)
 static int  Open ( vlc_object_t * );
 static void Close( vlc_object_t * );
 
+#define SOUT_CFG_PREFIX "sout-display-"
+
 vlc_module_begin();
     set_description( _("Display stream output") );
     set_capability( "sout stream", 50 );
     add_shortcut( "display" );
+    add_bool( SOUT_CFG_PREFIX "audio", 1, NULL, "audio", "", VLC_TRUE );
+    add_bool( SOUT_CFG_PREFIX "video", 1, NULL, "video", "", VLC_TRUE );
+    add_integer( SOUT_CFG_PREFIX "delay", 100, NULL, "delay", "", VLC_TRUE );
     set_callbacks( Open, Close );
 vlc_module_end();
 
@@ -48,6 +53,10 @@ vlc_module_end();
 /*****************************************************************************
  * Exported prototypes
  *****************************************************************************/
+static const char *ppsz_sout_options[] = {
+    "audio", "video", "delay", NULL
+};
+
 static sout_stream_id_t *Add ( sout_stream_t *, es_format_t * );
 static int               Del ( sout_stream_t *, sout_stream_id_t * );
 static int               Send( sout_stream_t *, sout_stream_id_t *, block_t* );
@@ -69,7 +78,10 @@ static int Open( vlc_object_t *p_this )
 {
     sout_stream_t     *p_stream = (sout_stream_t*)p_this;
     sout_stream_sys_t *p_sys;
-    char              *val;
+    vlc_value_t val;
+
+    sout_ParseCfg( p_stream, SOUT_CFG_PREFIX, ppsz_sout_options, p_stream->p_cfg );
+
     p_sys           = malloc( sizeof( sout_stream_sys_t ) );
     p_sys->p_input  = vlc_object_find( p_stream, VLC_OBJECT_INPUT, FIND_ANYWHERE );
     if( !p_sys->p_input )
@@ -79,21 +91,14 @@ static int Open( vlc_object_t *p_this )
         return VLC_EGENERIC;
     }
 
-    p_sys->b_audio = VLC_TRUE;
-    p_sys->b_video = VLC_TRUE;
-    p_sys->i_delay = 100*1000;
-    if( sout_cfg_find( p_stream->p_cfg, "noaudio" ) )
-    {
-        p_sys->b_audio = VLC_FALSE;
-    }
-    if( sout_cfg_find( p_stream->p_cfg, "novideo" ) )
-    {
-        p_sys->b_video = VLC_FALSE;
-    }
-    if( ( val = sout_cfg_find_value( p_stream->p_cfg, "delay" ) ) )
-    {
-        p_sys->i_delay = (mtime_t)atoi( val ) * (mtime_t)1000;
-    }
+    var_Get( p_stream, SOUT_CFG_PREFIX "audio", &val );
+    p_sys->b_audio = val.b_bool;
+
+    var_Get( p_stream, SOUT_CFG_PREFIX "video", &val );
+    p_sys->b_video = val.b_bool;
+
+    var_Get( p_stream, SOUT_CFG_PREFIX "delay", &val );
+    p_sys->i_delay = (int64_t)val.i_int * 1000;
 
     p_stream->pf_add    = Add;
     p_stream->pf_del    = Del;
index 7858446ebe02c3cb1a8a2c6bcdce8351293894d3..db61298d53330617d16964128aae9417c394428a 100644 (file)
 #include <vlc/input.h>
 #include <vlc/sout.h>
 
-#define FREE( p ) if( p ) { free( p ); (p) = NULL; }
 /*****************************************************************************
- * Exported prototypes
+ * Module descriptor
  *****************************************************************************/
 static int      Open    ( vlc_object_t * );
 static void     Close   ( vlc_object_t * );
 
-static sout_stream_id_t *Add ( sout_stream_t *, es_format_t * );
-static int               Del ( sout_stream_t *, sout_stream_id_t * );
-static int               Send( sout_stream_t *, sout_stream_id_t *, block_t* );
+#define SOUT_CFG_PREFIX "sout-es-"
 
-/*****************************************************************************
- * Module descriptor
- *****************************************************************************/
 vlc_module_begin();
     set_description( _("Elementary stream output") );
     set_capability( "sout stream", 50 );
     add_shortcut( "es" );
+
+    add_string( SOUT_CFG_PREFIX "access", "", NULL, "access", "", VLC_TRUE );
+    add_string( SOUT_CFG_PREFIX "access-audio", "", NULL, "access audio", "", VLC_TRUE );
+    add_string( SOUT_CFG_PREFIX "access-video", "", NULL, "access video", "", VLC_TRUE );
+
+    add_string( SOUT_CFG_PREFIX "mux", "", NULL, "mux", "", VLC_TRUE );
+    add_string( SOUT_CFG_PREFIX "mux-audio", "", NULL, "mux audio", "", VLC_TRUE );
+    add_string( SOUT_CFG_PREFIX "mux-video", "", NULL, "mux video", "", VLC_TRUE );
+
+    add_string( SOUT_CFG_PREFIX "dst", "", NULL, "dst", "", VLC_TRUE );
+    add_string( SOUT_CFG_PREFIX "dst-audio", "", NULL, "dst audio", "", VLC_TRUE );
+    add_string( SOUT_CFG_PREFIX "dst-video", "", NULL, "dst video", "", VLC_TRUE );
+
     set_callbacks( Open, Close );
 vlc_module_end();
 
+
+#define FREE( p ) if( p ) { free( p ); (p) = NULL; }
+/*****************************************************************************
+ * Exported prototypes
+ *****************************************************************************/
+static const char *ppsz_sout_options[] = {
+    "access", "access-audio", "access-video",
+    "mux", "mux-audio", "mux-video",
+    "dst", "dst-audio", "dst-video",
+    NULL
+};
+
+static sout_stream_id_t *Add ( sout_stream_t *, es_format_t * );
+static int               Del ( sout_stream_t *, sout_stream_id_t * );
+static int               Send( sout_stream_t *, sout_stream_id_t *, block_t* );
+
 struct sout_stream_sys_t
 {
     int  i_count_audio;
@@ -66,9 +89,9 @@ struct sout_stream_sys_t
     char *psz_access_audio;
     char *psz_access_video;
 
-    char *psz_url;
-    char *psz_url_audio;
-    char *psz_url_video;
+    char *psz_dst;
+    char *psz_dst_audio;
+    char *psz_dst_video;
 };
 
 /*****************************************************************************
@@ -78,26 +101,35 @@ static int Open( vlc_object_t *p_this )
 {
     sout_stream_t       *p_stream = (sout_stream_t*)p_this;
     sout_stream_sys_t   *p_sys;
+    vlc_value_t         val;
 
-    /* p_sout->i_preheader = __MAX( p_sout->i_preheader, p_mux->i_preheader ); */
-
+    sout_ParseCfg( p_stream, SOUT_CFG_PREFIX, ppsz_sout_options, p_stream->p_cfg );
     p_sys                   = malloc( sizeof( sout_stream_sys_t ) );
 
     p_sys->i_count          = 0;
     p_sys->i_count_audio    = 0;
     p_sys->i_count_video    = 0;
 
-    p_sys->psz_access       = sout_cfg_find_value( p_stream->p_cfg, "access" );
-    p_sys->psz_access_audio = sout_cfg_find_value( p_stream->p_cfg, "access_audio" );
-    p_sys->psz_access_video = sout_cfg_find_value( p_stream->p_cfg, "access_video" );
-
-    p_sys->psz_mux       = sout_cfg_find_value( p_stream->p_cfg, "mux" );
-    p_sys->psz_mux_audio = sout_cfg_find_value( p_stream->p_cfg, "mux_audio" );
-    p_sys->psz_mux_video = sout_cfg_find_value( p_stream->p_cfg, "mux_video" );
-
-    p_sys->psz_url       = sout_cfg_find_value( p_stream->p_cfg, "url" );
-    p_sys->psz_url_audio = sout_cfg_find_value( p_stream->p_cfg, "url_audio" );
-    p_sys->psz_url_video = sout_cfg_find_value( p_stream->p_cfg, "url_video" );
+    var_Get( p_stream, SOUT_CFG_PREFIX "access", &val );
+    p_sys->psz_access       = val.psz_string;
+    var_Get( p_stream, SOUT_CFG_PREFIX "access-audio", &val );
+    p_sys->psz_access_audio = val.psz_string;
+    var_Get( p_stream, SOUT_CFG_PREFIX "access-video", &val );
+    p_sys->psz_access_video = val.psz_string;
+
+    var_Get( p_stream, SOUT_CFG_PREFIX "mux", &val );
+    p_sys->psz_mux       = val.psz_string;
+    var_Get( p_stream, SOUT_CFG_PREFIX "mux-audio", &val );
+    p_sys->psz_mux_audio = val.psz_string;
+    var_Get( p_stream, SOUT_CFG_PREFIX "mux-video", &val );
+    p_sys->psz_mux_video = val.psz_string;
+
+    var_Get( p_stream, SOUT_CFG_PREFIX "dst", &val );
+    p_sys->psz_dst       = val.psz_string;
+    var_Get( p_stream, SOUT_CFG_PREFIX "dst-audio", &val );
+    p_sys->psz_dst_audio = val.psz_string;
+    var_Get( p_stream, SOUT_CFG_PREFIX "dst-video", &val );
+    p_sys->psz_dst_video = val.psz_string;
 
     p_stream->pf_add    = Add;
     p_stream->pf_del    = Del;
@@ -117,6 +149,18 @@ static void Close( vlc_object_t * p_this )
     sout_stream_t     *p_stream = (sout_stream_t*)p_this;
     sout_stream_sys_t *p_sys = p_stream->p_sys;
 
+    free( p_sys->psz_access );
+    free( p_sys->psz_access_audio );
+    free( p_sys->psz_access_video );
+
+    free( p_sys->psz_mux );
+    free( p_sys->psz_mux_audio );
+    free( p_sys->psz_mux_video );
+
+    free( p_sys->psz_dst );
+    free( p_sys->psz_dst_audio );
+    free( p_sys->psz_dst_video );
+
     free( p_sys );
 }
 
@@ -129,14 +173,14 @@ struct sout_stream_id_t
 static char * es_print_url( char *psz_fmt, vlc_fourcc_t i_fourcc, int i_count,
                             char *psz_access, char *psz_mux )
 {
-    char *psz_url, *p;
+    char *psz_dst, *p;
 
     if( psz_fmt == NULL || !*psz_fmt )
     {
         psz_fmt = "stream-%n-%c.%m";
     }
 
-    p = psz_url = malloc( 4096 );
+    p = psz_dst = malloc( 4096 );
     memset( p, 0, 4096 );
     for( ;; )
     {
@@ -182,7 +226,7 @@ static char * es_print_url( char *psz_fmt, vlc_fourcc_t i_fourcc, int i_count,
         }
     }
 
-    return( psz_url );
+    return( psz_dst );
 }
 
 static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
@@ -193,17 +237,17 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
 
     char              *psz_access;
     char              *psz_mux;
-    char              *psz_url;
+    char              *psz_dst;
 
     sout_access_out_t *p_access;
     sout_mux_t        *p_mux;
 
     /* *** get access name *** */
-    if( p_fmt->i_cat == AUDIO_ES && p_sys->psz_access_audio )
+    if( p_fmt->i_cat == AUDIO_ES && p_sys->psz_access_audio && *p_sys->psz_access_audio )
     {
         psz_access = p_sys->psz_access_audio;
     }
-    else if( p_fmt->i_cat == VIDEO_ES && p_sys->psz_access_video )
+    else if( p_fmt->i_cat == VIDEO_ES && p_sys->psz_access_video && *p_sys->psz_access_video )
     {
         psz_access = p_sys->psz_access_video;
     }
@@ -213,11 +257,11 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
     }
 
     /* *** get mux name *** */
-    if( p_fmt->i_cat == AUDIO_ES && p_sys->psz_mux_audio )
+    if( p_fmt->i_cat == AUDIO_ES && p_sys->psz_mux_audio && *p_sys->psz_mux_audio )
     {
         psz_mux = p_sys->psz_mux_audio;
     }
-    else if( p_fmt->i_cat == VIDEO_ES && p_sys->psz_mux_video )
+    else if( p_fmt->i_cat == VIDEO_ES && p_sys->psz_mux_video && *p_sys->psz_mux_video )
     {
         psz_mux = p_sys->psz_mux_video;
     }
@@ -227,14 +271,14 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
     }
 
     /* Get url (%d expanded as a codec count, %c expanded as codec fcc ) */
-    if( p_fmt->i_cat == AUDIO_ES && p_sys->psz_url_audio )
+    if( p_fmt->i_cat == AUDIO_ES && p_sys->psz_dst_audio && *p_sys->psz_dst_audio )
     {
-        psz_url = es_print_url( p_sys->psz_url_audio, p_fmt->i_codec,
+        psz_dst = es_print_url( p_sys->psz_dst_audio, p_fmt->i_codec,
                                 p_sys->i_count_audio, psz_access, psz_mux );
     }
-    else if( p_fmt->i_cat == VIDEO_ES && p_sys->psz_url_video )
+    else if( p_fmt->i_cat == VIDEO_ES && p_sys->psz_dst_video && *p_sys->psz_dst_video )
     {
-        psz_url = es_print_url( p_sys->psz_url_video, p_fmt->i_codec,
+        psz_dst = es_print_url( p_sys->psz_dst_video, p_fmt->i_codec,
                                 p_sys->i_count_video, psz_access, psz_mux );
     }
     else
@@ -253,7 +297,7 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
             i_count = p_sys->i_count;
         }
 
-        psz_url = es_print_url( p_sys->psz_url, p_fmt->i_codec,
+        psz_dst = es_print_url( p_sys->psz_dst, p_fmt->i_codec,
                                 i_count, psz_access, psz_mux );
     }
 
@@ -267,14 +311,14 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
         p_sys->i_count_audio++;
     }
     msg_Dbg( p_stream, "creating `%s/%s://%s'",
-             psz_access, psz_mux, psz_url );
+             psz_access, psz_mux, psz_dst );
 
     /* *** find and open appropriate access module *** */
-    p_access = sout_AccessOutNew( p_sout, psz_access, psz_url );
+    p_access = sout_AccessOutNew( p_sout, psz_access, psz_dst );
     if( p_access == NULL )
     {
         msg_Err( p_stream, "no suitable sout access module for `%s/%s://%s'",
-                 psz_access, psz_mux, psz_url );
+                 psz_access, psz_mux, psz_dst );
         return( NULL );
     }
 
@@ -283,7 +327,7 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
     if( p_mux == NULL )
     {
         msg_Err( p_stream, "no suitable sout mux module for `%s/%s://%s'",
-                 psz_access, psz_mux, psz_url );
+                 psz_access, psz_mux, psz_dst );
         sout_AccessOutDelete( p_access );
         return( NULL );
     }
index 3440c2afdce25b5eee86c12e769252963eb63b82..6f90057091e66b2d5252bb0e3ba81815b74d5d03 100644 (file)
 static int  Open ( vlc_object_t * );
 static void Close( vlc_object_t * );
 
+#define SOUT_CFG_PREFIX "sout-rtp-"
+
 vlc_module_begin();
     set_description( _("RTP stream output") );
     set_capability( "sout stream", 0 );
     add_shortcut( "rtp" );
+    add_string( SOUT_CFG_PREFIX "dst", "", NULL, "destination", "", VLC_TRUE );
+    add_string( SOUT_CFG_PREFIX "name", "", NULL, "name", "", VLC_TRUE );
+    add_string( SOUT_CFG_PREFIX "sdp", "", NULL, "sdp", "", VLC_TRUE );
+    add_string( SOUT_CFG_PREFIX "mux", "", NULL, "mux", "", VLC_TRUE );
+
+    add_integer( SOUT_CFG_PREFIX "port", 1234, NULL, "port", "", VLC_TRUE );
+    add_integer( SOUT_CFG_PREFIX "ttl", 0, NULL, "port", "", VLC_TRUE );
+
     set_callbacks( Open, Close );
 vlc_module_end();
 
 /*****************************************************************************
  * Exported prototypes
  *****************************************************************************/
+static const char *ppsz_sout_options[] = {
+    "dst", "name", "port", "sdp", "ttl", "mux", NULL
+};
+
 static sout_stream_id_t *Add ( sout_stream_t *, es_format_t * );
 static int               Del ( sout_stream_t *, sout_stream_id_t * );
 static int               Send( sout_stream_t *, sout_stream_id_t *,
@@ -182,43 +196,42 @@ static int Open( vlc_object_t *p_this )
     sout_stream_t       *p_stream = (sout_stream_t*)p_this;
     sout_instance_t     *p_sout = p_stream->p_sout;
     sout_stream_sys_t   *p_sys;
+    vlc_value_t         val;
 
-    char *val;
+    sout_ParseCfg( p_stream, SOUT_CFG_PREFIX, ppsz_sout_options, p_stream->p_cfg );
 
     p_sys = malloc( sizeof( sout_stream_sys_t ) );
-    p_sys->psz_destination = sout_cfg_find_value( p_stream->p_cfg, "dst" );
-    p_sys->psz_session_name = sout_cfg_find_value( p_stream->p_cfg, "name" );
-    if( ( val = sout_cfg_find_value( p_stream->p_cfg, "port" ) ) )
-    {
-        p_sys->i_port = atoi( val );
-    }
-    else
-    {
-        p_sys->i_port = 1234;
-    }
+
+    var_Get( p_stream, SOUT_CFG_PREFIX "dst", &val );
+    p_sys->psz_destination = *val.psz_string ? val.psz_string : NULL;
+
+    var_Get( p_stream, SOUT_CFG_PREFIX "name", &val );
+    p_sys->psz_session_name = *val.psz_string ? val.psz_string : NULL;
+
+    var_Get( p_stream, SOUT_CFG_PREFIX "port", &val );
+    p_sys->i_port = val.i_int;
+
 
     if( !p_sys->psz_session_name )
     {
         if( p_sys->psz_destination )
-        {
             p_sys->psz_session_name = strdup( p_sys->psz_destination );
-        }
         else
-        {
            p_sys->psz_session_name = strdup( "NONE" );
-        }
     }
 
     if( !p_sys->psz_destination || *p_sys->psz_destination == '\0' )
     {
-        val = sout_cfg_find_value( p_stream->p_cfg, "sdp" );
-        if( val == NULL || strncasecmp( val, "rtsp", 4 ) )
+        var_Get( p_stream, SOUT_CFG_PREFIX "sdp", &val );
+
+        if( strncasecmp( val.psz_string, "rtsp", 4 ) )
         {
             msg_Err( p_stream, "missing destination and not in rtsp mode" );
             free( p_sys );
             return VLC_EGENERIC;
         }
         p_sys->psz_destination = NULL;
+        free( val.psz_string );
     }
     else if( p_sys->i_port <= 0 )
     {
@@ -227,14 +240,8 @@ static int Open( vlc_object_t *p_this )
         return VLC_EGENERIC;
     }
 
-    if( ( val = sout_cfg_find_value( p_stream->p_cfg, "ttl" ) ) )
-    {
-        p_sys->i_ttl = atoi( val );
-    }
-    else
-    {
-        p_sys->i_ttl = config_GetInt( p_stream, "ttl" );
-    }
+    var_Get( p_stream, SOUT_CFG_PREFIX "ttl", &val );
+    p_sys->i_ttl = val.i_int;
 
     p_sys->i_payload_type = 96;
     p_sys->i_es = 0;
@@ -266,7 +273,8 @@ static int Open( vlc_object_t *p_this )
 
     p_stream->p_sys     = p_sys;
 
-    if( ( val = sout_cfg_find_value( p_stream->p_cfg, "mux" ) ) )
+    var_Get( p_stream, SOUT_CFG_PREFIX "mux", &val );
+    if( *val.psz_string )
     {
         sout_access_out_t *p_grab;
 
@@ -275,11 +283,11 @@ static int Open( vlc_object_t *p_this )
         char url[strlen( p_sys->psz_destination ) + 1 + 12 + 1];
 
         /* Check muxer type */
-        if( !strncasecmp( val, "ps", 2 ) || !strncasecmp( val, "mpeg1", 5 ) )
+        if( !strncasecmp( val.psz_string, "ps", 2 ) || !strncasecmp( val.psz_string, "mpeg1", 5 ) )
         {
             psz_rtpmap = "MP2P/90000";
         }
-        else if( !strncasecmp( val, "ts", 2 ) )
+        else if( !strncasecmp( val.psz_string, "ts", 2 ) )
         {
             psz_rtpmap = "MP2T/90000";
             p_sys->i_payload_type = 33;
@@ -327,9 +335,9 @@ static int Open( vlc_object_t *p_this )
         p_grab->pf_write    = AccessOutGrabberWrite;
 
         /* the muxer */
-        if( !( p_sys->p_mux = sout_MuxNew( p_sout, val, p_sys->p_grab ) ) )
+        if( !( p_sys->p_mux = sout_MuxNew( p_sout, val.psz_string, p_sys->p_grab ) ) )
         {
-            msg_Err( p_stream, "cannot create the muxer (%s)", val );
+            msg_Err( p_stream, "cannot create the muxer (%s)", val.psz_string );
             sout_AccessOutDelete( p_sys->p_grab );
             sout_AccessOutDelete( p_sys->p_access );
             free( p_sys );
@@ -369,12 +377,15 @@ static int Open( vlc_object_t *p_this )
         p_sys->p_access = NULL;
         p_sys->p_grab   = NULL;
     }
+    free( val.psz_string );
+
 
-    if( ( val = sout_cfg_find_value( p_stream->p_cfg, "sdp" ) ) )
+    var_Get( p_stream, SOUT_CFG_PREFIX "sdp", &val );
+    if( *val.psz_string )
     {
         vlc_url_t url;
 
-        vlc_UrlParse( &url, val, 0 );
+        vlc_UrlParse( &url, val.psz_string, 0 );
         if( url.psz_protocol && !strcasecmp( url.psz_protocol, "http" ) )
         {
             if( HttpSetup( p_stream, &url ) )
@@ -402,6 +413,7 @@ static int Open( vlc_object_t *p_this )
         }
         vlc_UrlClean( &url );
     }
+    free( val.psz_string );
 
     /* update p_sout->i_out_pace_nocontrol */
     p_stream->p_sout->i_out_pace_nocontrol++;
index 6034fca4607389107e3838e3cb53972b7839be33..9d74479c7d518a75eafc878059ff1d2bb8e6df61 100644 (file)
 #include "announce.h"
 #include "network.h"
 
-#define DEFAULT_IPV6_SCOPE '8'
-#define DEFAULT_PORT 1234
-
 /*****************************************************************************
- * Exported prototypes
+ * Module descriptor
  *****************************************************************************/
 static int      Open    ( vlc_object_t * );
 static void     Close   ( vlc_object_t * );
 
-static sout_stream_id_t *Add ( sout_stream_t *, es_format_t * );
-static int               Del ( sout_stream_t *, sout_stream_id_t * );
-static int               Send( sout_stream_t *, sout_stream_id_t *, block_t* );
+#define SOUT_CFG_PREFIX "sout-standard-"
 
-/*****************************************************************************
- * Module descriptor
- *****************************************************************************/
 vlc_module_begin();
     set_description( _("Standard stream output") );
     set_capability( "sout stream", 50 );
     add_shortcut( "standard" );
     add_shortcut( "std" );
+
+    add_string( SOUT_CFG_PREFIX "access", "", NULL, "access", "", VLC_TRUE );
+    add_string( SOUT_CFG_PREFIX "mux", "", NULL, "mux", "", VLC_TRUE );
+    add_string( SOUT_CFG_PREFIX "url", "", NULL, "url", "", VLC_TRUE );
+
     set_callbacks( Open, Close );
 vlc_module_end();
 
+
+/*****************************************************************************
+ * Exported prototypes
+ *****************************************************************************/
+static const char *ppsz_sout_options[] = {
+    "access", "mux", "url", NULL
+};
+
+#define DEFAULT_IPV6_SCOPE '8'
+#define DEFAULT_PORT 1234
+
+static sout_stream_id_t *Add ( sout_stream_t *, es_format_t * );
+static int               Del ( sout_stream_t *, sout_stream_id_t * );
+static int               Send( sout_stream_t *, sout_stream_id_t *, block_t* );
+
 struct sout_stream_sys_t
 {
     sout_mux_t           *p_mux;
@@ -73,24 +85,34 @@ static int Open( vlc_object_t *p_this )
     sout_stream_t       *p_stream = (sout_stream_t*)p_this;
     sout_instance_t     *p_sout = p_stream->p_sout;
     slp_session_t       *p_slp = NULL;
-    session_descriptor_t *p_session = NULL;
 
-    char *psz_mux      = sout_cfg_find_value( p_stream->p_cfg, "mux" );
-    char *psz_access   = sout_cfg_find_value( p_stream->p_cfg, "access" );
-    char *psz_url      = sout_cfg_find_value( p_stream->p_cfg, "url" );
-    char *psz_sdp      = NULL;
+    char *psz_mux;
+    char *psz_access;
+    char *psz_url;
 
-    vlc_url_t      *p_url;
     sout_cfg_t *p_sap_cfg = sout_cfg_find( p_stream->p_cfg, "sap" );
 #ifdef HAVE_SLP_H
     sout_cfg_t *p_slp_cfg = sout_cfg_find( p_stream->p_cfg, "slp" );
 #endif
 
+    vlc_value_t val;
+
     sout_access_out_t   *p_access;
     sout_mux_t          *p_mux;
 
     char                *psz_mux_byext = NULL;
 
+    sout_ParseCfg( p_stream, SOUT_CFG_PREFIX, ppsz_sout_options, p_stream->p_cfg );
+
+    var_Get( p_stream, SOUT_CFG_PREFIX "access", &val );
+    psz_access = *val.psz_string ? val.psz_string : NULL;
+
+    var_Get( p_stream, SOUT_CFG_PREFIX "mux", &val );
+    psz_mux = *val.psz_string ? val.psz_string : NULL;
+
+    var_Get( p_stream, SOUT_CFG_PREFIX "url", &val );
+    psz_url = *val.psz_string ? val.psz_string : NULL;
+
     p_stream->p_sys        = malloc( sizeof( sout_stream_sys_t) );
     p_stream->p_sys->p_session = NULL;
 
@@ -137,8 +159,7 @@ static int Open( vlc_object_t *p_this )
 
     /* We fix access/mux to valid couple */
 
-    if( ( psz_access == NULL || *psz_access == '\0' )&&
-        ( psz_mux == NULL ||  *psz_mux == '\0' ) )
+    if( psz_access == NULL && psz_mux == NULL )
     {
         if( psz_mux_byext )
         {
@@ -155,8 +176,7 @@ static int Open( vlc_object_t *p_this )
         }
     }
 
-    if( psz_access && *psz_access &&
-        ( psz_mux == NULL || *psz_mux == '\0' ) )
+    if( psz_access && psz_mux == NULL )
     {
         /* access given, no mux */
         if( !strncmp( psz_access, "mmsh", 4 ) )
@@ -172,8 +192,7 @@ static int Open( vlc_object_t *p_this )
             psz_mux = psz_mux_byext;
         }
     }
-    else if( psz_mux && *psz_mux &&
-             ( psz_access == NULL || *psz_access == '\0' ) )
+    else if( psz_mux && psz_access == NULL )
     {
         /* mux given, no access */
         if( !strncmp( psz_mux, "asfh", 4 ) )
@@ -188,7 +207,7 @@ static int Open( vlc_object_t *p_this )
     }
 
     /* fix or warm of incompatible couple */
-    if( psz_mux && *psz_mux && psz_access && *psz_access )
+    if( psz_mux && psz_access )
     {
         if( !strncmp( psz_access, "mmsh", 4 ) && strncmp( psz_mux, "asfh", 4 ) )
         {
@@ -245,12 +264,13 @@ static int Open( vlc_object_t *p_this )
     msg_Dbg( p_stream, "mux opened" );
 
     /*  *** Create the SAP Session structure *** */
-    if( psz_access &&  p_sap_cfg && ( strstr( psz_access, "udp" ) ||
-                    strstr( psz_access ,  "rtp" ) ) )
+    if( psz_access &&  p_sap_cfg &&
+        ( strstr( psz_access, "udp" ) || strstr( psz_access ,  "rtp" ) ) )
     {
-        session_descriptor_t *p_session=  sout_AnnounceSessionCreate();
-        announce_method_t *p_method = sout_AnnounceMethodCreate(
-                                                  METHOD_TYPE_SAP);
+        session_descriptor_t *p_session = sout_AnnounceSessionCreate();
+        announce_method_t *p_method =
+            sout_AnnounceMethodCreate( METHOD_TYPE_SAP );
+        vlc_url_t url;
 
         /* Parse user input */
         if( p_sap_cfg->psz_value )
@@ -276,9 +296,8 @@ static int Open( vlc_object_t *p_this )
                 psz_curr = sout_cfg_find_value( p_cfg,"ip_version");
                 if( psz_curr != NULL)
                 {
-                    p_method->i_ip_version = atoi( psz_curr ) != 0 ?
-                                                     atoi(psz_curr) :
-                                                     4;
+                    p_method->i_ip_version =
+                        atoi( psz_curr ) != 0 ? atoi(psz_curr) : 4;
                 }
             }
             else
@@ -292,45 +311,31 @@ static int Open( vlc_object_t *p_this )
         }
 
         /* Now, parse the URL to extract host and port */
-        p_url = (vlc_url_t *)malloc( sizeof(vlc_url_t ) );
-        if ( ! p_url )
-        {
-            return NULL;
-        }
+        vlc_UrlParse( &url, psz_url , 0);
 
-        vlc_UrlParse( p_url, psz_url , 0);
-
-        if (!p_url->psz_host)
-        {
-            return NULL;
-        }
-
-        if(p_url->i_port == 0)
+        if( url.psz_host )
         {
-                p_url->i_port = DEFAULT_PORT;
-        }
-
-        p_session->psz_uri = p_url->psz_host;
-        p_session->i_port = p_url->i_port;
-        p_session->psz_sdp = NULL;
+            if( url.i_port == 0 )
+            {
+                url.i_port = DEFAULT_PORT;
+            }
 
-        p_session->i_ttl = config_GetInt( p_sout,"ttl" );
-        p_session->i_payload = 33;
+            p_session->psz_uri = url.psz_host;
+            p_session->i_port = url.i_port;
+            p_session->psz_sdp = NULL;
 
-        msg_Info( p_this, "SAP Enabled");
+            p_session->i_ttl = config_GetInt( p_sout, "ttl" );
+            p_session->i_payload = 33;
 
-        sout_AnnounceRegister( p_sout, p_session, p_method );
+            msg_Info( p_this, "SAP Enabled");
 
-        /* FIXME: Free p_method */
+            sout_AnnounceRegister( p_sout, p_session, p_method );
 
-        p_stream->p_sys->p_session = p_session;
+            /* FIXME: Free p_method */
 
-        if( p_url )
-        {
-            vlc_UrlClean( p_url );
-            free( p_url );
-            p_url = NULL;
+            p_stream->p_sys->p_session = p_session;
         }
+        vlc_UrlClean( &url );
     }
 
     /* *** Register with slp *** */
@@ -346,13 +351,7 @@ static int Open( vlc_object_t *p_this )
         }
         else
         {
-            p_slp = (slp_session_t*)malloc(sizeof(slp_session_t));
-            if(!p_slp)
-            {
-                msg_Warn(p_sout,"out of memory");
-//                if( p_sap ) free( p_sap );
-                return -1;
-            }
+            p_slp = malloc(sizeof(slp_session_t));
             p_slp->psz_url= strdup(psz_url);
             p_slp->psz_name = strdup(
                     p_slp_cfg->psz_value ? p_slp_cfg->psz_value : psz_url);
@@ -438,7 +437,6 @@ static int Send( sout_stream_t *p_stream, sout_stream_id_t *id,
                  block_t *p_buffer )
 {
     sout_stream_sys_t *p_sys = p_stream->p_sys;
-    sout_instance_t   *p_sout = p_stream->p_sout;
 
     sout_MuxSendBuffer( p_sys->p_mux, id->p_input, p_buffer );