- msg_Warn( p_dec, "non-dated spu buffer received" );
- subpicture_Delete( p_subpic );
- return;
- }
-
- /* */
- vlc_mutex_lock( &p_owner->lock );
-
- if( p_owner->b_buffering || p_owner->buffer.p_subpic )
- {
- 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 );
- }
- }
-
- for( ;; )
- {
- bool b_has_more = false;
- bool b_reject;
- DecoderWaitUnblock( p_dec, &b_reject );
-
- 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;
-
- 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, b_telx );
-
- vlc_mutex_unlock( &p_owner->lock );
-
- if( p_subpic->i_start <= VLC_TS_INVALID )
- b_reject = true;
-
- DecoderWaitDate( p_dec, &b_reject,
- p_subpic->i_start - SPU_MAX_PREPARE_TIME );
-
- if( !b_reject )
- vout_PutSubpicture( p_vout, p_subpic );
- else
- subpicture_Delete( p_subpic );
-
- if( !b_has_more )
- break;
- vlc_mutex_lock( &p_owner->lock );
- if( !p_owner->buffer.p_subpic )
- {
- vlc_mutex_unlock( &p_owner->lock );
- break;
- }
- }
-}
-
-#ifdef ENABLE_SOUT
-static void DecoderPlaySout( decoder_t *p_dec, block_t *p_sout_block,
- bool b_telx )
-{
- decoder_owner_sys_t *p_owner = p_dec->p_owner;
-
- assert( p_owner->p_clock );
- assert( !p_sout_block->p_next );
-
- vlc_mutex_lock( &p_owner->lock );
-
- if( p_owner->b_buffering || p_owner->buffer.p_block )
- {
- 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 );
- }
- }
-
- for( ;; )
- {
- bool b_has_more = false;
- bool b_reject;
- DecoderWaitUnblock( p_dec, &b_reject );
-
- 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, b_telx );
-
- vlc_mutex_unlock( &p_owner->lock );
-
- 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 );
-
- if( !b_has_more )
- break;
- vlc_mutex_lock( &p_owner->lock );
- if( !p_owner->buffer.p_block )
- {
- vlc_mutex_unlock( &p_owner->lock );
- break;
- }
- }
-}
-#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 )
- {
- aout_buffer_t *p_audio = p_owner->buffer.p_audio;
-
- p_owner->buffer.p_audio = p_audio->p_next;
- p_owner->buffer.i_count--;
-
- aout_BufferFree( 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
- */
-static void DecoderProcessSout( decoder_t *p_dec, block_t *p_block )
-{
- decoder_owner_sys_t *p_owner = (decoder_owner_sys_t *)p_dec->p_owner;
- const bool b_telx = p_dec->fmt_in.i_codec == VLC_CODEC_TELETEXT;
- block_t *p_sout_block;
-
- while( ( p_sout_block =
- p_dec->pf_packetize( p_dec, p_block ? &p_block : NULL ) ) )
- {
- if( !p_owner->p_sout_input )
- {
- es_format_Copy( &p_owner->sout, &p_dec->fmt_out );
-
- p_owner->sout.i_group = p_dec->fmt_in.i_group;
- p_owner->sout.i_id = p_dec->fmt_in.i_id;
- if( p_dec->fmt_in.psz_language )
- {
- free( p_owner->sout.psz_language );
- p_owner->sout.psz_language =
- strdup( p_dec->fmt_in.psz_language );
- }
-
- p_owner->p_sout_input =
- sout_InputNew( p_owner->p_sout,
- &p_owner->sout );
-
- if( p_owner->p_sout_input == NULL )
- {
- msg_Err( p_dec, "cannot create packetizer output (%4.4s)",
- (char *)&p_owner->sout.i_codec );
- p_dec->b_error = true;
-
- while( p_sout_block )
- {
- block_t *p_next = p_sout_block->p_next;
- block_Release( p_sout_block );
- p_sout_block = p_next;
- }
- break;
- }
- }
-
- while( p_sout_block )
- {
- block_t *p_next = p_sout_block->p_next;
-
- p_sout_block->p_next = NULL;
-
- DecoderPlaySout( p_dec, p_sout_block, b_telx );
-
- p_sout_block = p_next;
- }
- }
-}
-#endif
-
-/* This function process a video block
- */
-static void DecoderProcessVideo( decoder_t *p_dec, block_t *p_block, bool b_flush )
-{
- decoder_owner_sys_t *p_owner = (decoder_owner_sys_t *)p_dec->p_owner;
-
- if( p_owner->p_packetizer )
- {
- block_t *p_packetized_block;
- decoder_t *p_packetizer = p_owner->p_packetizer;