]> git.sesse.net Git - vlc/blobdiff - src/input/input.c
Revert [42a0d047849f391a75432dfdf5d71523d6ec08c7]
[vlc] / src / input / input.c
index 0146d46182657a03820ea6d8937818b5a6d9db33..60ee778eb8756cf690f237de397c012ca30e0844 100644 (file)
@@ -158,11 +158,10 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
      * the global stats. Check if there is already someone doing this */
     if( p_input->p_libvlc->p_stats && !b_quick )
     {
+        libvlc_priv_t *priv = libvlc_priv (p_input->p_libvlc);
         vlc_mutex_lock( &p_input->p_libvlc->p_stats->lock );
-        if( p_input->p_libvlc->p_stats_computer == NULL )
-        {
-            p_input->p_libvlc->p_stats_computer = p_input;
-        }
+        if( priv->p_stats_computer == NULL )
+            priv->p_stats_computer = p_input;
         vlc_mutex_unlock( &p_input->p_libvlc->p_stats->lock );
     }
 
@@ -217,7 +216,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
     p_input->p->slave   = NULL;
 
     /* Init control buffer */
-    vlc_mutex_init( p_input, &p_input->p->lock_control );
+    vlc_mutex_init( &p_input->p->lock_control );
     p_input->p->i_control = 0;
 
     /* Parse input options */
@@ -273,7 +272,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
                      }
                      psz_start = psz_end + 1;
                 }
-                msg_Dbg( p_input, "adding bookmark: %s, bytes="I64Fd", time="I64Fd,
+                msg_Dbg( p_input, "adding bookmark: %s, bytes=%"PRId64", time=%"PRId64,
                                   p_seekpoint->psz_name, p_seekpoint->i_byte_offset,
                                   p_seekpoint->i_time_offset );
                 input_Control( p_input, INPUT_ADD_BOOKMARK, p_seekpoint );
@@ -299,7 +298,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
     }
 
     memset( &p_input->p->counters, 0, sizeof( p_input->p->counters ) );
-    vlc_mutex_init( p_input, &p_input->p->counters.counters_lock );
+    vlc_mutex_init( &p_input->p->counters.counters_lock );
 
     /* Attach only once we are ready */
     vlc_object_attach( p_input, p_parent );
@@ -319,7 +318,7 @@ static void Destructor( input_thread_t * p_input )
 
     stats_TimerDump( p_input, STATS_TIMER_INPUT_LAUNCHING );
     stats_TimerClean( p_input, STATS_TIMER_INPUT_LAUNCHING );
-
+#ifdef ENABLE_SOUT
     if( priv->b_owns_its_sout && priv->p_sout )
     {
         if( priv->b_sout_keep )
@@ -330,7 +329,7 @@ static void Destructor( input_thread_t * p_input )
             priv->p_sout = NULL;
         }
     }
-
+#endif
     vlc_gc_decref( p_input->p->input.p_item );
 
     vlc_mutex_destroy( &p_input->p->counters.counters_lock );
@@ -554,7 +553,7 @@ static int Run( input_thread_t *p_input )
 
         /* We have finished */
         p_input->b_eof = true;
-        playlist_Signal( pl_Get( p_input ) );
+        playlist_Signal( libvlc_priv (p_input->p_libvlc)->p_playlist );
     }
 
     /* Wait until we are asked to die */
@@ -772,17 +771,17 @@ static void MainLoop( input_thread_t *p_input )
             }
 
             var_SetBool( p_input, "intf-change", true );
-            i_intf_update = mdate() + I64C(150000);
+            i_intf_update = mdate() + INT64_C(150000);
         }
         /* 150ms * 8 = ~ 1 second */
         if( ++i_updates % 8 == 0 )
         {
             stats_ComputeInputStats( p_input, p_input->p->input.p_item->p_stats );
             /* Are we the thread responsible for computing global stats ? */
-            if( p_input->p_libvlc->p_stats_computer == p_input )
+            if( libvlc_priv (p_input->p_libvlc)->p_stats_computer == p_input )
             {
                 stats_ComputeGlobalStats( p_input->p_libvlc,
-                                     p_input->p_libvlc->p_stats );
+                                          p_input->p_libvlc->p_stats );
             }
         }
     }
@@ -795,7 +794,7 @@ static void InitStatistics( input_thread_t * p_input )
     /* Prepare statistics */
 #define INIT_COUNTER( c, type, compute ) p_input->p->counters.p_##c = \
  stats_CounterCreate( p_input, VLC_VAR_##type, STATS_##compute);
-    if( p_input->p_libvlc->b_stats )
+    if( libvlc_stats (p_input) )
     {
         INIT_COUNTER( read_bytes, INTEGER, COUNTER );
         INIT_COUNTER( read_packets, INTEGER, COUNTER );
@@ -819,6 +818,7 @@ static void InitStatistics( input_thread_t * p_input )
     }
 }
 
+#ifdef ENABLE_SOUT
 static int InitSout( input_thread_t * p_input )
 {
     char *psz;
@@ -862,7 +862,7 @@ static int InitSout( input_thread_t * p_input )
                 return VLC_EGENERIC;
             }
         }
-        if( p_input->p_libvlc->b_stats )
+        if( libvlc_stats (p_input) )
         {
             INIT_COUNTER( sout_sent_packets, INTEGER, COUNTER );
             INIT_COUNTER (sout_sent_bytes, INTEGER, COUNTER );
@@ -883,6 +883,7 @@ static int InitSout( input_thread_t * p_input )
 
     return VLC_SUCCESS;
 }
+#endif
 
 static void InitTitle( input_thread_t * p_input )
 {
@@ -929,6 +930,7 @@ static void StartTitle( input_thread_t * p_input )
     int i, i_delay;
     char *psz;
     char *psz_subtitle;
+    int64_t i_length;
 
     /* Start title/chapter */
 
@@ -949,9 +951,10 @@ static void StartTitle( input_thread_t * p_input )
 
     /* Start time*/
     /* Set start time */
-    p_input->p->i_start = I64C(1000000) * var_GetInteger( p_input, "start-time" );
-    p_input->p->i_stop  = I64C(1000000) * var_GetInteger( p_input, "stop-time" );
-    p_input->p->i_run   = I64C(1000000) * var_GetInteger( p_input, "run-time" );
+    p_input->p->i_start = INT64_C(1000000) * var_GetInteger( p_input, "start-time" );
+    p_input->p->i_stop  = INT64_C(1000000) * var_GetInteger( p_input, "stop-time" );
+    p_input->p->i_run   = INT64_C(1000000) * var_GetInteger( p_input, "run-time" );
+    i_length = var_GetTime( p_input, "length" );
     if( p_input->p->i_run < 0 )
     {
         msg_Warn( p_input, "invalid run-time ignored" );
@@ -960,7 +963,7 @@ static void StartTitle( input_thread_t * p_input )
 
     if( p_input->p->i_start > 0 )
     {
-        if( p_input->p->i_start >= val.i_time )
+        if( p_input->p->i_start >= i_length )
         {
             msg_Warn( p_input, "invalid start-time ignored" );
         }
@@ -969,7 +972,7 @@ static void StartTitle( input_thread_t * p_input )
             vlc_value_t s;
 
             msg_Dbg( p_input, "starting at time: %ds",
-                              (int)( p_input->p->i_start / I64C(1000000) ) );
+                              (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 );
@@ -1159,10 +1162,11 @@ static int Init( input_thread_t * p_input )
     }
 
     InitStatistics( p_input );
+#ifdef ENABLE_SOUT
     ret = InitSout( p_input );
-
     if( ret != VLC_SUCCESS )
         return ret; /* FIXME: goto error; should be better here */
+#endif
 
     /* Create es out */
     p_input->p->p_es_out = input_EsOutNew( p_input, p_input->p->i_rate );
@@ -1247,15 +1251,15 @@ error:
 
     if( p_input->p->p_es_out )
         input_EsOutDelete( p_input->p->p_es_out );
-
+#ifdef ENABLE_SOUT
     if( p_input->p->p_sout )
     {
         vlc_object_detach( p_input->p->p_sout );
         sout_DeleteInstance( p_input->p->p_sout );
     }
+#endif
 
-
-    if( !p_input->b_preparsing && p_input->p_libvlc->b_stats )
+    if( !p_input->b_preparsing && libvlc_stats (p_input) )
     {
 #define EXIT_COUNTER( c ) do { if( p_input->p->counters.p_##c ) \
                                    stats_CounterClean( p_input->p->counters.p_##c );\
@@ -1338,15 +1342,17 @@ static void End( input_thread_t * p_input )
     if( !p_input->b_preparsing )
     {
 #define CL_CO( c ) stats_CounterClean( p_input->p->counters.p_##c ); p_input->p->counters.p_##c = NULL;
-        if( p_input->p_libvlc->b_stats )
+        if( libvlc_stats (p_input) )
         {
+            libvlc_priv_t *priv = libvlc_priv (p_input->p_libvlc);
+
             /* make sure we are up to date */
             stats_ComputeInputStats( p_input, p_input->p->input.p_item->p_stats );
-            if( p_input->p_libvlc->p_stats_computer == p_input )
+            if( priv->p_stats_computer == p_input )
             {
                 stats_ComputeGlobalStats( p_input->p_libvlc,
                                           p_input->p_libvlc->p_stats );
-                p_input->p_libvlc->p_stats_computer = NULL;
+                priv->p_stats_computer = NULL;
             }
             CL_CO( read_bytes );
             CL_CO( read_packets );
@@ -1413,20 +1419,27 @@ static sout_instance_t *SoutFind( vlc_object_t *p_parent, input_item_t *p_item,
      * XXX it might be unusable but this will be checked later */
     if( b_keep_sout )
     {
-        p_sout = vlc_object_find( p_parent->p_libvlc, VLC_OBJECT_SOUT,
-                                                      FIND_CHILD );
-        if( p_sout )
+        playlist_t *p_playlist = vlc_object_find( p_parent->p_libvlc,
+                VLC_OBJECT_PLAYLIST, FIND_CHILD );
+        if( p_playlist )
         {
-            if( p_sout->p_parent != VLC_OBJECT( p_sout->p_libvlc ) )
-            {
-                vlc_object_release( p_sout );
-                p_sout = NULL;
-            }
-            else
+            vlc_mutex_lock( &p_playlist->gc_lock );
+            p_sout = vlc_object_find( p_playlist, VLC_OBJECT_SOUT, FIND_CHILD );
+            if( p_sout )
             {
-                vlc_object_detach( p_sout );    /* Remove it from the GC */
-                vlc_object_release( p_sout );
+                if( p_sout->p_parent != VLC_OBJECT( p_playlist ) )
+                {
+                    vlc_object_release( p_sout );
+                    p_sout = NULL;
+                }
+                else
+                {
+                    vlc_object_detach( p_sout );    /* Remove it from the GC */
+                    vlc_object_release( p_sout );
+                }
             }
+            vlc_mutex_unlock( &p_playlist->gc_lock );
+            vlc_object_release( p_playlist );
         }
     }
 
@@ -1438,8 +1451,14 @@ static sout_instance_t *SoutFind( vlc_object_t *p_parent, input_item_t *p_item,
 
 static void SoutKeep( sout_instance_t *p_sout )
 {
+    playlist_t * p_playlist = vlc_object_find( p_sout, VLC_OBJECT_PLAYLIST,
+                                                FIND_PARENT );
+    if( !p_playlist ) return;
+
     msg_Dbg( p_sout, "sout has been kept" );
-    vlc_object_attach( p_sout, p_sout->p_libvlc );
+    vlc_object_attach( p_sout, p_playlist );
+
+    vlc_object_release( p_playlist );
 }
 
 /*****************************************************************************
@@ -1612,7 +1631,7 @@ static bool Control( input_thread_t *p_input, int i_type,
             }
             if( i_ret )
             {
-                msg_Warn( p_input, "INPUT_CONTROL_SET_TIME(_OFFSET) "I64Fd
+                msg_Warn( p_input, "INPUT_CONTROL_SET_TIME(_OFFSET) %"PRId64
                          " failed or not possible", i_time );
             }
             else
@@ -2104,7 +2123,8 @@ static int UpdateFromAccess( input_thread_t *p_input )
         vlc_meta_t *p_meta = vlc_meta_New();
         access_Control( p_input->p->input.p_access,ACCESS_GET_META, p_meta );
         InputUpdateMeta( p_input, p_meta );
-        var_SetInteger( pl_Get( p_input ), "item-change", p_input->p->input.p_item->i_id );
+        var_SetInteger( libvlc_priv (p_input->p_libvlc)->p_playlist,
+                        "item-change", p_input->p->input.p_item->i_id );
         p_access->info.i_update &= ~INPUT_UPDATE_META;
     }
 
@@ -2147,8 +2167,8 @@ static void UpdateItemLength( input_thread_t *p_input, int64_t i_length )
     if( !p_input->b_preparsing )
     {
         pl_Yield( p_input );
-        var_SetInteger( pl_Get( p_input ), "item-change",
-                        p_input->p->input.p_item->i_id );
+        var_SetInteger( libvlc_priv (p_input->p_libvlc)->p_playlist,
+                        "item-change", p_input->p->input.p_item->i_id );
         pl_Release( p_input );
     }
 }