[vlc-devel] commit: Factorized forced vout picture releases. (Laurent Aimar )
git version control
git at videolan.org
Wed Oct 15 21:30:44 CEST 2008
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Tue Oct 14 22:52:35 2008 +0200| [0e2f21c85dd890e8c07ac6c2bcbb7b68b0ab1f46] | committer: Laurent Aimar
Factorized forced vout picture releases.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0e2f21c85dd890e8c07ac6c2bcbb7b68b0ab1f46
---
src/input/decoder.c | 12 ++----------
src/video_output/video_output.c | 9 +++++----
src/video_output/vout_internal.h | 2 +-
3 files changed, 8 insertions(+), 15 deletions(-)
diff --git a/src/input/decoder.c b/src/input/decoder.c
index f79c67a..03cfa96 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -1818,15 +1818,7 @@ static void DeleteDecoder( decoder_t * p_dec )
if( p_owner->p_vout )
{
/* 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++ )
- {
- 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 );
- }
+ vout_FixLeaks( p_owner->p_vout, true );
/* We are about to die. Reattach video output to p_vlc. */
vout_Request( p_dec, p_owner->p_vout, NULL );
@@ -2088,7 +2080,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
DecoderSignalBuffering( p_dec, true );
/* Check the decoder doesn't leak pictures */
- vout_FixLeaks( p_owner->p_vout );
+ vout_FixLeaks( p_owner->p_vout, false );
msleep( VOUT_OUTMEM_SLEEP );
}
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index ae354e7..41e78da 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -628,13 +628,13 @@ void vout_Flush( vout_thread_t *p_vout, mtime_t i_date )
}
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;
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];
@@ -657,7 +657,7 @@ void vout_FixLeaks( vout_thread_t *p_vout )
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 );
return;
@@ -665,7 +665,8 @@ void vout_FixLeaks( vout_thread_t *p_vout )
/* Too many pictures are still referenced, there is probably a bug
* 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 */
for( i_pic = 0; i_pic < p_vout->render.i_pictures; i_pic++ )
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index bba9293..80ff458 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -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
*/
-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.
More information about the vlc-devel
mailing list