* vlc_codec.h: codec related structures
*****************************************************************************
* Copyright (C) 1999-2003 VideoLAN
- * $Id: vlc_codec.h,v 1.5 2003/11/24 00:39:00 fenrir Exp $
+ * $Id: vlc_codec.h,v 1.6 2003/11/24 23:22:01 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
/* Video output callbacks */
picture_t * ( * pf_vout_buffer_new) ( decoder_t * );
void ( * pf_vout_buffer_del) ( decoder_t *, picture_t * );
+ void ( * pf_picture_link) ( decoder_t *, picture_t * );
+ void ( * pf_picture_unlink) ( decoder_t *, picture_t * );
/* Private structure for the owner of the decoder */
* video.c: video decoder using the ffmpeg library
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: video.c,v 1.52 2003/11/24 00:39:01 fenrir Exp $
+ * $Id: video.c,v 1.53 2003/11/24 23:22:01 gbazin Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Gildas Bazin <gbazin@netcourrier.com>
#endif
/* ffmpeg doesn't properly release old pictures when frames are skipped */
- if( p_sys->b_hurry_up ) p_sys->b_direct_rendering = 0;
+ //if( p_sys->b_hurry_up ) p_sys->b_direct_rendering = 0;
if( p_sys->b_direct_rendering )
{
msg_Dbg( p_dec, "using direct rendering" );
if( p_ff_pic->reference != 0 )
{
- //vout_LinkPicture( p_sys->p_vout, p_pic );
+ p_dec->pf_picture_link( p_dec, p_pic );
}
/* FIXME what is that, should give good value */
if( p_ff_pic->reference != 0 )
{
- //vout_UnlinkPicture( p_sys->p_vout, p_pic );
+ p_dec->pf_picture_unlink( p_dec, p_pic );
}
}
* libmpeg2.c: mpeg2 video decoder module making use of libmpeg2.
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: libmpeg2.c,v 1.34 2003/11/22 23:39:14 fenrir Exp $
+ * $Id: libmpeg2.c,v 1.35 2003/11/24 23:22:01 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
* Christophe Massiot <massiot@via.ecp.fr>
/* For some reason, libmpeg2 will put this pic twice in
* discard_picture. This can be considered a bug in libmpeg2. */
- //vout_LinkPicture( p_sys->p_vout, p_pic );
+ p_dec->pf_picture_link( p_dec, p_pic );
if( p_sys->p_synchro )
{
case STATE_END:
case STATE_SLICE:
+ p_pic = NULL;
if( p_sys->p_info->display_fbuf
&& p_sys->p_info->display_fbuf->id )
{
p_sys->p_picture_to_destroy = NULL;
p_pic->date = 0;
}
- return p_pic; /* FIXME */
}
if( p_sys->p_info->discard_fbuf &&
p_sys->p_info->discard_fbuf->id )
{
- //p_pic = (picture_t *)p_sys->p_info->discard_fbuf->id;
- //vout_UnlinkPicture( p_sys->p_vout, p_pic );
+ p_dec->pf_picture_unlink( p_dec,
+ p_sys->p_info->discard_fbuf->id );
}
- //return p_pic; /* FIXME */
+ if( p_pic ) return p_pic;
break;
p_pic->i_nb_fields = p_sys->p_info->current_picture != NULL ?
p_sys->p_info->current_picture->nb_fields : 2;
- //vout_LinkPicture( p_sys->p_vout, p_pic );
+ p_dec->pf_picture_link( p_dec, p_pic );
pp_buf[0] = p_pic->p[0].p_pixels;
pp_buf[1] = p_pic->p[1].p_pixels;
* input_dec.c: Functions for the management of decoders
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: input_dec.c,v 1.78 2003/11/24 03:30:38 fenrir Exp $
+ * $Id: input_dec.c,v 1.79 2003/11/24 23:22:01 gbazin Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Gildas Bazin <gbazin@netcourrier.com>
static picture_t *vout_new_buffer( decoder_t * );
static void vout_del_buffer( decoder_t *, picture_t * );
+static void vout_link_picture( decoder_t *, picture_t * );
+static void vout_unlink_picture( decoder_t *, picture_t * );
static es_format_t null_es_format = {0};
p_dec->pf_aout_buffer_del = aout_del_buffer;
p_dec->pf_vout_buffer_new = vout_new_buffer;
p_dec->pf_vout_buffer_del = vout_del_buffer;
+ p_dec->pf_picture_link = vout_link_picture;
+ p_dec->pf_picture_unlink = vout_unlink_picture;
vlc_object_attach( p_dec, p_input );
{
int i_pic;
+#define p_pic p_dec->p_owner->p_vout->render.pp_picture[i_pic]
/* Hack to make sure all the the pictures are freed by the decoder */
for( i_pic = 0; i_pic < p_dec->p_owner->p_vout->render.i_pictures;
i_pic++ )
{
- if( p_dec->p_owner->p_vout->render.pp_picture[i_pic]->i_status ==
- RESERVED_PICTURE )
- vout_DestroyPicture( p_dec->p_owner->p_vout,
- p_dec->p_owner->p_vout->render.pp_picture[i_pic] );
- if( p_dec->p_owner->p_vout->render.pp_picture[i_pic]->i_refcount
- > 0 )
- vout_UnlinkPicture( p_dec->p_owner->p_vout,
- p_dec->p_owner->p_vout->render.pp_picture[i_pic] );
+ if( p_pic->i_status == RESERVED_PICTURE )
+ vout_DestroyPicture( p_dec->p_owner->p_vout, p_pic );
+ if( p_pic->i_refcount > 0 )
+ vout_UnlinkPicture( p_dec->p_owner->p_vout, p_pic );
}
+#undef p_pic
/* We are about to die. Reattach video output to p_vlc. */
vout_Request( p_dec, p_dec->p_owner->p_vout, 0, 0, 0, 0 );
/* Get a new picture */
while( !(p_pic = vout_CreatePicture( p_sys->p_vout, 0, 0, 0 ) ) )
{
+ int i_pic;
+
if( p_dec->b_die || p_dec->b_error )
{
return NULL;
}
+
+#define p_pic p_dec->p_owner->p_vout->render.pp_picture[i_pic]
+ /* Check the decoder doesn't leak pictures */
+ for( i_pic = 0; i_pic < p_dec->p_owner->p_vout->render.i_pictures;
+ i_pic++ )
+ {
+ if( p_pic->i_status != DISPLAYED_PICTURE &&
+ p_pic->i_status != RESERVED_PICTURE ) break;
+
+ if( !p_pic->i_refcount ) break;
+ }
+ if( i_pic == p_dec->p_owner->p_vout->render.i_pictures )
+ {
+ msg_Err( p_dec, "decoder is leaking pictures, reseting the heap" );
+
+ /* Just free all the pictures */
+ for( i_pic = 0; i_pic < p_dec->p_owner->p_vout->render.i_pictures;
+ i_pic++ )
+ {
+ if( p_pic->i_status == RESERVED_PICTURE )
+ vout_DestroyPicture( p_dec->p_owner->p_vout, p_pic );
+ if( p_pic->i_refcount > 0 )
+ vout_UnlinkPicture( p_dec->p_owner->p_vout, p_pic );
+ }
+ }
+#undef p_pic
+
msleep( VOUT_OUTMEM_SLEEP );
}
{
vout_DestroyPicture( p_dec->p_owner->p_vout, p_pic );
}
+
+static void vout_link_picture( decoder_t *p_dec, picture_t *p_pic )
+{
+ vout_LinkPicture( p_dec->p_owner->p_vout, p_pic );
+}
+
+static void vout_unlink_picture( decoder_t *p_dec, picture_t *p_pic )
+{
+ vout_UnlinkPicture( p_dec->p_owner->p_vout, p_pic );
+}