X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fimage.c;h=826bcc81c85ab84d9a321404ac8cc6461369e749;hb=aeb8ac0199a5924a357414284ef119f868808022;hp=3117ce4bac6f15e12b7d34914e5ca0db815ac69d;hpb=76ab4696aa1dd14a349a7492faf4f93ddb13cbfc;p=vlc diff --git a/src/misc/image.c b/src/misc/image.c index 3117ce4bac..826bcc81c8 100644 --- a/src/misc/image.c +++ b/src/misc/image.c @@ -139,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; } @@ -188,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; } } @@ -316,8 +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; } - if( p_pic->pf_release ) - p_pic->i_refcount++; + picture_Hold( p_pic ); + p_tmp_pic = p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic ); @@ -446,8 +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; } - if( p_pic->pf_release ) - p_pic->i_refcount++; + picture_Hold( 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 && @@ -455,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 ); } @@ -493,8 +493,8 @@ static picture_t *ImageFilter( image_handler_t *p_image, picture_t *p_pic, p_image->p_filter->fmt_out.video = *p_fmt; } - if( p_pic->pf_release ) - p_pic->i_refcount++; + picture_Hold( p_pic ); + return p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic ); } @@ -502,7 +502,7 @@ static picture_t *ImageFilter( image_handler_t *p_image, picture_t *p_pic, * Misc functions * */ -static struct +static const struct { vlc_fourcc_t i_codec; const char *psz_ext; @@ -566,58 +566,34 @@ 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 ); -} - 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_Hold( 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 )