Commit 89fd537f authored by Gildas Bazin's avatar Gildas Bazin

* src/input/input_dec.c, include/vlc_codec.h: added 2 callbacks in the decoder_t structure for pictures linking/unlinking.
* modules/codec/libmpeg2.c: restored pictures linking/unlinking code.
* modules/codec/ffmpeg/video.c: idem and reenabled direct rendering even when the hurry-up mode is activated as it doesn't seem to create a problem anymore with recent ffmpeg.
parent f4d5ed75
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vlc_codec.h: codec related structures * vlc_codec.h: codec related structures
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2003 VideoLAN * 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> * Authors: Gildas Bazin <gbazin@netcourrier.com>
* *
...@@ -70,6 +70,8 @@ struct decoder_t ...@@ -70,6 +70,8 @@ struct decoder_t
/* Video output callbacks */ /* Video output callbacks */
picture_t * ( * pf_vout_buffer_new) ( decoder_t * ); picture_t * ( * pf_vout_buffer_new) ( decoder_t * );
void ( * pf_vout_buffer_del) ( decoder_t *, picture_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 */ /* Private structure for the owner of the decoder */
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* video.c: video decoder using the ffmpeg library * video.c: video decoder using the ffmpeg library
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * 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> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Gildas Bazin <gbazin@netcourrier.com> * Gildas Bazin <gbazin@netcourrier.com>
...@@ -265,7 +265,7 @@ int E_(InitVideoDec)( decoder_t *p_dec, AVCodecContext *p_context, ...@@ -265,7 +265,7 @@ int E_(InitVideoDec)( decoder_t *p_dec, AVCodecContext *p_context,
#endif #endif
/* ffmpeg doesn't properly release old pictures when frames are skipped */ /* 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 ) if( p_sys->b_direct_rendering )
{ {
msg_Dbg( p_dec, "using direct rendering" ); msg_Dbg( p_dec, "using direct rendering" );
...@@ -686,7 +686,7 @@ static int ffmpeg_GetFrameBuf( struct AVCodecContext *p_context, ...@@ -686,7 +686,7 @@ static int ffmpeg_GetFrameBuf( struct AVCodecContext *p_context,
if( p_ff_pic->reference != 0 ) 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 */ /* FIXME what is that, should give good value */
...@@ -716,6 +716,6 @@ static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *p_context, ...@@ -716,6 +716,6 @@ static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *p_context,
if( p_ff_pic->reference != 0 ) if( p_ff_pic->reference != 0 )
{ {
//vout_UnlinkPicture( p_sys->p_vout, p_pic ); p_dec->pf_picture_unlink( p_dec, p_pic );
} }
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* libmpeg2.c: mpeg2 video decoder module making use of libmpeg2. * libmpeg2.c: mpeg2 video decoder module making use of libmpeg2.
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * 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> * Authors: Gildas Bazin <gbazin@netcourrier.com>
* Christophe Massiot <massiot@via.ecp.fr> * Christophe Massiot <massiot@via.ecp.fr>
...@@ -287,7 +287,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -287,7 +287,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
/* For some reason, libmpeg2 will put this pic twice in /* For some reason, libmpeg2 will put this pic twice in
* discard_picture. This can be considered a bug in libmpeg2. */ * 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 ) if( p_sys->p_synchro )
{ {
...@@ -376,6 +376,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -376,6 +376,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
case STATE_END: case STATE_END:
case STATE_SLICE: case STATE_SLICE:
p_pic = NULL;
if( p_sys->p_info->display_fbuf if( p_sys->p_info->display_fbuf
&& p_sys->p_info->display_fbuf->id ) && p_sys->p_info->display_fbuf->id )
{ {
...@@ -396,17 +397,16 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -396,17 +397,16 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
p_sys->p_picture_to_destroy = NULL; p_sys->p_picture_to_destroy = NULL;
p_pic->date = 0; p_pic->date = 0;
} }
return p_pic; /* FIXME */
} }
if( p_sys->p_info->discard_fbuf && if( p_sys->p_info->discard_fbuf &&
p_sys->p_info->discard_fbuf->id ) p_sys->p_info->discard_fbuf->id )
{ {
//p_pic = (picture_t *)p_sys->p_info->discard_fbuf->id; p_dec->pf_picture_unlink( p_dec,
//vout_UnlinkPicture( p_sys->p_vout, p_pic ); p_sys->p_info->discard_fbuf->id );
} }
//return p_pic; /* FIXME */ if( p_pic ) return p_pic;
break; break;
...@@ -512,7 +512,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf ) ...@@ -512,7 +512,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
p_pic->i_nb_fields = p_sys->p_info->current_picture != NULL ? p_pic->i_nb_fields = p_sys->p_info->current_picture != NULL ?
p_sys->p_info->current_picture->nb_fields : 2; 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[0] = p_pic->p[0].p_pixels;
pp_buf[1] = p_pic->p[1].p_pixels; pp_buf[1] = p_pic->p[1].p_pixels;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* input_dec.c: Functions for the management of decoders * input_dec.c: Functions for the management of decoders
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * 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> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* Gildas Bazin <gbazin@netcourrier.com> * Gildas Bazin <gbazin@netcourrier.com>
...@@ -51,6 +51,8 @@ static void aout_del_buffer( decoder_t *, aout_buffer_t * ); ...@@ -51,6 +51,8 @@ static void aout_del_buffer( decoder_t *, aout_buffer_t * );
static picture_t *vout_new_buffer( decoder_t * ); static picture_t *vout_new_buffer( decoder_t * );
static void vout_del_buffer( decoder_t *, picture_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}; static es_format_t null_es_format = {0};
...@@ -436,6 +438,8 @@ static decoder_t * CreateDecoder( input_thread_t * p_input, ...@@ -436,6 +438,8 @@ static decoder_t * CreateDecoder( input_thread_t * p_input,
p_dec->pf_aout_buffer_del = aout_del_buffer; p_dec->pf_aout_buffer_del = aout_del_buffer;
p_dec->pf_vout_buffer_new = vout_new_buffer; p_dec->pf_vout_buffer_new = vout_new_buffer;
p_dec->pf_vout_buffer_del = vout_del_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 ); vlc_object_attach( p_dec, p_input );
...@@ -589,19 +593,17 @@ static void DeleteDecoder( decoder_t * p_dec ) ...@@ -589,19 +593,17 @@ static void DeleteDecoder( decoder_t * p_dec )
{ {
int i_pic; 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 */ /* 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; for( i_pic = 0; i_pic < p_dec->p_owner->p_vout->render.i_pictures;
i_pic++ ) i_pic++ )
{ {
if( p_dec->p_owner->p_vout->render.pp_picture[i_pic]->i_status == if( p_pic->i_status == RESERVED_PICTURE )
RESERVED_PICTURE ) vout_DestroyPicture( p_dec->p_owner->p_vout, p_pic );
vout_DestroyPicture( p_dec->p_owner->p_vout, if( p_pic->i_refcount > 0 )
p_dec->p_owner->p_vout->render.pp_picture[i_pic] ); vout_UnlinkPicture( p_dec->p_owner->p_vout, p_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] );
} }
#undef 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_dec->p_owner->p_vout, 0, 0, 0, 0 ); vout_Request( p_dec, p_dec->p_owner->p_vout, 0, 0, 0, 0 );
...@@ -699,10 +701,39 @@ static picture_t *vout_new_buffer( decoder_t *p_dec ) ...@@ -699,10 +701,39 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
/* Get a new picture */ /* Get a new picture */
while( !(p_pic = vout_CreatePicture( p_sys->p_vout, 0, 0, 0 ) ) ) while( !(p_pic = vout_CreatePicture( p_sys->p_vout, 0, 0, 0 ) ) )
{ {
int i_pic;
if( p_dec->b_die || p_dec->b_error ) if( p_dec->b_die || p_dec->b_error )
{ {
return NULL; 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 ); msleep( VOUT_OUTMEM_SLEEP );
} }
...@@ -713,3 +744,13 @@ static void vout_del_buffer( decoder_t *p_dec, picture_t *p_pic ) ...@@ -713,3 +744,13 @@ static void vout_del_buffer( decoder_t *p_dec, picture_t *p_pic )
{ {
vout_DestroyPicture( p_dec->p_owner->p_vout, p_pic ); 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 );
}
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