[vlc-devel] [PATCH] input: remove decoder buffering from es_out.c and decoder.c.
Felix Abecassis
felix.abecassis at gmail.com
Tue Dec 10 19:02:45 CET 2013
It is still necessary to wait until each decoder has processed one block before updating the system clock.
Enables HW direct rendering on Nexus 5 and prevents a deadlock from
happening when computing thumbnails on slow Android devices.
---
src/input/decoder.c | 490 ++++++++++++----------------------------------------
src/input/decoder.h | 6 +-
src/input/es_out.c | 21 ++-
3 files changed, 120 insertions(+), 397 deletions(-)
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 65397aa..b208b8e 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -62,8 +62,7 @@ static void *DecoderThread( void * );
static void DecoderProcess( decoder_t *, block_t * );
static void DecoderOutputChangePause( decoder_t *, bool b_paused, mtime_t i_date );
static void DecoderFlush( decoder_t * );
-static void DecoderSignalBuffering( decoder_t *, bool );
-static void DecoderFlushBuffering( decoder_t * );
+static void DecoderSignalWait( decoder_t *, bool );
static void DecoderUnsupportedCodec( decoder_t *, vlc_fourcc_t );
@@ -132,26 +131,10 @@ struct decoder_owner_sys_t
int i_ignore;
} pause;
- /* Buffering */
- bool b_buffering;
- struct
- {
- bool b_first;
- bool b_full;
- int i_count;
-
- picture_t *p_picture;
- picture_t **pp_picture_next;
-
- subpicture_t *p_subpic;
- subpicture_t **pp_subpic_next;
-
- block_t *p_audio;
- block_t **pp_audio_next;
-
- block_t *p_block;
- block_t **pp_block_next;
- } buffer;
+ /* Waiting */
+ bool b_waiting;
+ bool b_first;
+ bool b_has_data;
/* Flushing */
bool b_flushing;
@@ -168,10 +151,6 @@ struct decoder_owner_sys_t
mtime_t i_ts_delay;
};
-#define DECODER_MAX_BUFFERING_COUNT (4)
-#define DECODER_MAX_BUFFERING_AUDIO_DURATION (AOUT_MAX_PREPARE_TIME)
-#define DECODER_MAX_BUFFERING_VIDEO_DURATION (1*CLOCK_FREQ)
-
/* Pictures which are DECODER_BOGUS_VIDEO_DELAY or more in advance probably have
* a bogus PTS and won't be displayed */
#define DECODER_BOGUS_VIDEO_DELAY ((mtime_t)(DEFAULT_PTS_DELAY * 30))
@@ -352,11 +331,11 @@ void input_DecoderDelete( decoder_t *p_dec )
vlc_cancel( p_owner->thread );
- /* Make sure we aren't paused/buffering/waiting/decoding anymore */
+ /* Make sure we aren't paused/waiting/decoding anymore */
vlc_mutex_lock( &p_owner->lock );
const bool b_was_paused = p_owner->b_paused;
p_owner->b_paused = false;
- p_owner->b_buffering = false;
+ p_owner->b_waiting = false;
p_owner->b_flushing = true;
p_owner->b_exit = true;
vlc_cond_signal( &p_owner->wait_request );
@@ -392,11 +371,11 @@ void input_DecoderDecode( decoder_t *p_dec, block_t *p_block, bool b_do_pace )
if( b_do_pace )
{
- /* The fifo is not consummed when buffering and so will
+ /* The fifo is not consumed when waiting and so will
* deadlock vlc.
- * There is no need to lock as b_buffering is never modify
+ * There is no need to lock as b_waiting is never modified
* inside decoder thread. */
- if( !p_owner->b_buffering )
+ if( !p_owner->b_waiting )
block_FifoPace( p_owner->p_fifo, 10, SIZE_MAX );
}
#ifdef __arm__
@@ -418,11 +397,9 @@ void input_DecoderDecode( decoder_t *p_dec, block_t *p_block, bool b_do_pace )
bool input_DecoderIsEmpty( decoder_t * p_dec )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
- assert( !p_owner->b_buffering );
+ assert( !p_owner->b_waiting );
bool b_empty = block_FifoCount( p_dec->p_owner->p_fifo ) <= 0;
- if (p_owner->buffer.i_count) /* buffered frames */
- b_empty = false;
if( b_empty )
{
@@ -545,7 +522,7 @@ void input_DecoderChangeDelay( decoder_t *p_dec, mtime_t i_delay )
vlc_mutex_unlock( &p_owner->lock );
}
-void input_DecoderStartBuffering( decoder_t *p_dec )
+void input_DecoderStartWait( decoder_t *p_dec )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
@@ -553,53 +530,36 @@ void input_DecoderStartBuffering( decoder_t *p_dec )
DecoderFlush( p_dec );
- p_owner->buffer.b_first = true;
- p_owner->buffer.b_full = false;
- p_owner->buffer.i_count = 0;
-
- assert( !p_owner->buffer.p_picture && !p_owner->buffer.p_subpic &&
- !p_owner->buffer.p_audio && !p_owner->buffer.p_block );
-
- p_owner->buffer.p_picture = NULL;
- p_owner->buffer.pp_picture_next = &p_owner->buffer.p_picture;
-
- p_owner->buffer.p_subpic = NULL;
- p_owner->buffer.pp_subpic_next = &p_owner->buffer.p_subpic;
-
- p_owner->buffer.p_audio = NULL;
- p_owner->buffer.pp_audio_next = &p_owner->buffer.p_audio;
-
- p_owner->buffer.p_block = NULL;
- p_owner->buffer.pp_block_next = &p_owner->buffer.p_block;
+ p_owner->b_first = true;
+ p_owner->b_has_data = false;
-
- p_owner->b_buffering = true;
+ p_owner->b_waiting = true;
vlc_cond_signal( &p_owner->wait_request );
vlc_mutex_unlock( &p_owner->lock );
}
-void input_DecoderStopBuffering( decoder_t *p_dec )
+void input_DecoderStopWait( decoder_t *p_dec )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
vlc_mutex_lock( &p_owner->lock );
- p_owner->b_buffering = false;
+ p_owner->b_waiting = false;
vlc_cond_signal( &p_owner->wait_request );
vlc_mutex_unlock( &p_owner->lock );
}
-void input_DecoderWaitBuffering( decoder_t *p_dec )
+void input_DecoderWait( decoder_t *p_dec )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
vlc_mutex_lock( &p_owner->lock );
- while( p_owner->b_buffering && !p_owner->buffer.b_full )
+ while( p_owner->b_waiting && !p_owner->b_has_data )
{
block_FifoWake( p_owner->p_fifo );
vlc_cond_wait( &p_owner->wait_acknowledge, &p_owner->lock );
@@ -699,7 +659,7 @@ static mtime_t DecoderGetDisplayDate( decoder_t *p_dec, mtime_t i_ts )
decoder_owner_sys_t *p_owner = p_dec->p_owner;
vlc_mutex_lock( &p_owner->lock );
- if( p_owner->b_buffering || p_owner->b_paused )
+ if( p_owner->b_waiting || p_owner->b_paused )
i_ts = VLC_TS_INVALID;
vlc_mutex_unlock( &p_owner->lock );
@@ -878,14 +838,9 @@ static decoder_t * CreateDecoder( vlc_object_t *p_parent,
p_owner->pause.i_date = VLC_TS_INVALID;
p_owner->pause.i_ignore = 0;
- p_owner->b_buffering = false;
- p_owner->buffer.b_first = true;
- p_owner->buffer.b_full = false;
- p_owner->buffer.i_count = 0;
- p_owner->buffer.p_picture = NULL;
- p_owner->buffer.p_subpic = NULL;
- p_owner->buffer.p_audio = NULL;
- p_owner->buffer.p_block = NULL;
+ p_owner->b_waiting = false;
+ p_owner->b_first = true;
+ p_owner->b_has_data = false;
p_owner->b_flushing = false;
@@ -925,10 +880,10 @@ static void *DecoderThread( void *p_data )
/* Make sure there is no cancellation point other than this one^^.
* If you need one, be sure to push cleanup of p_block. */
- bool end_buffering = !p_block || p_block->i_flags & BLOCK_FLAG_CORE_EOS;
- DecoderSignalBuffering( p_dec, end_buffering );
- if (end_buffering)
- input_DecoderStopBuffering( p_dec );
+ bool end_wait = !p_block || p_block->i_flags & BLOCK_FLAG_CORE_EOS;
+ DecoderSignalWait( p_dec, end_wait );
+ if (end_wait)
+ input_DecoderStopWait( p_dec );
if( p_block )
{
@@ -988,16 +943,16 @@ static void DecoderFlush( decoder_t *p_dec )
vlc_cond_wait( &p_owner->wait_acknowledge, &p_owner->lock );
}
-static void DecoderSignalBuffering( decoder_t *p_dec, bool b_full )
+static void DecoderSignalWait( decoder_t *p_dec, bool b_has_data )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
vlc_mutex_lock( &p_owner->lock );
- if( p_owner->b_buffering )
+ if( p_owner->b_waiting )
{
- if( b_full )
- p_owner->buffer.b_full = true;
+ if( b_has_data )
+ p_owner->b_has_data = true;
vlc_cond_signal( &p_owner->wait_acknowledge );
}
@@ -1030,7 +985,7 @@ static bool DecoderWaitUnblock( decoder_t *p_dec )
break;
if( p_owner->b_paused )
{
- if( p_owner->b_buffering && !p_owner->buffer.b_full )
+ if( p_owner->b_waiting && !p_owner->b_has_data )
break;
if( p_owner->pause.i_ignore > 0 )
{
@@ -1040,7 +995,7 @@ static bool DecoderWaitUnblock( decoder_t *p_dec )
}
else
{
- if( !p_owner->b_buffering || !p_owner->buffer.b_full )
+ if( !p_owner->b_waiting || !p_owner->b_has_data )
break;
}
vlc_cond_wait( &p_owner->wait_request, &p_owner->lock );
@@ -1176,45 +1131,20 @@ static void DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio,
/* */
vlc_mutex_lock( &p_owner->lock );
- if( p_audio && (p_owner->b_buffering || p_owner->buffer.p_audio) )
+ if( p_audio && p_owner->b_waiting )
{
- p_audio->p_next = NULL;
-
- *p_owner->buffer.pp_audio_next = p_audio;
- p_owner->buffer.pp_audio_next = &p_audio->p_next;
-
- p_owner->buffer.i_count++;
- if( p_owner->buffer.i_count > DECODER_MAX_BUFFERING_COUNT ||
- p_audio->i_pts - p_owner->buffer.p_audio->i_pts > DECODER_MAX_BUFFERING_AUDIO_DURATION )
- {
- p_owner->buffer.b_full = true;
- vlc_cond_signal( &p_owner->wait_acknowledge );
- }
+ p_owner->b_has_data = true;
+ vlc_cond_signal( &p_owner->wait_acknowledge );
}
for( ;; )
{
- bool b_has_more = false, b_paused;
+ bool b_paused;
bool b_reject = DecoderWaitUnblock( p_dec );
- if( p_owner->b_buffering )
- break;
b_paused = p_owner->b_paused;
- /* */
- if( p_owner->buffer.p_audio )
- {
- p_audio = p_owner->buffer.p_audio;
-
- p_owner->buffer.p_audio = p_audio->p_next;
- p_owner->buffer.i_count--;
-
- b_has_more = p_owner->buffer.p_audio != NULL;
- if( !b_has_more )
- p_owner->buffer.pp_audio_next = &p_owner->buffer.p_audio;
- }
-
if (!p_audio)
break;
@@ -1251,10 +1181,7 @@ static void DecoderPlayAudio( decoder_t *p_dec, block_t *p_audio,
block_Release( p_audio );
}
- if( !b_has_more )
- break;
- if( !p_owner->buffer.p_audio )
- break;
+ break;
}
vlc_mutex_unlock( &p_owner->lock );
}
@@ -1363,7 +1290,6 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
vout_thread_t *p_vout = p_owner->p_vout;
- bool b_first_buffered;
if( p_picture->date <= VLC_TS_INVALID )
{
@@ -1376,107 +1302,59 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
/* */
vlc_mutex_lock( &p_owner->lock );
- if( ( p_owner->b_buffering && !p_owner->buffer.b_first ) || p_owner->buffer.p_picture )
+ if( p_owner->b_waiting && !p_owner->b_first )
{
- p_picture->p_next = NULL;
-
- *p_owner->buffer.pp_picture_next = p_picture;
- p_owner->buffer.pp_picture_next = &p_picture->p_next;
-
- p_owner->buffer.i_count++;
- if( p_owner->buffer.i_count > DECODER_MAX_BUFFERING_COUNT ||
- p_picture->date - p_owner->buffer.p_picture->date > DECODER_MAX_BUFFERING_VIDEO_DURATION )
- {
- p_owner->buffer.b_full = true;
- vlc_cond_signal( &p_owner->wait_acknowledge );
- }
+ p_owner->b_has_data = true;
+ vlc_cond_signal( &p_owner->wait_acknowledge );
}
- b_first_buffered = p_owner->buffer.p_picture != NULL;
+ bool b_first_after_wait = p_owner->b_waiting && p_owner->b_has_data;
- for( ;; b_first_buffered = false )
- {
- bool b_has_more = false;
-
- bool b_reject = DecoderWaitUnblock( p_dec );
+ bool b_reject = DecoderWaitUnblock( p_dec );
- if( p_owner->b_buffering && !p_owner->buffer.b_first )
- {
- vlc_mutex_unlock( &p_owner->lock );
- return;
- }
- bool b_buffering_first = p_owner->b_buffering;
-
- /* */
- if( p_owner->buffer.p_picture )
- {
- p_picture = p_owner->buffer.p_picture;
-
- p_owner->buffer.p_picture = p_picture->p_next;
- p_owner->buffer.i_count--;
-
- b_has_more = p_owner->buffer.p_picture != NULL;
- if( !b_has_more )
- p_owner->buffer.pp_picture_next = &p_owner->buffer.p_picture;
- }
-
- /* */
- if( b_buffering_first )
- {
- assert( p_owner->buffer.b_first );
- assert( !p_owner->buffer.i_count );
- msg_Dbg( p_dec, "Received first picture" );
- p_owner->buffer.b_first = false;
- p_picture->b_force = true;
- }
+ if( p_owner->b_waiting )
+ {
+ msg_Dbg( p_dec, "Received first picture" );
+ p_owner->b_first = false;
+ p_picture->b_force = true;
+ }
- const bool b_dated = p_picture->date > VLC_TS_INVALID;
- int i_rate = INPUT_RATE_DEFAULT;
- DecoderFixTs( p_dec, &p_picture->date, NULL, NULL,
- &i_rate, DECODER_BOGUS_VIDEO_DELAY );
+ const bool b_dated = p_picture->date > VLC_TS_INVALID;
+ int i_rate = INPUT_RATE_DEFAULT;
+ DecoderFixTs( p_dec, &p_picture->date, NULL, NULL,
+ &i_rate, DECODER_BOGUS_VIDEO_DELAY );
- vlc_mutex_unlock( &p_owner->lock );
+ vlc_mutex_unlock( &p_owner->lock );
- /* */
- if( !p_picture->b_force && p_picture->date <= VLC_TS_INVALID ) // FIXME --VLC_TS_INVALID verify video_output/*
- b_reject = true;
+ /* */
+ if( !p_picture->b_force && p_picture->date <= VLC_TS_INVALID ) // FIXME --VLC_TS_INVALID verify video_output/*
+ b_reject = true;
- if( !b_reject )
+ if( !b_reject )
+ {
+ if( i_rate != p_owner->i_last_rate || b_first_after_wait )
{
- if( i_rate != p_owner->i_last_rate || b_first_buffered )
- {
- /* Be sure to not display old picture after our own */
- vout_Flush( p_vout, p_picture->date );
- p_owner->i_last_rate = i_rate;
- }
- vout_PutPicture( p_vout, p_picture );
+ /* Be sure to not display old picture after our own */
+ vout_Flush( p_vout, p_picture->date );
+ p_owner->i_last_rate = i_rate;
}
+ vout_PutPicture( p_vout, p_picture );
+ }
+ else
+ {
+ if( b_dated )
+ msg_Warn( p_dec, "early picture skipped" );
else
- {
- if( b_dated )
- msg_Warn( p_dec, "early picture skipped" );
- else
- msg_Warn( p_dec, "non-dated video buffer received" );
+ msg_Warn( p_dec, "non-dated video buffer received" );
- *pi_lost_sum += 1;
- vout_ReleasePicture( p_vout, p_picture );
- }
- int i_tmp_display;
- int i_tmp_lost;
- vout_GetResetStatistic( p_vout, &i_tmp_display, &i_tmp_lost );
-
- *pi_played_sum += i_tmp_display;
- *pi_lost_sum += i_tmp_lost;
-
- if( !b_has_more || b_buffering_first )
- break;
-
- vlc_mutex_lock( &p_owner->lock );
- if( !p_owner->buffer.p_picture )
- {
- vlc_mutex_unlock( &p_owner->lock );
- break;
- }
+ *pi_lost_sum += 1;
+ vout_ReleasePicture( p_vout, p_picture );
}
+ int i_tmp_display;
+ int i_tmp_lost;
+ vout_GetResetStatistic( p_vout, &i_tmp_display, &i_tmp_lost );
+
+ *pi_played_sum += i_tmp_display;
+ *pi_lost_sum += i_tmp_lost;
}
static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block )
@@ -1553,71 +1431,29 @@ static void DecoderPlaySpu( decoder_t *p_dec, subpicture_t *p_subpic )
/* */
vlc_mutex_lock( &p_owner->lock );
- if( p_owner->b_buffering || p_owner->buffer.p_subpic )
+ if( p_owner->b_waiting )
{
- p_subpic->p_next = NULL;
-
- *p_owner->buffer.pp_subpic_next = p_subpic;
- p_owner->buffer.pp_subpic_next = &p_subpic->p_next;
-
- p_owner->buffer.i_count++;
- /* XXX it is important to be full after the first one */
- if( p_owner->buffer.i_count > 0 )
- {
- p_owner->buffer.b_full = true;
- vlc_cond_signal( &p_owner->wait_acknowledge );
- }
+ p_owner->b_has_data = true;
+ vlc_cond_signal( &p_owner->wait_acknowledge );
}
- for( ;; )
- {
- bool b_has_more = false;
- bool b_reject = DecoderWaitUnblock( p_dec );
-
- if( p_owner->b_buffering )
- {
- vlc_mutex_unlock( &p_owner->lock );
- return;
- }
-
- /* */
- if( p_owner->buffer.p_subpic )
- {
- p_subpic = p_owner->buffer.p_subpic;
+ bool b_reject = DecoderWaitUnblock( p_dec );
- p_owner->buffer.p_subpic = p_subpic->p_next;
- p_owner->buffer.i_count--;
-
- b_has_more = p_owner->buffer.p_subpic != NULL;
- if( !b_has_more )
- p_owner->buffer.pp_subpic_next = &p_owner->buffer.p_subpic;
- }
-
- /* */
- DecoderFixTs( p_dec, &p_subpic->i_start, &p_subpic->i_stop, NULL,
- NULL, INT64_MAX );
-
- if( p_subpic->i_start <= VLC_TS_INVALID )
- b_reject = true;
+ /* */
+ DecoderFixTs( p_dec, &p_subpic->i_start, &p_subpic->i_stop, NULL,
+ NULL, INT64_MAX );
- DecoderWaitDate( p_dec, &b_reject,
- p_subpic->i_start - SPU_MAX_PREPARE_TIME );
- vlc_mutex_unlock( &p_owner->lock );
+ if( p_subpic->i_start <= VLC_TS_INVALID )
+ b_reject = true;
- if( !b_reject )
- vout_PutSubpicture( p_vout, p_subpic );
- else
- subpicture_Delete( p_subpic );
+ DecoderWaitDate( p_dec, &b_reject,
+ p_subpic->i_start - SPU_MAX_PREPARE_TIME );
+ vlc_mutex_unlock( &p_owner->lock );
- if( !b_has_more )
- break;
- vlc_mutex_lock( &p_owner->lock );
- if( !p_owner->buffer.p_subpic )
- {
- vlc_mutex_unlock( &p_owner->lock );
- break;
- }
- }
+ if( !b_reject )
+ vout_PutSubpicture( p_vout, p_subpic );
+ else
+ subpicture_Delete( p_subpic );
}
#ifdef ENABLE_SOUT
@@ -1630,122 +1466,26 @@ static void DecoderPlaySout( decoder_t *p_dec, block_t *p_sout_block )
vlc_mutex_lock( &p_owner->lock );
- if( p_owner->b_buffering || p_owner->buffer.p_block )
+ if( p_owner->b_waiting )
{
- block_ChainLastAppend( &p_owner->buffer.pp_block_next, p_sout_block );
-
- p_owner->buffer.i_count++;
- /* XXX it is important to be full after the first one */
- if( p_owner->buffer.i_count > 0 )
- {
- p_owner->buffer.b_full = true;
- vlc_cond_signal( &p_owner->wait_acknowledge );
- }
+ p_owner->b_has_data = true;
+ vlc_cond_signal( &p_owner->wait_acknowledge );
}
- for( ;; )
- {
- bool b_has_more = false;
- bool b_reject = DecoderWaitUnblock( p_dec );
-
- if( p_owner->b_buffering )
- {
- vlc_mutex_unlock( &p_owner->lock );
- return;
- }
-
- /* */
- if( p_owner->buffer.p_block )
- {
- p_sout_block = p_owner->buffer.p_block;
-
- p_owner->buffer.p_block = p_sout_block->p_next;
- p_owner->buffer.i_count--;
-
- b_has_more = p_owner->buffer.p_block != NULL;
- if( !b_has_more )
- p_owner->buffer.pp_block_next = &p_owner->buffer.p_block;
- }
- p_sout_block->p_next = NULL;
-
- DecoderFixTs( p_dec, &p_sout_block->i_dts, &p_sout_block->i_pts,
- &p_sout_block->i_length, NULL, INT64_MAX );
+ bool b_reject = DecoderWaitUnblock( p_dec );
- vlc_mutex_unlock( &p_owner->lock );
+ DecoderFixTs( p_dec, &p_sout_block->i_dts, &p_sout_block->i_pts,
+ &p_sout_block->i_length, NULL, INT64_MAX );
- if( !b_reject )
- sout_InputSendBuffer( p_owner->p_sout_input, p_sout_block ); // FIXME --VLC_TS_INVALID inspect stream_output/*
- else
- block_Release( p_sout_block );
+ vlc_mutex_unlock( &p_owner->lock );
- if( !b_has_more )
- break;
- vlc_mutex_lock( &p_owner->lock );
- if( !p_owner->buffer.p_block )
- {
- vlc_mutex_unlock( &p_owner->lock );
- break;
- }
- }
+ if( !b_reject )
+ sout_InputSendBuffer( p_owner->p_sout_input, p_sout_block ); // FIXME --VLC_TS_INVALID inspect stream_output/*
+ else
+ block_Release( p_sout_block );
}
#endif
-/* */
-static void DecoderFlushBuffering( decoder_t *p_dec )
-{
- decoder_owner_sys_t *p_owner = p_dec->p_owner;
-
- vlc_assert_locked( &p_owner->lock );
-
- while( p_owner->buffer.p_picture )
- {
- picture_t *p_picture = p_owner->buffer.p_picture;
-
- p_owner->buffer.p_picture = p_picture->p_next;
- p_owner->buffer.i_count--;
-
- if( p_owner->p_vout )
- {
- vout_ReleasePicture( p_owner->p_vout, p_picture );
- }
-
- if( !p_owner->buffer.p_picture )
- p_owner->buffer.pp_picture_next = &p_owner->buffer.p_picture;
- }
- while( p_owner->buffer.p_audio )
- {
- block_t *p_audio = p_owner->buffer.p_audio;
-
- p_owner->buffer.p_audio = p_audio->p_next;
- p_owner->buffer.i_count--;
-
- block_Release( p_audio );
-
- if( !p_owner->buffer.p_audio )
- p_owner->buffer.pp_audio_next = &p_owner->buffer.p_audio;
- }
- while( p_owner->buffer.p_subpic )
- {
- subpicture_t *p_subpic = p_owner->buffer.p_subpic;
-
- p_owner->buffer.p_subpic = p_subpic->p_next;
- p_owner->buffer.i_count--;
-
- subpicture_Delete( p_subpic );
-
- if( !p_owner->buffer.p_subpic )
- p_owner->buffer.pp_subpic_next = &p_owner->buffer.p_subpic;
- }
- if( p_owner->buffer.p_block )
- {
- block_ChainRelease( p_owner->buffer.p_block );
-
- p_owner->buffer.i_count = 0;
- p_owner->buffer.p_block = NULL;
- p_owner->buffer.pp_block_next = &p_owner->buffer.p_block;
- }
-}
-
#ifdef ENABLE_SOUT
/* This function process a block for sout
*/
@@ -1962,7 +1702,6 @@ static void DecoderProcessOnFlush( decoder_t *p_dec )
decoder_owner_sys_t *p_owner = p_dec->p_owner;
vlc_mutex_lock( &p_owner->lock );
- DecoderFlushBuffering( p_dec );
if( p_owner->b_flushing )
{
@@ -2064,11 +1803,6 @@ static void DeleteDecoder( decoder_t * p_dec )
block_FifoEmpty( p_owner->p_fifo );
block_FifoRelease( p_owner->p_fifo );
- /* */
- vlc_mutex_lock( &p_owner->lock );
- DecoderFlushBuffering( p_dec );
- vlc_mutex_unlock( &p_owner->lock );
-
/* Cleanup */
if( p_owner->p_aout )
{
@@ -2186,7 +1920,6 @@ static int aout_update_format( decoder_t *p_dec )
/* Parameters changed, restart the aout */
vlc_mutex_lock( &p_owner->lock );
- DecoderFlushBuffering( p_dec );
aout_DecDelete( p_owner->p_aout );
p_owner->p_aout = NULL;
@@ -2347,8 +2080,6 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
vlc_mutex_lock( &p_owner->lock );
- DecoderFlushBuffering( p_dec );
-
p_vout = p_owner->p_vout;
p_owner->p_vout = NULL;
vlc_mutex_unlock( &p_owner->lock );
@@ -2374,8 +2105,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
p_vout = input_resource_RequestVout( p_owner->p_resource,
p_vout, &fmt,
dpb_size +
- p_dec->i_extra_picture_buffers +
- 1 + DECODER_MAX_BUFFERING_COUNT,
+ p_dec->i_extra_picture_buffers + 1,
true );
vlc_mutex_lock( &p_owner->lock );
p_owner->p_vout = p_vout;
@@ -2409,7 +2139,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
return NULL;
/* */
- DecoderSignalBuffering( p_dec, true );
+ DecoderSignalWait( p_dec, true );
/* Check the decoder doesn't leak pictures */
vout_FixLeaks( p_owner->p_vout );
@@ -2462,12 +2192,6 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec,
if( p_owner->p_spu_vout != p_vout )
{
- vlc_mutex_lock( &p_owner->lock );
-
- DecoderFlushBuffering( p_dec );
-
- vlc_mutex_unlock( &p_owner->lock );
-
p_owner->i_spu_channel = vout_RegisterSubpictureChannel( p_vout );
p_owner->i_spu_order = 0;
p_owner->p_spu_vout = p_vout;
diff --git a/src/input/decoder.h b/src/input/decoder.h
index 1c9e1b6..3cfecd7 100644
--- a/src/input/decoder.h
+++ b/src/input/decoder.h
@@ -49,17 +49,17 @@ void input_DecoderChangeDelay( decoder_t *, mtime_t i_delay );
/**
* This function starts the buffering mode.
*/
-void input_DecoderStartBuffering( decoder_t * );
+void input_DecoderStartWait( decoder_t * );
/**
* This function waits for the decoder to have buffered sufficient data.
*/
-void input_DecoderWaitBuffering( decoder_t * );
+void input_DecoderWait( decoder_t * );
/**
* This function stops the buffering mode.
*/
-void input_DecoderStopBuffering( decoder_t * );
+void input_DecoderStopWait( decoder_t * );
/**
* This function returns true if the decoder fifo is empty and false otherwise.
diff --git a/src/input/es_out.c b/src/input/es_out.c
index 97e6b65..00935c4 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -491,7 +491,7 @@ static int EsOutSetRecord( es_out_t *out, bool b_record )
p_es->p_dec_record = input_DecoderNew( p_input, &p_es->fmt, p_es->p_pgrm->p_clock, p_sys->p_sout_record );
if( p_es->p_dec_record && p_sys->b_buffering )
- input_DecoderStartBuffering( p_es->p_dec_record );
+ input_DecoderStartWait( p_es->p_dec_record );
}
}
else
@@ -576,10 +576,10 @@ static void EsOutChangePosition( es_out_t *out )
if( !p_es->p_dec )
continue;
- input_DecoderStartBuffering( p_es->p_dec );
+ input_DecoderStartWait( p_es->p_dec );
if( p_es->p_dec_record )
- input_DecoderStartBuffering( p_es->p_dec_record );
+ input_DecoderStartWait( p_es->p_dec_record );
}
for( int i = 0; i < p_sys->i_pgrm; i++ )
@@ -646,18 +646,17 @@ static void EsOutDecodersStopBuffering( es_out_t *out, bool b_forced )
if( !p_es->p_dec || p_es->fmt.i_cat == SPU_ES )
continue;
- input_DecoderWaitBuffering( p_es->p_dec );
+ input_DecoderWait( p_es->p_dec );
if( p_es->p_dec_record )
- input_DecoderWaitBuffering( p_es->p_dec_record );
+ input_DecoderWait( p_es->p_dec_record );
}
- msg_Dbg( p_sys->p_input, "Decoder buffering done in %d ms",
+ msg_Dbg( p_sys->p_input, "Decoder wait done in %d ms",
(int)(mdate() - i_decoder_buffering_start)/1000 );
/* Here is a good place to destroy unused vout with every demuxer */
input_resource_TerminateVout( p_sys->p_input->p->p_resource );
- /* */
const mtime_t i_wakeup_delay = 10*1000; /* FIXME CLEANUP thread wake up time*/
const mtime_t i_current_date = p_sys->b_paused ? p_sys->i_pause_date : mdate();
@@ -671,9 +670,9 @@ static void EsOutDecodersStopBuffering( es_out_t *out, bool b_forced )
if( !p_es->p_dec )
continue;
- input_DecoderStopBuffering( p_es->p_dec );
+ input_DecoderStopWait( p_es->p_dec );
if( p_es->p_dec_record )
- input_DecoderStopBuffering( p_es->p_dec_record );
+ input_DecoderStopWait( p_es->p_dec_record );
}
}
static void EsOutDecodersChangePause( es_out_t *out, bool b_paused, mtime_t i_date )
@@ -1558,13 +1557,13 @@ static void EsCreateDecoder( es_out_t *out, es_out_id_t *p_es )
if( p_es->p_dec )
{
if( p_sys->b_buffering )
- input_DecoderStartBuffering( p_es->p_dec );
+ input_DecoderStartWait( p_es->p_dec );
if( !p_es->p_master && p_sys->p_sout_record )
{
p_es->p_dec_record = input_DecoderNew( p_input, &p_es->fmt, p_es->p_pgrm->p_clock, p_sys->p_sout_record );
if( p_es->p_dec_record && p_sys->b_buffering )
- input_DecoderStartBuffering( p_es->p_dec_record );
+ input_DecoderStartWait( p_es->p_dec_record );
}
}
--
1.8.3.2
More information about the vlc-devel
mailing list