[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