[vlc-devel] [PATCH 1/2] [schroedinger] Fix picture leakage when resetting decoder

David Flynn davidf+nntp at woaf.net
Sun Jul 27 01:15:18 CEST 2008


From: David Flynn <davidf at woaf.net>

Properly return pictures obtained from vout when they won't get
returned via the normal decodeBlock path.
 - Fixes lockup when seeking.
 - Maybe fixes win32 end of file fault.

Signed-off-by: David Flynn <davidf at woaf.net>
---
 modules/codec/schroedinger.c |   23 +++++++++++++++++------
 1 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/modules/codec/schroedinger.c b/modules/codec/schroedinger.c
index 5886988..668f4dc 100644
--- a/modules/codec/schroedinger.c
+++ b/modules/codec/schroedinger.c
@@ -50,6 +50,12 @@ struct picture_pts_t
    mtime_t i_pts;    //pts for this picture
 };
 
+struct picture_free_t
+{
+   picture_t *p_pic;
+   decoder_t *p_dec;
+};
+
 /*****************************************************************************
  * decoder_sys_t : Schroedinger decoder descriptor
  *****************************************************************************/
@@ -245,13 +251,13 @@ static mtime_t GetPicturePTS( decoder_t *p_dec, uint32_t u_pnum )
  *****************************************************************************/
 static void SchroFrameFree( SchroFrame *frame, void *priv)
 {
-    picture_t *p_pic = priv;
+    struct picture_free_t *p_free = priv;
 
-    if( !p_pic )
+    if( !p_free )
         return;
 
-    /* FIXME it is wrong, you should call pf_vout_buffer_del */
-    if( p_pic->pf_release ) p_pic->pf_release( p_pic );
+    p_free->p_dec->pf_vout_buffer_del( p_free->p_dec, p_free->p_pic );
+    free(p_free);
     (void)frame;
 }
 
@@ -263,6 +269,7 @@ static SchroFrame *CreateSchroFrameFromPic( decoder_t *p_dec )
     decoder_sys_t *p_sys = p_dec->p_sys;
     SchroFrame *p_schroframe = schro_frame_new();
     picture_t *p_pic = NULL;
+    struct picture_free_t *p_free;
 
     if( !p_schroframe )
         return NULL;
@@ -284,7 +291,11 @@ static SchroFrame *CreateSchroFrameFromPic( decoder_t *p_dec )
 
     p_schroframe->width = p_sys->p_format->width;
     p_schroframe->height = p_sys->p_format->height;
-    schro_frame_set_free_callback( p_schroframe, SchroFrameFree, p_pic );
+
+    p_free = malloc( sizeof( *p_free ) );
+    p_free->p_pic = p_pic;
+    p_free->p_dec = p_dec;
+    schro_frame_set_free_callback( p_schroframe, SchroFrameFree, p_free );
 
     for( int i=0; i<3; i++ )
     {
@@ -498,7 +509,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
         case SCHRO_DECODER_OK:
             u_pnum = schro_decoder_get_picture_number( p_sys->p_schro );
             p_schroframe = schro_decoder_pull( p_sys->p_schro );
-            p_pic = p_schroframe->priv;
+            p_pic = ((struct picture_free_t*) p_schroframe->priv)->p_pic;
             p_schroframe->priv = NULL;
             schro_frame_unref( p_schroframe );
 
-- 
1.5.4.3





More information about the vlc-devel mailing list