X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fimage.c;h=d4746f92fad666217725e1f3688144a4fc693742;hb=ba75d5221d90168c76fa255eff047ac96724ddd1;hp=3ea118a6982ec961622171a44634e3e77498ed9c;hpb=dfc2996565842dbf644557debc80cb7cc8c2b4f4;p=vlc diff --git a/src/misc/image.c b/src/misc/image.c index 3ea118a698..d4746f92fa 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; } } @@ -247,14 +250,11 @@ static picture_t *ImageReadUrl( image_handler_t *p_image, const char *psz_url, * */ -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 && @@ -316,11 +316,10 @@ 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; } - pf_release = p_pic->pf_release; - p_pic->pf_release = PicRelease; /* Small hack */ + picture_Hold( p_pic ); + 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 ); @@ -391,7 +390,6 @@ static picture_t *ImageConvert( image_handler_t *p_image, picture_t *p_pic, 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 && @@ -448,19 +446,19 @@ static picture_t *ImageConvert( image_handler_t *p_image, picture_t *p_pic, p_image->p_filter->fmt_out.video = *p_fmt_out; } - pf_release = p_pic->pf_release; - p_pic->pf_release = PicRelease; /* Small hack */ + picture_Hold( p_pic ); + 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 */ + 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; @@ -474,9 +472,6 @@ static picture_t *ImageConvert( image_handler_t *p_image, picture_t *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 ) { @@ -499,19 +494,16 @@ static picture_t *ImageFilter( image_handler_t *p_image, picture_t *p_pic, 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; + picture_Hold( p_pic ); - return p_pif; + return p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic ); } /** * Misc functions * */ -static struct +static const struct { vlc_fourcc_t i_codec; const char *psz_ext; @@ -575,59 +567,34 @@ static const char *Fourcc2Ext( vlc_fourcc_t i_codec ) } */ -static void video_release_buffer( picture_t *p_pic ) -{ - if( p_pic ) - { - 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->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; - if( p_pic ) - { - 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; (void)p_pic; + (void)p_dec; + picture_Hold( p_pic ); } static void video_unlink_picture( decoder_t *p_dec, picture_t *p_pic ) { - (void)p_dec; (void)p_pic; + (void)p_dec; + picture_Release( p_pic ); } static decoder_t *CreateDecoder( vlc_object_t *p_this, video_format_t *fmt ) @@ -636,16 +603,13 @@ 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 ); 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; @@ -655,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" @@ -673,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 ); @@ -689,10 +653,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 ); @@ -737,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" @@ -756,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 ); @@ -769,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 = @@ -783,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 ) @@ -800,11 +763,10 @@ 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 ); vlc_object_release( p_filter ); - p_filter = NULL; }