From: Laurent Aimar Date: Wed, 3 Mar 2010 21:10:34 +0000 (+0100) Subject: Fixed picture leaks when unlinking a non displayed picture. X-Git-Tag: 1.1.0-pre1~541 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=a1b58a771b1bdfcca56d24541b43ce5bf6caf8b7;p=vlc Fixed picture leaks when unlinking a non displayed picture. --- diff --git a/src/input/decoder.c b/src/input/decoder.c index 1aad25e3a9..2dc6404a35 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -1342,6 +1342,7 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture, vout_DropPicture( p_vout, p_picture ); return; } + vout_LinkPicture( p_vout, p_picture ); /* */ vlc_mutex_lock( &p_owner->lock ); @@ -1421,6 +1422,7 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture, p_owner->i_last_rate = i_rate; } vout_DisplayPicture( p_vout, p_picture ); + vout_UnlinkPicture( p_vout, p_picture ); } else { @@ -1430,6 +1432,7 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture, msg_Warn( p_vout, "non-dated video buffer received" ); *pi_lost_sum += 1; + vout_UnlinkPicture( p_vout, p_picture ); vout_DropPicture( p_vout, p_picture ); } int i_tmp_display; @@ -1683,7 +1686,10 @@ static void DecoderFlushBuffering( decoder_t *p_dec ) p_owner->buffer.i_count--; if( p_owner->p_vout ) + { + vout_UnlinkPicture( p_owner->p_vout, p_picture ); vout_DropPicture( p_owner->p_vout, p_picture ); + } if( !p_owner->buffer.p_picture ) p_owner->buffer.pp_picture_next = &p_owner->buffer.p_picture; diff --git a/src/video_output/vout_pictures.c b/src/video_output/vout_pictures.c index 4625917c6e..9327a4b28b 100644 --- a/src/video_output/vout_pictures.c +++ b/src/video_output/vout_pictures.c @@ -311,7 +311,8 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic ) msg_Err( p_vout, "Invalid picture reference count (%p, %d)", p_pic, p_pic->i_refcount ); - if( p_pic->i_refcount == 0 && p_pic->i_status == DISPLAYED_PICTURE ) + if( p_pic->i_refcount == 0 && + ( p_pic->i_status == DISPLAYED_PICTURE || p_pic->i_status == RESERVED_PICTURE ) ) DestroyPicture( p_vout, p_pic ); vlc_mutex_unlock( &p_vout->picture_lock );