/*****************************************************************************
* Preamble
*****************************************************************************/
-#include <ctype.h>
-#include <errno.h>
+
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include <vlc_common.h>
#include <vlc_codec.h>
#include <vlc_filter.h>
#include <vlc_es.h>
#include <vlc_image.h>
#include <vlc_stream.h>
#include <vlc_charset.h>
+#include <libvlc.h>
static picture_t *ImageRead( image_handler_t *, block_t *,
video_format_t *, video_format_t * );
while( (p_tmp = p_image->p_dec->pf_decode_video( p_image->p_dec, &p_block ))
!= NULL )
{
- if ( p_pic != NULL )
- p_pic->pf_release( p_pic );
+ if( p_pic != NULL )
+ picture_Release( p_pic );
p_pic = p_tmp;
}
if( !p_image->p_filter )
{
- p_pic->pf_release( p_pic );
+ picture_Release( p_pic );
return NULL;
}
}
p_image->p_filter->fmt_out.video = p_image->p_enc->fmt_in.video;
}
- p_pic->i_refcount++; /* pf_video_filter() will call pf_release() */
+ picture_Yield( p_pic );
+
p_tmp_pic =
p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic );
p_image->p_filter->fmt_out.video = *p_fmt_out;
}
- p_pic->i_refcount++; /* pf_video_filter() will call pf_release() */
+ picture_Yield( p_pic );
+
p_pif = p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic );
if( p_fmt_in->i_chroma == p_fmt_out->i_chroma &&
p_fmt_in->i_height == p_fmt_out->i_height )
{
/* Duplicate image */
- p_pif->pf_release( p_pif ); /* XXX: Better fix must be possible */
+ picture_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 );
}
p_image->p_filter->fmt_out.video = *p_fmt;
}
- p_pic->i_refcount++; /* pf_video_filter() will call pf_release() */
+ picture_Yield( p_pic );
+
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->i_refcount > 0 ) return;
-
- free( p_pic->p_data_orig );
- free( p_pic->p_sys );
- free( p_pic );
+ picture_Release( p_pic );
}
static picture_t *video_new_buffer( decoder_t *p_dec )
{
- picture_t *p_pic = malloc( sizeof(picture_t) );
-
- p_dec->fmt_out.video.i_chroma = p_dec->fmt_out.i_codec;
- vout_AllocatePicture( VLC_OBJECT(p_dec), p_pic,
- p_dec->fmt_out.video.i_chroma,
- p_dec->fmt_out.video.i_width,
- p_dec->fmt_out.video.i_height,
- p_dec->fmt_out.video.i_aspect );
-
- if( !p_pic->i_planes )
- {
- free( p_pic );
- 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;
-
- return p_pic;
+ return picture_New( p_dec->fmt_out.video.i_chroma,
+ p_dec->fmt_out.video.i_width,
+ p_dec->fmt_out.video.i_height,
+ p_dec->fmt_out.video.i_aspect );
}
static void video_del_buffer( decoder_t *p_dec, picture_t *p_pic )
{
- (void)p_dec;
- free( p_pic->p_data_orig );
- free( p_pic->p_sys );
- free( p_pic );
+ if( p_pic->i_refcount != 1 )
+ msg_Err( p_dec, "invalid picture reference count" );
+
+ p_pic->i_refcount = 0;
+ picture_Delete( p_pic );
}
static void video_link_picture( decoder_t *p_dec, picture_t *p_pic )
{
(void)p_dec;
- p_pic->i_refcount++;
+ picture_Yield( p_pic );
}
static void video_unlink_picture( decoder_t *p_dec, picture_t *p_pic )
{
- (void)p_dec; (void)p_pic;
- video_release_buffer( p_pic );
+ (void)p_dec;
+ picture_Release( p_pic );
}
static decoder_t *CreateDecoder( vlc_object_t *p_this, video_format_t *fmt )
p_dec = vlc_object_create( p_this, VLC_OBJECT_DECODER );
if( p_dec == NULL )
- {
- msg_Err( p_this, "out of memory" );
return NULL;
- }
p_dec->p_module = NULL;
es_format_Init( &p_dec->fmt_in, VIDEO_ES, fmt->i_chroma );
p_enc = vlc_object_create( p_this, VLC_OBJECT_ENCODER );
if( p_enc == NULL )
- {
- msg_Err( p_this, "out of memory" );
return NULL;
- }
p_enc->p_module = NULL;
es_format_Init( &p_enc->fmt_in, VIDEO_ES, fmt_in->i_chroma );
video_format_t *p_fmt_out,
const char *psz_module )
{
+ static const char typename[] = "filter";
filter_t *p_filter;
- p_filter = vlc_object_create( p_this, VLC_OBJECT_FILTER );
+ p_filter = vlc_custom_create( p_this, sizeof(filter_t),
+ VLC_OBJECT_GENERIC, typename );
vlc_object_attach( p_filter, p_this );
p_filter->pf_vout_buffer_new =
es_format_Clean( &p_filter->fmt_out );
vlc_object_release( p_filter );
- p_filter = NULL;
}