[vlc-devel] commit: Allowed non pace controled access_demux to not implement the pf_demux callback . (Laurent Aimar )

git version control git at videolan.org
Thu Jul 16 21:23:54 CEST 2009


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Thu Jul 16 21:08:05 2009 +0200| [0151e40d1d849570f576588a1fab85a04653c250] | committer: Laurent Aimar 

Allowed non pace controled access_demux to not implement the pf_demux callback.

 It allows to decrease the number of input thread wakeup and to
improve its reactiveness at user commands in case of data starvation.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0151e40d1d849570f576588a1fab85a04653c250
---

 src/input/demux.h |    3 +++
 src/input/input.c |   23 +++++++++++++++++------
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/src/input/demux.h b/src/input/demux.h
index 084185f..a5ca31f 100644
--- a/src/input/demux.h
+++ b/src/input/demux.h
@@ -42,6 +42,9 @@ void demux_Delete( demux_t * );
 
 static inline int demux_Demux( demux_t *p_demux )
 {
+    if( !p_demux->pf_demux )
+        return 1;
+
     return p_demux->pf_demux( p_demux );
 }
 static inline int demux_vaControl( demux_t *p_demux, int i_query, va_list args )
diff --git a/src/input/input.c b/src/input/input.c
index a2dfd2d..ca80852 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -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 */
@@ -2452,6 +2458,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,
@@ -2629,6 +2637,7 @@ static int InputSourceInit( input_thread_t *p_input,
             }
             goto error;
         }
+        assert( in->p_demux->pf_demux != NULL );
 
         /* Get title from demux */
         if( !p_input->b_preparsing && in->i_title <= 0 )
@@ -2779,11 +2788,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" );
@@ -2822,6 +2832,7 @@ static void SlaveDemux( input_thread_t *p_input )
         {
             i_ret = demux_Demux( in->p_demux );
         }
+        *pb_demux_polled |= in->p_demux->pf_demux != NULL;
 
         if( i_ret <= 0 )
         {




More information about the vlc-devel mailing list