Don't wait location-node for creating input, and allow multiple
authorIlkka Ollakka <ileoo@videolan.org>
Wed, 17 Dec 2008 21:07:22 +0000 (23:07 +0200)
committerIlkka Ollakka <ileoo@videolan.org>
Wed, 17 Dec 2008 21:17:56 +0000 (23:17 +0200)
location nodes on track.

Use last location-node for uri (maybe first would be better instead ?).

check that input_item_NewExt doesn't return NULL

should fix ticket #2353

modules/demux/playlist/xspf.c

index ea51cf9..04f264e 100644 (file)
@@ -394,7 +394,6 @@ static bool parse_tracklist_node COMPLEX_INTERFACE
  */
 static bool parse_track_node COMPLEX_INTERFACE
 {
-    input_item_t *p_new_input = NULL;
     int i_node;
     char *psz_name = NULL;
     char *psz_value = NULL;
@@ -417,6 +416,14 @@ static bool parse_track_node COMPLEX_INTERFACE
           {NULL,           UNKNOWN_CONTENT, {NULL} }
         };
 
+    input_item_t *p_new_input = input_item_NewExt( p_demux, NULL, NULL, 0, NULL, -1 );
+
+    if( !p_new_input )
+    {
+        /* malloc has failed for input_item_NewExt, so bailout early */
+        return false;
+    }
+
     /* reset i_track_id */
     p_demux->p_sys->i_track_id = -1;
 
@@ -503,11 +510,13 @@ static bool parse_track_node COMPLEX_INTERFACE
 
                     if( p_demux->p_sys->i_track_id < 0 )
                     {
-                        if( p_new_input )
+                        char *psz_uri = input_item_GetURI( p_new_input );
+                        if( psz_uri && *psz_uri)
                         {
                             input_item_AddSubItem( p_input_item, p_new_input );
-                            vlc_gc_decref( p_new_input );
                         }
+                        vlc_gc_decref( p_new_input );
+                        free( psz_uri );
                         return true;
                     }
 
@@ -543,14 +552,6 @@ static bool parse_track_node COMPLEX_INTERFACE
                 if( !strcmp( p_handler->name, "location" ) )
                 {
                     char *psz_uri = NULL;
-                    /* there MUST NOT be an item */
-                    if( p_new_input )
-                    {
-                        msg_Err( p_demux, "item <%s> already created",
-                                 psz_name );
-                        FREE_ATT();
-                        return false;
-                    }
                     psz_uri = decode_URI_duplicate( psz_value );
 
                     if( !psz_uri )
@@ -572,8 +573,7 @@ static bool parse_track_node COMPLEX_INTERFACE
                         free( psz_uri );
                         psz_uri = psz_tmp;
                     }
-                    p_new_input = input_item_NewExt( p_demux, psz_uri,
-                                                        NULL, 0, NULL, -1 );
+                    input_item_SetURI( p_new_input, psz_uri );
                     free( psz_uri );
                     input_item_CopyOptions( p_input_item, p_new_input );
                     psz_uri = NULL;