X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fimage.c;h=4e5328473a55c62c77e4c31492b97fcf21ef1f7e;hb=5dbc70c99be39d53beb4d4548fd5767eddd17cf1;hp=b286ef97aa0073dcc3a420636f665f9c7f3d7c4a;hpb=e110b99aac4bc342fb927d9c83197f59a4f867f1;p=vlc diff --git a/src/misc/image.c b/src/misc/image.c index b286ef97aa..4e5328473a 100644 --- a/src/misc/image.c +++ b/src/misc/image.c @@ -29,19 +29,22 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include + #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include +#include +#include + +#include #include #include #include #include #include #include +#include static picture_t *ImageRead( image_handler_t *, block_t *, video_format_t *, video_format_t * ); @@ -136,8 +139,8 @@ static picture_t *ImageRead( image_handler_t *p_image, block_t *p_block, 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; } @@ -185,7 +188,7 @@ static picture_t *ImageRead( image_handler_t *p_image, block_t *p_block, if( !p_image->p_filter ) { - p_pic->pf_release( p_pic ); + picture_Release( p_pic ); return NULL; } } @@ -313,7 +316,8 @@ static block_t *ImageWrite( image_handler_t *p_image, picture_t *p_pic, 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 ); @@ -442,7 +446,8 @@ static picture_t *ImageConvert( image_handler_t *p_image, picture_t *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 && @@ -450,7 +455,7 @@ static picture_t *ImageConvert( image_handler_t *p_image, picture_t *p_pic, 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 ); } @@ -488,7 +493,8 @@ static picture_t *ImageFilter( image_handler_t *p_image, picture_t *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 ); } @@ -562,56 +568,36 @@ static const char *Fourcc2Ext( vlc_fourcc_t i_codec ) 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 ) @@ -620,10 +606,7 @@ 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 ); @@ -673,10 +656,7 @@ static encoder_t *CreateEncoder( vlc_object_t *p_this, video_format_t *fmt_in, 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 ); @@ -753,9 +733,11 @@ static filter_t *CreateFilter( vlc_object_t *p_this, es_format_t *p_fmt_in, 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 = @@ -790,5 +772,4 @@ static void DeleteFilter( filter_t * p_filter ) es_format_Clean( &p_filter->fmt_out ); vlc_object_release( p_filter ); - p_filter = NULL; }