bool b_first;
bool b_full;
int i_count;
-
- block_t *p_block;
- block_t **pp_block_next;
} buffer;
/* Flushing */
p_owner->buffer.b_full = false;
p_owner->buffer.i_count = 0;
- assert( !p_owner->buffer.p_block );
-
- p_owner->buffer.p_block = NULL;
- p_owner->buffer.pp_block_next = &p_owner->buffer.p_block;
-
-
p_owner->b_buffering = true;
vlc_cond_signal( &p_owner->wait_request );
p_owner->buffer.b_first = true;
p_owner->buffer.b_full = false;
p_owner->buffer.i_count = 0;
- p_owner->buffer.p_block = NULL;
p_owner->b_flushing = false;
vlc_mutex_lock( &p_owner->lock );
- if( p_owner->b_buffering || p_owner->buffer.p_block )
+ if( p_owner->b_buffering )
{
- 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->buffer.b_full = 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
decoder_owner_sys_t *p_owner = p_dec->p_owner;
vlc_assert_locked( &p_owner->lock );
- 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