]> git.sesse.net Git - vlc/blobdiff - src/input/input.c
Remove unused b_playlist_locked
[vlc] / src / input / input.c
index 51c22b1eed8084cd611388e454c905db2cc01f13..f3f6e2226ba9f06a8b6238b1f11b95b81363a8a3 100644 (file)
@@ -94,7 +94,7 @@ static void InputSourceMeta( input_thread_t *, input_source_t *, vlc_meta_t * );
 
 /* TODO */
 //static void InputGetAttachments( input_thread_t *, input_source_t * );
-static void SlaveDemux( input_thread_t *p_input );
+static void SlaveDemux( input_thread_t *p_input, bool *pb_demux_polled );
 static void SlaveSeek( input_thread_t *p_input );
 
 static void InputMetaUser( input_thread_t *p_input, vlc_meta_t *p_meta );
@@ -592,11 +592,12 @@ exit:
  * MainLoopDemux
  * It asks the demuxer to demux some data
  */
-static void MainLoopDemux( input_thread_t *p_input, bool *pb_changed, mtime_t i_start_mdate )
+static void MainLoopDemux( input_thread_t *p_input, bool *pb_changed, bool *pb_demux_polled, mtime_t i_start_mdate )
 {
     int i_ret;
 
     *pb_changed = false;
+    *pb_demux_polled = p_input->p->input.p_demux->pf_demux != NULL;
 
     if( ( p_input->p->i_stop > 0 && p_input->p->i_time >= p_input->p->i_stop ) ||
         ( p_input->p->i_run > 0 && i_start_mdate+p_input->p->i_run < mdate() ) )
@@ -639,7 +640,10 @@ static void MainLoopDemux( input_thread_t *p_input, bool *pb_changed, mtime_t i_
 
     if( i_ret > 0 && p_input->p->i_slave > 0 )
     {
-        SlaveDemux( p_input );
+        bool b_demux_polled;
+        SlaveDemux( p_input, &b_demux_polled );
+
+        *pb_demux_polled |= b_demux_polled;
     }
 }
 
@@ -755,6 +759,7 @@ static void MainLoop( input_thread_t *p_input )
         mtime_t i_deadline;
         mtime_t i_wakeup;
         bool b_paused;
+        bool b_demux_polled;
 
         /* Demux data */
         b_force_update = false;
@@ -765,11 +770,12 @@ static void MainLoop( input_thread_t *p_input )
         b_paused = p_input->p->i_state == PAUSE_S &&
                    !es_out_GetBuffering( p_input->p->p_es_out );
 
+        b_demux_polled = true;
         if( !b_paused )
         {
             if( !p_input->p->input.b_eof )
             {
-                MainLoopDemux( p_input, &b_force_update, i_start_mdate );
+                MainLoopDemux( p_input, &b_force_update, &b_demux_polled, i_start_mdate );
 
                 i_wakeup = es_out_GetWakeup( p_input->p->p_es_out );
             }
@@ -788,7 +794,7 @@ static void MainLoop( input_thread_t *p_input )
         /* */
         do {
             i_deadline = i_wakeup;
-            if( b_paused )
+            if( b_paused || !b_demux_polled )
                 i_deadline = __MIN( i_intf_update, i_statistic_update );
 
             /* Handle control */
@@ -816,13 +822,9 @@ static void MainLoop( input_thread_t *p_input )
                 i_statistic_update = i_current + INT64_C(1000000);
             }
 
-            /* Check if i_wakeup is still valid */
+            /* Update the wakeup time */
             if( i_wakeup != 0 )
-            {
-                mtime_t i_new_wakeup = es_out_GetWakeup( p_input->p->p_es_out );
-                if( !i_new_wakeup )
-                    i_wakeup = 0;
-            }
+                i_wakeup = es_out_GetWakeup( p_input->p->p_es_out );
         } while( i_current < i_wakeup );
     }
 
@@ -958,20 +960,13 @@ static void StartTitle( input_thread_t * p_input )
     const mtime_t i_length = var_GetTime( p_input, "length" );
     if( p_input->p->i_start > 0 )
     {
-        if( p_input->p->i_start >= i_length )
-        {
-            msg_Warn( p_input, "invalid start-time ignored" );
-        }
-        else
-        {
-            vlc_value_t s;
+        vlc_value_t s;
 
-            msg_Dbg( p_input, "starting at time: %ds",
-                              (int)( p_input->p->i_start / INT64_C(1000000) ) );
+        msg_Dbg( p_input, "starting at time: %ds",
+                 (int)( p_input->p->i_start / INT64_C(1000000) ) );
 
-            s.i_time = p_input->p->i_start;
-            input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &s );
-        }
+        s.i_time = p_input->p->i_start;
+        input_ControlPush( p_input, INPUT_CONTROL_SET_TIME, &s );
     }
     if( p_input->p->i_stop > 0 && p_input->p->i_stop <= p_input->p->i_start )
     {
@@ -2335,8 +2330,10 @@ static int InputSourceInit( input_thread_t *p_input,
     const char *psz_access;
     const char *psz_demux;
     char *psz_path;
+    char *psz_var_demux = NULL;
     double f_fps;
 
+    assert( psz_mrl );
     char *psz_dup = strdup( psz_mrl );
 
     if( psz_dup == NULL )
@@ -2350,13 +2347,23 @@ static int InputSourceInit( input_thread_t *p_input,
      * for non-standard VLC-specific schemes. */
     if( !strcmp( psz_access, "file" ) )
     {
-        if( psz_path[0] != '/' )
-        {   /* host specified -> not supported currently */
-            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;
+        if( psz_path[0] != '/'
+#if (DIR_SEP_CHAR != '/')
+            /* We accept invalid URIs too. */
+            && psz_path[0] != DIR_SEP_CHAR
+#endif
+          )
+        {   /* 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;
         }
         /* Remove HTML anchor if present (not supported). */
         char *p = strchr( psz_path, '#' );
@@ -2397,7 +2404,7 @@ static int InputSourceInit( input_thread_t *p_input,
         {
             /* special hack for forcing a demuxer with --demux=module
              * (and do nothing with a list) */
-            char *psz_var_demux = var_GetNonEmptyString( p_input, "demux" );
+            psz_var_demux = var_GetNonEmptyString( p_input, "demux" );
 
             if( psz_var_demux != NULL &&
                 !strchr(psz_var_demux, ',' ) &&
@@ -2444,6 +2451,8 @@ static int InputSourceInit( input_thread_t *p_input,
                             &in->b_can_pace_control ) )
             in->b_can_pace_control = false;
 
+        assert( in->p_demux->pf_demux != NULL || !in->b_can_pace_control );
+
         if( !in->b_can_pace_control )
         {
             if( demux_Control( in->p_demux, DEMUX_CAN_CONTROL_RATE,
@@ -2476,11 +2485,14 @@ static int InputSourceInit( input_thread_t *p_input,
         in->p_access = access_New( p_input, psz_access, psz_demux, psz_path );
         if( in->p_access == NULL )
         {
-            msg_Err( p_input, "open of `%s' failed: %s", psz_mrl,
-                                                         msg_StackMsg() );
-            dialog_Fatal( p_input, _("Your input can't be opened"),
-                          _("VLC is unable to open the MRL '%s'."
-                            " Check the log for details."), psz_mrl );
+            if( vlc_object_alive( p_input ) )
+            {
+                msg_Err( p_input, "open of `%s' failed: %s", psz_mrl,
+                                                             msg_StackMsg() );
+                dialog_Fatal( p_input, _("Your input can't be opened"),
+                              _("VLC is unable to open the MRL '%s'."
+                                " Check the log for details."), psz_mrl );
+            }
             goto error;
         }
 
@@ -2607,14 +2619,18 @@ static int InputSourceInit( input_thread_t *p_input,
 
         if( in->p_demux == NULL )
         {
-            msg_Err( p_input, "no suitable demux module for `%s/%s://%s'",
-                     psz_access, psz_demux, psz_path );
-            dialog_Fatal( VLC_OBJECT( p_input ),
-                          _("VLC can't recognize the input's format"),
-                          _("The format of '%s' cannot be detected. "
-                            "Have a look at the log for details."), psz_mrl );
+            if( vlc_object_alive( p_input ) )
+            {
+                msg_Err( p_input, "no suitable demux module for `%s/%s://%s'",
+                         psz_access, psz_demux, psz_path );
+                dialog_Fatal( VLC_OBJECT( p_input ),
+                              _("VLC can't recognize the input's format"),
+                              _("The format of '%s' cannot be detected. "
+                                "Have a look at the log for details."), psz_mrl );
+            }
             goto error;
         }
+        assert( in->p_demux->pf_demux != NULL );
 
         /* Get title from demux */
         if( !p_input->b_preparsing && in->i_title <= 0 )
@@ -2632,6 +2648,7 @@ static int InputSourceInit( input_thread_t *p_input,
         }
     }
 
+    free( psz_var_demux );
     free( psz_dup );
 
     /* Set record capabilities */
@@ -2681,6 +2698,8 @@ error:
 
     if( in->p_access )
         access_Delete( in->p_access );
+
+    free( psz_var_demux );
     free( psz_dup );
 
     return VLC_EGENERIC;
@@ -2762,11 +2781,12 @@ static void InputSourceMeta( input_thread_t *p_input,
 }
 
 
-static void SlaveDemux( input_thread_t *p_input )
+static void SlaveDemux( input_thread_t *p_input, bool *pb_demux_polled )
 {
     int64_t i_time;
     int i;
 
+    *pb_demux_polled = false;
     if( demux_Control( p_input->p->input.p_demux, DEMUX_GET_TIME, &i_time ) )
     {
         msg_Err( p_input, "demux doesn't like DEMUX_GET_TIME" );
@@ -2776,11 +2796,18 @@ static void SlaveDemux( input_thread_t *p_input )
     for( i = 0; i < p_input->p->i_slave; i++ )
     {
         input_source_t *in = p_input->p->slave[i];
-        int i_ret = 1;
+        int i_ret;
 
         if( in->b_eof )
             continue;
 
+        const bool b_demux_polled = in->p_demux->pf_demux != NULL;
+        if( !b_demux_polled )
+            continue;
+
+        *pb_demux_polled = true;
+
+        /* Call demux_Demux until we have read enough data */
         if( demux_Control( in->p_demux, DEMUX_SET_NEXT_DEMUX_TIME, i_time ) )
         {
             for( ;; )
@@ -2795,7 +2822,10 @@ static void SlaveDemux( input_thread_t *p_input )
                 }
 
                 if( i_stime >= i_time )
+                {
+                    i_ret = 1;
                     break;
+                }
 
                 if( ( i_ret = demux_Demux( in->p_demux ) ) <= 0 )
                     break;
@@ -2877,54 +2907,8 @@ static void InputMetaUser( input_thread_t *p_input, vlc_meta_t *p_meta )
  *****************************************************************************/
 static void InputUpdateMeta( input_thread_t *p_input, vlc_meta_t *p_meta )
 {
-    input_item_t *p_item = p_input->p->p_item;
-
-    char *psz_title = NULL;
-    char *psz_arturl = input_item_GetArtURL( p_item );
-
-    vlc_mutex_lock( &p_item->lock );
-
-    if( vlc_meta_Get( p_meta, vlc_meta_Title ) && !p_item->b_fixed_name )
-        psz_title = strdup( vlc_meta_Get( p_meta, vlc_meta_Title ) );
-
-    vlc_meta_Merge( p_item->p_meta, p_meta );
-
+    es_out_ControlSetMeta( p_input->p->p_es_out, p_meta );
     vlc_meta_Delete( p_meta );
-
-    if( !psz_arturl || *psz_arturl == '\0' )
-    {
-        const char *psz_tmp = vlc_meta_Get( p_item->p_meta, vlc_meta_ArtworkURL );
-        if( psz_tmp )
-            psz_arturl = strdup( psz_tmp );
-    }
-    vlc_mutex_unlock( &p_item->lock );
-
-    if( psz_arturl && *psz_arturl )
-    {
-        input_item_SetArtURL( p_item, psz_arturl );
-
-        if( !strncmp( psz_arturl, "attachment://", strlen("attachment") ) )
-        {
-            /* Don't look for art cover if sout
-             * XXX It can change when sout has meta data support */
-            if( p_input->p->p_sout && !p_input->b_preparsing )
-                input_item_SetArtURL( p_item, "" );
-            else
-                input_ExtractAttachmentAndCacheArt( p_input );
-        }
-    }
-    free( psz_arturl );
-
-    if( psz_title )
-    {
-        input_item_SetName( p_item, psz_title );
-        free( psz_title );
-    }
-    input_item_SetPreparsed( p_item, true );
-
-    input_SendEventMeta( p_input );
-
-    /** \todo handle sout meta */
 }
 
 static void AppendAttachment( int *pi_attachment, input_attachment_t ***ppp_attachment,