Commit 0151e40d authored by Laurent Aimar's avatar 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.
parent 2f9d9766
...@@ -42,6 +42,9 @@ void demux_Delete( demux_t * ); ...@@ -42,6 +42,9 @@ void demux_Delete( demux_t * );
static inline int demux_Demux( demux_t *p_demux ) static inline int demux_Demux( demux_t *p_demux )
{ {
if( !p_demux->pf_demux )
return 1;
return p_demux->pf_demux( p_demux ); return p_demux->pf_demux( p_demux );
} }
static inline int demux_vaControl( demux_t *p_demux, int i_query, va_list args ) static inline int demux_vaControl( demux_t *p_demux, int i_query, va_list args )
......
...@@ -94,7 +94,7 @@ static void InputSourceMeta( input_thread_t *, input_source_t *, vlc_meta_t * ); ...@@ -94,7 +94,7 @@ static void InputSourceMeta( input_thread_t *, input_source_t *, vlc_meta_t * );
/* TODO */ /* TODO */
//static void InputGetAttachments( input_thread_t *, input_source_t * ); //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 SlaveSeek( input_thread_t *p_input );
static void InputMetaUser( input_thread_t *p_input, vlc_meta_t *p_meta ); static void InputMetaUser( input_thread_t *p_input, vlc_meta_t *p_meta );
...@@ -592,11 +592,12 @@ exit: ...@@ -592,11 +592,12 @@ exit:
* MainLoopDemux * MainLoopDemux
* It asks the demuxer to demux some data * 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; int i_ret;
*pb_changed = false; *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 ) || 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() ) ) ( 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_ ...@@ -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 ) 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 ) ...@@ -755,6 +759,7 @@ static void MainLoop( input_thread_t *p_input )
mtime_t i_deadline; mtime_t i_deadline;
mtime_t i_wakeup; mtime_t i_wakeup;
bool b_paused; bool b_paused;
bool b_demux_polled;
/* Demux data */ /* Demux data */
b_force_update = false; b_force_update = false;
...@@ -765,11 +770,12 @@ static void MainLoop( input_thread_t *p_input ) ...@@ -765,11 +770,12 @@ static void MainLoop( input_thread_t *p_input )
b_paused = p_input->p->i_state == PAUSE_S && b_paused = p_input->p->i_state == PAUSE_S &&
!es_out_GetBuffering( p_input->p->p_es_out ); !es_out_GetBuffering( p_input->p->p_es_out );
b_demux_polled = true;
if( !b_paused ) if( !b_paused )
{ {
if( !p_input->p->input.b_eof ) 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 ); i_wakeup = es_out_GetWakeup( p_input->p->p_es_out );
} }
...@@ -788,7 +794,7 @@ static void MainLoop( input_thread_t *p_input ) ...@@ -788,7 +794,7 @@ static void MainLoop( input_thread_t *p_input )
/* */ /* */
do { do {
i_deadline = i_wakeup; i_deadline = i_wakeup;
if( b_paused ) if( b_paused || !b_demux_polled )
i_deadline = __MIN( i_intf_update, i_statistic_update ); i_deadline = __MIN( i_intf_update, i_statistic_update );
/* Handle control */ /* Handle control */
...@@ -2452,6 +2458,8 @@ static int InputSourceInit( input_thread_t *p_input, ...@@ -2452,6 +2458,8 @@ static int InputSourceInit( input_thread_t *p_input,
&in->b_can_pace_control ) ) &in->b_can_pace_control ) )
in->b_can_pace_control = false; 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( !in->b_can_pace_control )
{ {
if( demux_Control( in->p_demux, DEMUX_CAN_CONTROL_RATE, if( demux_Control( in->p_demux, DEMUX_CAN_CONTROL_RATE,
...@@ -2629,6 +2637,7 @@ static int InputSourceInit( input_thread_t *p_input, ...@@ -2629,6 +2637,7 @@ static int InputSourceInit( input_thread_t *p_input,
} }
goto error; goto error;
} }
assert( in->p_demux->pf_demux != NULL );
/* Get title from demux */ /* Get title from demux */
if( !p_input->b_preparsing && in->i_title <= 0 ) if( !p_input->b_preparsing && in->i_title <= 0 )
...@@ -2779,11 +2788,12 @@ static void InputSourceMeta( input_thread_t *p_input, ...@@ -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; int64_t i_time;
int i; int i;
*pb_demux_polled = false;
if( demux_Control( p_input->p->input.p_demux, DEMUX_GET_TIME, &i_time ) ) 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" ); msg_Err( p_input, "demux doesn't like DEMUX_GET_TIME" );
...@@ -2822,6 +2832,7 @@ static void SlaveDemux( input_thread_t *p_input ) ...@@ -2822,6 +2832,7 @@ static void SlaveDemux( input_thread_t *p_input )
{ {
i_ret = demux_Demux( in->p_demux ); i_ret = demux_Demux( in->p_demux );
} }
*pb_demux_polled |= in->p_demux->pf_demux != NULL;
if( i_ret <= 0 ) if( i_ret <= 0 )
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment