*****************************************************************************/
#include <ctype.h>
#include <errno.h>
-#include <vlc/vlc.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
#include <vlc_codec.h>
#include <vlc_filter.h>
#include <vlc_es.h>
*
*/
-static void PicRelease( picture_t *p_pic ) { (void)p_pic; }
-
static block_t *ImageWrite( image_handler_t *p_image, picture_t *p_pic,
video_format_t *p_fmt_in,
video_format_t *p_fmt_out )
{
block_t *p_block;
- void (*pf_release)( picture_t * );
/* Check if we can reuse the current encoder */
if( p_image->p_enc &&
p_image->p_filter->fmt_out.video = p_image->p_enc->fmt_in.video;
}
- pf_release = p_pic->pf_release;
- p_pic->pf_release = PicRelease; /* Small hack */
+ p_pic->i_refcount++; /* pf_video_filter() will call pf_release() */
p_tmp_pic =
p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic );
- p_pic->pf_release = pf_release;
p_block = p_image->p_enc->pf_encode_video( p_image->p_enc, p_tmp_pic );
file = utf8_fopen( psz_url, "wb" );
if( !file )
{
- msg_Err( p_image->p_parent, "%s: %s", psz_url, strerror( errno ) );
+ msg_Err( p_image->p_parent, "%s: %m", psz_url );
return VLC_EGENERIC;
}
err = errno;
if( err )
- msg_Err( p_image->p_parent, "%s: %s", psz_url, strerror( err ) );
+ {
+ errno = err;
+ msg_Err( p_image->p_parent, "%s: %m", psz_url );
+ }
return err ? VLC_EGENERIC : VLC_SUCCESS;
}
video_format_t *p_fmt_in,
video_format_t *p_fmt_out )
{
- void (*pf_release)( picture_t * );
picture_t *p_pif;
if( !p_fmt_out->i_width && !p_fmt_out->i_height &&
p_image->p_filter->fmt_out.video = *p_fmt_out;
}
- pf_release = p_pic->pf_release;
- p_pic->pf_release = PicRelease; /* Small hack */
+ p_pic->i_refcount++; /* pf_video_filter() will call pf_release() */
p_pif = p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic );
- p_pic->pf_release = pf_release;
if( p_fmt_in->i_chroma == p_fmt_out->i_chroma &&
p_fmt_in->i_width == p_fmt_out->i_width &&
p_fmt_in->i_height == p_fmt_out->i_height )
{
/* Duplicate image */
+ p_pif->pf_release( p_pif ); /* XXX: Better fix must be possible */
p_pif = p_image->p_filter->pf_vout_buffer_new( p_image->p_filter );
if( p_pif ) vout_CopyPicture( p_image->p_parent, p_pif, p_pic );
}
static picture_t *ImageFilter( image_handler_t *p_image, picture_t *p_pic,
video_format_t *p_fmt, const char *psz_module )
{
- void (*pf_release)( picture_t * );
- picture_t *p_pif;
-
/* Start a filter */
if( !p_image->p_filter )
{
p_image->p_filter->fmt_out.video = *p_fmt;
}
- pf_release = p_pic->pf_release;
- p_pic->pf_release = PicRelease; /* Small hack */
- p_pif = p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic );
- p_pic->pf_release = pf_release;
-
- return p_pif;
+ p_pic->i_refcount++; /* pf_video_filter() will call pf_release() */
+ return p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic );
}
/**
static void video_release_buffer( picture_t *p_pic )
{
- if( p_pic && p_pic->p_data_orig ) free( p_pic->p_data_orig );
- if( p_pic && p_pic->p_sys ) free( p_pic->p_sys );
- if( p_pic ) free( p_pic );
+ if( --p_pic->i_refcount > 0 ) return;
+
+ free( p_pic->p_data_orig );
+ free( p_pic->p_sys );
+ free( p_pic );
}
static picture_t *video_new_buffer( decoder_t *p_dec )
return 0;
}
+ p_pic->i_refcount = 1;
p_pic->pf_release = video_release_buffer;
p_pic->i_status = RESERVED_PICTURE;
p_pic->p_sys = NULL;
static void video_del_buffer( decoder_t *p_dec, picture_t *p_pic )
{
(void)p_dec;
- if( p_pic && p_pic->p_data_orig ) free( p_pic->p_data_orig );
- if( p_pic && p_pic->p_sys ) free( p_pic->p_sys );
- if( p_pic ) free( p_pic );
+ free( p_pic->p_data_orig );
+ free( p_pic->p_sys );
+ free( p_pic );
}
static void video_link_picture( decoder_t *p_dec, picture_t *p_pic )
{
- (void)p_dec; (void)p_pic;
+ (void)p_dec;
+ p_pic->i_refcount++;
}
static void video_unlink_picture( decoder_t *p_dec, picture_t *p_pic )
{
(void)p_dec; (void)p_pic;
+ video_release_buffer( p_pic );
}
static decoder_t *CreateDecoder( vlc_object_t *p_this, video_format_t *fmt )
es_format_Init( &p_dec->fmt_in, VIDEO_ES, fmt->i_chroma );
es_format_Init( &p_dec->fmt_out, VIDEO_ES, 0 );
p_dec->fmt_in.video = *fmt;
- p_dec->b_pace_control = VLC_TRUE;
+ p_dec->b_pace_control = true;
p_dec->pf_vout_buffer_new = video_new_buffer;
p_dec->pf_vout_buffer_del = video_del_buffer;
es_format_Clean( &p_dec->fmt_in );
es_format_Clean( &p_dec->fmt_out );
- vlc_object_destroy( p_dec );
+ vlc_object_release( p_dec );
p_dec = NULL;
}
es_format_Clean( &p_enc->fmt_in );
es_format_Clean( &p_enc->fmt_out );
- vlc_object_destroy( p_enc );
+ vlc_object_release( p_enc );
p_enc = NULL;
}
es_format_Clean( &p_filter->fmt_in );
es_format_Clean( &p_filter->fmt_out );
- vlc_object_destroy( p_filter );
+ vlc_object_release( p_filter );
p_filter = NULL;
}