]> git.sesse.net Git - vlc/blobdiff - src/input/input.c
Use var_Inherit* instead of var_CreateGet*.
[vlc] / src / input / input.c
index a29b3f70c11fa04cb316709661d6f1335f3c2301..35da58bd31014e589b6593654d4653b3310b4210 100644 (file)
@@ -53,6 +53,7 @@
 #include <vlc_charset.h>
 #include <vlc_fs.h>
 #include <vlc_strings.h>
+#include <vlc_modules.h>
 
 #ifdef HAVE_SYS_STAT_H
 #   include <sys/stat.h>
@@ -244,18 +245,6 @@ void input_Stop( input_thread_t *p_input, bool b_abort )
     input_ControlPush( p_input, INPUT_CONTROL_SET_DIE, NULL );
 }
 
-input_resource_t *input_DetachResource( input_thread_t *p_input )
-{
-    assert( p_input->b_dead );
-
-    input_resource_SetInput( p_input->p->p_resource, NULL );
-
-    input_resource_t *p_resource = input_resource_Detach( p_input->p->p_resource );
-    p_input->p->p_sout = NULL;
-
-    return p_resource;
-}
-
 /**
  * Get the item from an input thread
  * FIXME it does not increase ref count of the item.
@@ -396,9 +385,15 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
 
     /* */
     if( p_resource )
-        p_input->p->p_resource = p_resource;
+    {
+        p_input->p->p_resource_private = NULL;
+        p_input->p->p_resource = input_resource_Hold( p_resource );
+    }
     else
-        p_input->p->p_resource = input_resource_New();
+    {
+        p_input->p->p_resource_private = input_resource_New( VLC_OBJECT( p_input ) );
+        p_input->p->p_resource = input_resource_Hold( p_input->p->p_resource_private );
+    }
     input_resource_SetInput( p_input->p->p_resource, p_input );
 
     /* Init control buffer */
@@ -507,7 +502,9 @@ static void Destructor( input_thread_t * p_input )
         es_out_Delete( p_input->p->p_es_out_display );
 
     if( p_input->p->p_resource )
-        input_resource_Delete( p_input->p->p_resource );
+        input_resource_Release( p_input->p->p_resource );
+    if( p_input->p->p_resource_private )
+        input_resource_Release( p_input->p->p_resource_private );
 
     vlc_gc_decref( p_input->p->p_item );
 
@@ -1145,7 +1142,7 @@ static void UpdatePtsDelay( input_thread_t *p_input )
 static void InitPrograms( input_thread_t * p_input )
 {
     int i_es_out_mode;
-    vlc_value_t val;
+    vlc_list_t list;
 
     /* Compute correct pts_delay */
     UpdatePtsDelay( p_input );
@@ -1154,22 +1151,31 @@ static void InitPrograms( input_thread_t * p_input )
     i_es_out_mode = ES_OUT_MODE_AUTO;
     if( p_input->p->p_sout )
     {
+        char *prgms;
+
         if( var_GetBool( p_input, "sout-all" ) )
         {
             i_es_out_mode = ES_OUT_MODE_ALL;
         }
         else
+        if( (prgms = var_GetNonEmptyString( p_input, "programs" )) != NULL )
         {
-            var_Get( p_input, "programs", &val );
-            if( val.p_list && val.p_list->i_count )
+            char *buf;
+
+            TAB_INIT( list.i_count, list.p_values );
+            for( const char *prgm = strtok_r( prgms, ",", &buf );
+                 prgm != NULL;
+                 prgm = strtok_r( NULL, ",", &buf ) )
             {
+                vlc_value_t val = { .i_int = atoi( prgm ) };
+                INSERT_ELEM( list.p_values, list.i_count, list.i_count, val );
+            }
+
+            if( list.i_count > 0 )
                 i_es_out_mode = ES_OUT_MODE_PARTIAL;
                 /* Note : we should remove the "program" callback. */
-            }
-            else
-            {
-                var_FreeList( &val, NULL );
-            }
+
+            free( prgms );
         }
     }
     es_out_SetMode( p_input->p->p_es_out, i_es_out_mode );
@@ -1182,12 +1188,13 @@ static void InitPrograms( input_thread_t * p_input )
     else if( i_es_out_mode == ES_OUT_MODE_PARTIAL )
     {
         demux_Control( p_input->p->input.p_demux, DEMUX_SET_GROUP, -1,
-                        val.p_list );
+                       &list );
+        TAB_CLEAN( list.i_count, list.p_values );
     }
     else
     {
         demux_Control( p_input->p->input.p_demux, DEMUX_SET_GROUP,
-                       (int) var_GetInteger( p_input, "program" ), NULL );
+                       es_out_GetGroupForced( p_input->p->p_es_out ), NULL );
     }
 }
 
@@ -1304,6 +1311,8 @@ error:
             input_resource_RequestSout( p_input->p->p_resource,
                                          p_input->p->p_sout, NULL );
         input_resource_SetInput( p_input->p->p_resource, NULL );
+        if( p_input->p->p_resource_private )
+            input_resource_Terminate( p_input->p->p_resource_private );
     }
 
     if( !p_input->b_preparsing && libvlc_stats( p_input ) )
@@ -1423,6 +1432,8 @@ static void End( input_thread_t * p_input )
     input_resource_RequestSout( p_input->p->p_resource,
                                  p_input->p->p_sout, NULL );
     input_resource_SetInput( p_input->p->p_resource, NULL );
+    if( p_input->p->p_resource_private )
+        input_resource_Terminate( p_input->p->p_resource_private );
 }
 
 /*****************************************************************************
@@ -2125,7 +2136,7 @@ static bool Control( input_thread_t *p_input,
 
             if( bookmark.i_time_offset < 0 && bookmark.i_byte_offset < 0 )
             {
-                msg_Err( p_input, "invalid bookmark %d", val.i_int );
+                msg_Err( p_input, "invalid bookmark %"PRId64, val.i_int );
                 break;
             }
 
@@ -2326,48 +2337,6 @@ static int InputSourceInit( input_thread_t *p_input,
     /* Split uri */
     input_SplitMRL( &psz_access, &psz_demux, &psz_path, psz_dup );
 
-    /* FIXME: file:// handling plugins do not support URIs properly...
-     * So we pre-decode the URI to a path for them. Note that we do not do it
-     * for non-standard VLC-specific schemes. */
-    if( !strcmp( psz_access, "file" ) )
-    {
-        if( psz_path[0] != '/' )
-#ifndef WIN32
-        {   /* host specified -> only localhost is supported */
-            static const size_t i_localhost = sizeof("localhost")-1;
-            if( strncmp( psz_path, "localhost/", i_localhost + 1) != 0 )
-            {
-                msg_Err( p_input, "cannot open remote file `%s://%s'",
-                         psz_access, psz_path );
-                msg_Info( p_input, "Did you mean `%s:///%s'?",
-                          psz_access, psz_path );
-                goto error;
-            }
-            psz_path += i_localhost;
-        }
-#else
-        {
-            /* XXX: very very ugly. Always true for valid URIs though. */
-            if( (psz_path - psz_dup) >= 2 && psz_path[-2] && psz_path[-1] )
-            {
-                *(--psz_path) = '\\';
-                *(--psz_path) = '\\';
-            }
-            msg_Err( p_input, "REMOTE: %s", psz_path );
-        }
-        else
-            /* Strip leading slash in front of the drive letter */
-            psz_path++;
-#endif
-        /* Then URI-decode the path. */
-        decode_URI( psz_path );
-#if (DIR_SEP_CHAR != '/')
-        /* Turn slashes into anti-slashes */
-        for( char *s = strchr( psz_path, '/' ); s; s = strchr( s + 1, '/' ) )
-            *s = DIR_SEP_CHAR;
-#endif
-    }
-
     msg_Dbg( p_input, "`%s' gives access `%s' demux `%s' path `%s'",
              psz_mrl, psz_access, psz_demux, psz_path );
     if( !p_input->b_preparsing )
@@ -3199,14 +3168,19 @@ static void SubtitleAdd( input_thread_t *p_input, char *psz_subtitle, bool b_for
         free( psz_path );
     }
 
+    char *url = make_URI( psz_subtitle, "file" );
+
     var_Change( p_input, "spu-es", VLC_VAR_CHOICESCOUNT, &count, NULL );
 
     sub = InputSourceNew( p_input );
-    if( !sub || InputSourceInit( p_input, sub, psz_subtitle, "subtitle" ) )
+    if( !sub || !url
+     || InputSourceInit( p_input, sub, url, "subtitle" ) )
     {
         free( sub );
+        free( url );
         return;
     }
+    free( url );
     TAB_APPEND( p_input->p->i_slave, p_input->p->slave, sub );
 
     /* Select the ES */