/* Allocate our private structure for the decoder */
p_dec->p_owner = p_owner = malloc( sizeof( decoder_owner_sys_t ) );
if( p_dec->p_owner == NULL )
+ {
+ vlc_object_release( p_dec );
return NULL;
+ }
p_dec->p_owner->b_own_thread = true;
p_dec->p_owner->i_preroll_end = -1;
p_dec->p_owner->p_input = p_input;
/* decoder fifo */
if( ( p_dec->p_owner->p_fifo = block_FifoNew() ) == NULL )
+ {
+ free( p_dec->p_owner );
+ vlc_object_release( p_dec );
return NULL;
+ }
/* Set buffers allocation callbacks for the decoders */
p_dec->pf_aout_buffer_new = aout_new_buffer;
while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, &p_block )) )
{
+ if( p_dec->b_die )
+ {
+ /* It prevent freezing VLC in case of broken decoder */
+ if( p_block )
+ block_Release( p_block );
+ break;
+ }
vlc_mutex_lock( &p_input->p->counters.counters_lock );
stats_UpdateInteger( p_dec, p_input->p->counters.p_decoded_audio, 1, NULL );
vlc_mutex_unlock( &p_input->p->counters.counters_lock );
while( (p_pic = p_dec->pf_decode_video( p_dec, &p_block )) )
{
+ if( p_dec->b_die )
+ {
+ /* It prevent freezing VLC in case of broken decoder */
+ if( p_block )
+ block_Release( p_block );
+ break;
+ }
+
vlc_mutex_lock( &p_input->p->counters.counters_lock );
stats_UpdateInteger( p_dec, p_input->p->counters.p_decoded_video, 1, NULL );
vlc_mutex_unlock( &p_input->p->counters.counters_lock );