Commit 0e2f21c8 authored by Laurent Aimar's avatar Laurent Aimar

Factorized forced vout picture releases.

parent acf420db
...@@ -1818,15 +1818,7 @@ static void DeleteDecoder( decoder_t * p_dec ) ...@@ -1818,15 +1818,7 @@ static void DeleteDecoder( decoder_t * p_dec )
if( p_owner->p_vout ) if( p_owner->p_vout )
{ {
/* Hack to make sure all the the pictures are freed by the decoder */ /* Hack to make sure all the the pictures are freed by the decoder */
for( int i_pic = 0; i_pic < p_owner->p_vout->render.i_pictures; i_pic++ ) vout_FixLeaks( p_owner->p_vout, true );
{
picture_t *p_pic = p_owner->p_vout->render.pp_picture[i_pic];
if( p_pic->i_status == RESERVED_PICTURE )
vout_DestroyPicture( p_owner->p_vout, p_pic );
if( p_pic->i_refcount > 0 )
vout_UnlinkPicture( p_owner->p_vout, p_pic );
}
/* We are about to die. Reattach video output to p_vlc. */ /* We are about to die. Reattach video output to p_vlc. */
vout_Request( p_dec, p_owner->p_vout, NULL ); vout_Request( p_dec, p_owner->p_vout, NULL );
...@@ -2088,7 +2080,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec ) ...@@ -2088,7 +2080,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
DecoderSignalBuffering( p_dec, true ); DecoderSignalBuffering( p_dec, true );
/* Check the decoder doesn't leak pictures */ /* Check the decoder doesn't leak pictures */
vout_FixLeaks( p_owner->p_vout ); vout_FixLeaks( p_owner->p_vout, false );
msleep( VOUT_OUTMEM_SLEEP ); msleep( VOUT_OUTMEM_SLEEP );
} }
......
...@@ -628,13 +628,13 @@ void vout_Flush( vout_thread_t *p_vout, mtime_t i_date ) ...@@ -628,13 +628,13 @@ void vout_Flush( vout_thread_t *p_vout, mtime_t i_date )
} }
vlc_mutex_unlock( &p_vout->picture_lock ); vlc_mutex_unlock( &p_vout->picture_lock );
} }
void vout_FixLeaks( vout_thread_t *p_vout ) void vout_FixLeaks( vout_thread_t *p_vout, bool b_forced )
{ {
int i_pic, i_ready_pic; int i_pic, i_ready_pic;
vlc_mutex_lock( &p_vout->picture_lock ); vlc_mutex_lock( &p_vout->picture_lock );
for( i_pic = 0, i_ready_pic = 0; i_pic < p_vout->render.i_pictures; i_pic++ ) for( i_pic = 0, i_ready_pic = 0; i_pic < p_vout->render.i_pictures && !b_forced; i_pic++ )
{ {
const picture_t *p_pic = p_vout->render.pp_picture[i_pic]; const picture_t *p_pic = p_vout->render.pp_picture[i_pic];
...@@ -657,7 +657,7 @@ void vout_FixLeaks( vout_thread_t *p_vout ) ...@@ -657,7 +657,7 @@ void vout_FixLeaks( vout_thread_t *p_vout )
break; break;
} }
} }
if( i_pic < p_vout->render.i_pictures ) if( i_pic < p_vout->render.i_pictures && !b_forced )
{ {
vlc_mutex_unlock( &p_vout->picture_lock ); vlc_mutex_unlock( &p_vout->picture_lock );
return; return;
...@@ -665,7 +665,8 @@ void vout_FixLeaks( vout_thread_t *p_vout ) ...@@ -665,7 +665,8 @@ void vout_FixLeaks( vout_thread_t *p_vout )
/* Too many pictures are still referenced, there is probably a bug /* Too many pictures are still referenced, there is probably a bug
* with the decoder */ * with the decoder */
msg_Err( p_vout, "pictures leaked, resetting the heap" ); if( !b_forced )
msg_Err( p_vout, "pictures leaked, resetting the heap" );
/* Just free all the pictures */ /* Just free all the pictures */
for( i_pic = 0; i_pic < p_vout->render.i_pictures; i_pic++ ) for( i_pic = 0; i_pic < p_vout->render.i_pictures; i_pic++ )
......
...@@ -110,7 +110,7 @@ void vout_Flush( vout_thread_t *p_vout, mtime_t i_date ); ...@@ -110,7 +110,7 @@ void vout_Flush( vout_thread_t *p_vout, mtime_t i_date );
* *
* XXX This function is there to workaround bugs in decoder * XXX This function is there to workaround bugs in decoder
*/ */
void vout_FixLeaks( vout_thread_t *p_vout ); void vout_FixLeaks( vout_thread_t *p_vout, bool b_forced );
/** /**
* This functions will drop a picture retreived by vout_CreatePicture. * This functions will drop a picture retreived by vout_CreatePicture.
......
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