Commit d02721a5 authored by Felix Abecassis's avatar Felix Abecassis Committed by Jean-Baptiste Kempf

input: remove video decoder buffering.

Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent 0e5576b3
...@@ -140,9 +140,6 @@ struct decoder_owner_sys_t ...@@ -140,9 +140,6 @@ struct decoder_owner_sys_t
bool b_full; bool b_full;
int i_count; int i_count;
picture_t *p_picture;
picture_t **pp_picture_next;
subpicture_t *p_subpic; subpicture_t *p_subpic;
subpicture_t **pp_subpic_next; subpicture_t **pp_subpic_next;
...@@ -165,9 +162,6 @@ struct decoder_owner_sys_t ...@@ -165,9 +162,6 @@ struct decoder_owner_sys_t
mtime_t i_ts_delay; mtime_t i_ts_delay;
}; };
#define DECODER_MAX_BUFFERING_COUNT (4)
#define DECODER_MAX_BUFFERING_VIDEO_DURATION (1*CLOCK_FREQ)
/* Pictures which are DECODER_BOGUS_VIDEO_DELAY or more in advance probably have /* Pictures which are DECODER_BOGUS_VIDEO_DELAY or more in advance probably have
* a bogus PTS and won't be displayed */ * a bogus PTS and won't be displayed */
#define DECODER_BOGUS_VIDEO_DELAY ((mtime_t)(DEFAULT_PTS_DELAY * 30)) #define DECODER_BOGUS_VIDEO_DELAY ((mtime_t)(DEFAULT_PTS_DELAY * 30))
...@@ -553,12 +547,9 @@ void input_DecoderStartBuffering( decoder_t *p_dec ) ...@@ -553,12 +547,9 @@ void input_DecoderStartBuffering( decoder_t *p_dec )
p_owner->buffer.b_full = false; p_owner->buffer.b_full = false;
p_owner->buffer.i_count = 0; p_owner->buffer.i_count = 0;
assert( !p_owner->buffer.p_picture && !p_owner->buffer.p_subpic && assert( !p_owner->buffer.p_subpic &&
!p_owner->buffer.p_block ); !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.p_subpic = NULL;
p_owner->buffer.pp_subpic_next = &p_owner->buffer.p_subpic; p_owner->buffer.pp_subpic_next = &p_owner->buffer.p_subpic;
...@@ -875,7 +866,6 @@ static decoder_t * CreateDecoder( vlc_object_t *p_parent, ...@@ -875,7 +866,6 @@ static decoder_t * CreateDecoder( vlc_object_t *p_parent,
p_owner->buffer.b_first = true; p_owner->buffer.b_first = true;
p_owner->buffer.b_full = false; p_owner->buffer.b_full = false;
p_owner->buffer.i_count = 0; p_owner->buffer.i_count = 0;
p_owner->buffer.p_picture = NULL;
p_owner->buffer.p_subpic = NULL; p_owner->buffer.p_subpic = NULL;
p_owner->buffer.p_block = NULL; p_owner->buffer.p_block = NULL;
...@@ -1327,7 +1317,6 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture, ...@@ -1327,7 +1317,6 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
{ {
decoder_owner_sys_t *p_owner = p_dec->p_owner; decoder_owner_sys_t *p_owner = p_dec->p_owner;
vout_thread_t *p_vout = p_owner->p_vout; vout_thread_t *p_vout = p_owner->p_vout;
bool b_first_buffered;
if( p_picture->date <= VLC_TS_INVALID ) if( p_picture->date <= VLC_TS_INVALID )
{ {
...@@ -1340,51 +1329,16 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture, ...@@ -1340,51 +1329,16 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
/* */ /* */
vlc_mutex_lock( &p_owner->lock ); 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_buffering && !p_owner->buffer.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; p_owner->buffer.b_full = true;
vlc_cond_signal( &p_owner->wait_acknowledge ); vlc_cond_signal( &p_owner->wait_acknowledge );
} }
} bool b_first_after_wait = p_owner->b_buffering && p_owner->buffer.b_full;
b_first_buffered = p_owner->buffer.p_picture != NULL;
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 ) if( p_owner->b_buffering )
{
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.b_first );
assert( !p_owner->buffer.i_count ); assert( !p_owner->buffer.i_count );
...@@ -1406,7 +1360,7 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture, ...@@ -1406,7 +1360,7 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
if( !b_reject ) if( !b_reject )
{ {
if( i_rate != p_owner->i_last_rate || b_first_buffered ) if( i_rate != p_owner->i_last_rate || b_first_after_wait )
{ {
/* Be sure to not display old picture after our own */ /* Be sure to not display old picture after our own */
vout_Flush( p_vout, p_picture->date ); vout_Flush( p_vout, p_picture->date );
...@@ -1430,17 +1384,6 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture, ...@@ -1430,17 +1384,6 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
*pi_played_sum += i_tmp_display; *pi_played_sum += i_tmp_display;
*pi_lost_sum += i_tmp_lost; *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;
}
}
} }
static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block ) static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block )
...@@ -1660,22 +1603,6 @@ static void DecoderFlushBuffering( decoder_t *p_dec ) ...@@ -1660,22 +1603,6 @@ static void DecoderFlushBuffering( decoder_t *p_dec )
decoder_owner_sys_t *p_owner = p_dec->p_owner; decoder_owner_sys_t *p_owner = p_dec->p_owner;
vlc_assert_locked( &p_owner->lock ); 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_subpic ) while( p_owner->buffer.p_subpic )
{ {
subpicture_t *p_subpic = p_owner->buffer.p_subpic; subpicture_t *p_subpic = p_owner->buffer.p_subpic;
...@@ -2326,8 +2253,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec ) ...@@ -2326,8 +2253,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
p_vout = input_resource_RequestVout( p_owner->p_resource, p_vout = input_resource_RequestVout( p_owner->p_resource,
p_vout, &fmt, p_vout, &fmt,
dpb_size + dpb_size +
p_dec->i_extra_picture_buffers + p_dec->i_extra_picture_buffers + 1,
1 + DECODER_MAX_BUFFERING_COUNT,
true ); true );
vlc_mutex_lock( &p_owner->lock ); vlc_mutex_lock( &p_owner->lock );
p_owner->p_vout = p_vout; p_owner->p_vout = p_vout;
......
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