X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fimage.c;h=d4746f92fad666217725e1f3688144a4fc693742;hb=ba75d5221d90168c76fa255eff047ac96724ddd1;hp=5a1a80fce8cc5adefb2fadedbc3e2ca3ded72d35;hpb=f66626b34809a4881a52582ae755586e885270c6;p=vlc diff --git a/src/misc/image.c b/src/misc/image.c index 5a1a80fce8..d4746f92fa 100644 --- a/src/misc/image.c +++ b/src/misc/image.c @@ -44,6 +44,7 @@ #include #include #include +#include static picture_t *ImageRead( image_handler_t *, block_t *, video_format_t *, video_format_t * ); @@ -138,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; } @@ -187,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; } } @@ -315,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_Hold( p_pic ); + p_tmp_pic = p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic ); @@ -444,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_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 && @@ -452,9 +455,10 @@ 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 ); + if( p_pif ) + picture_Copy( p_pif, p_pic ); } return p_pif; @@ -490,7 +494,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_Hold( p_pic ); + return p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic ); } @@ -498,7 +503,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; @@ -562,58 +567,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 ) @@ -638,7 +619,7 @@ static decoder_t *CreateDecoder( vlc_object_t *p_this, video_format_t *fmt ) vlc_object_attach( p_dec, p_this ); /* Find a suitable decoder module */ - p_dec->p_module = module_Need( p_dec, "decoder", "$codec", 0 ); + p_dec->p_module = module_need( p_dec, "decoder", "$codec", 0 ); if( !p_dec->p_module ) { msg_Err( p_dec, "no suitable decoder module for fourcc `%4.4s'.\n" @@ -656,7 +637,7 @@ static void DeleteDecoder( decoder_t * p_dec ) { vlc_object_detach( p_dec ); - if( p_dec->p_module ) module_Unneed( p_dec, p_dec->p_module ); + if( p_dec->p_module ) module_unneed( p_dec, p_dec->p_module ); es_format_Clean( &p_dec->fmt_in ); es_format_Clean( &p_dec->fmt_out ); @@ -717,7 +698,7 @@ static encoder_t *CreateEncoder( vlc_object_t *p_this, video_format_t *fmt_in, vlc_object_attach( p_enc, p_this ); /* Find a suitable decoder module */ - p_enc->p_module = module_Need( p_enc, "encoder", 0, 0 ); + p_enc->p_module = module_need( p_enc, "encoder", 0, 0 ); if( !p_enc->p_module ) { msg_Err( p_enc, "no suitable encoder module for fourcc `%4.4s'.\n" @@ -736,7 +717,7 @@ static void DeleteEncoder( encoder_t * p_enc ) { vlc_object_detach( p_enc ); - if( p_enc->p_module ) module_Unneed( p_enc, p_enc->p_module ); + if( p_enc->p_module ) module_unneed( p_enc, p_enc->p_module ); es_format_Clean( &p_enc->fmt_in ); es_format_Clean( &p_enc->fmt_out ); @@ -749,9 +730,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 = @@ -763,7 +746,7 @@ static filter_t *CreateFilter( vlc_object_t *p_this, es_format_t *p_fmt_in, p_filter->fmt_out = *p_fmt_in; p_filter->fmt_out.i_codec = p_fmt_out->i_chroma; p_filter->fmt_out.video = *p_fmt_out; - p_filter->p_module = module_Need( p_filter, "video filter2", + p_filter->p_module = module_need( p_filter, "video filter2", psz_module, 0 ); if( !p_filter->p_module ) @@ -780,7 +763,7 @@ static void DeleteFilter( filter_t * p_filter ) { vlc_object_detach( p_filter ); - if( p_filter->p_module ) module_Unneed( p_filter, p_filter->p_module ); + if( p_filter->p_module ) module_unneed( p_filter, p_filter->p_module ); es_format_Clean( &p_filter->fmt_in ); es_format_Clean( &p_filter->fmt_out );