X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fimage.c;h=02db3cbdf7c9f6040b80eff71da02174aa65b762;hb=8b0dd8cfdff0d9697fb44e7849764c9274965adb;hp=3f55ef687996b5c75c1591349537c46aecdad9e8;hpb=e7c2da6c16ccd419f8632e521e600e8e68e00ddc;p=vlc diff --git a/src/misc/image.c b/src/misc/image.c index 3f55ef6879..02db3cbdf7 100644 --- a/src/misc/image.c +++ b/src/misc/image.c @@ -59,8 +59,6 @@ static int ImageWriteUrl( image_handler_t *, picture_t *, static picture_t *ImageConvert( image_handler_t *, picture_t *, video_format_t *, video_format_t * ); -static picture_t *ImageFilter( image_handler_t *, picture_t *, - video_format_t *, const char *psz_module ); static decoder_t *CreateDecoder( vlc_object_t *, video_format_t * ); static void DeleteDecoder( decoder_t * ); @@ -68,7 +66,7 @@ static encoder_t *CreateEncoder( vlc_object_t *, video_format_t *, video_format_t * ); static void DeleteEncoder( encoder_t * ); static filter_t *CreateFilter( vlc_object_t *, es_format_t *, - video_format_t *, const char * ); + video_format_t * ); static void DeleteFilter( filter_t * ); vlc_fourcc_t image_Type2Fourcc( const char * ); @@ -93,7 +91,6 @@ image_handler_t *image_HandlerCreate( vlc_object_t *p_this ) p_image->pf_write = ImageWrite; p_image->pf_write_url = ImageWriteUrl; p_image->pf_convert = ImageConvert; - p_image->pf_filter = ImageFilter; return p_image; } @@ -174,6 +171,10 @@ static picture_t *ImageRead( image_handler_t *p_image, block_t *p_block, p_fmt_out->i_width = p_image->p_dec->fmt_out.video.i_width; if( !p_fmt_out->i_height ) p_fmt_out->i_height = p_image->p_dec->fmt_out.video.i_height; + if( !p_fmt_out->i_visible_width ) + p_fmt_out->i_visible_width = p_fmt_out->i_width; + if( !p_fmt_out->i_visible_height ) + p_fmt_out->i_visible_height = p_fmt_out->i_height; /* Check if we need chroma conversion or resizing */ if( p_image->p_dec->fmt_out.video.i_chroma != p_fmt_out->i_chroma || @@ -195,7 +196,7 @@ static picture_t *ImageRead( image_handler_t *p_image, block_t *p_block, { p_image->p_filter = CreateFilter( p_image->p_parent, &p_image->p_dec->fmt_out, - p_fmt_out, NULL ); + p_fmt_out ); if( !p_image->p_filter ) { @@ -240,7 +241,7 @@ static picture_t *ImageReadUrl( image_handler_t *p_image, const char *psz_url, i_size = stream_Size( p_stream ); - p_block = block_New( p_image->p_parent, i_size ); + p_block = block_Alloc( i_size ); stream_Read( p_stream, p_block->p_buffer, i_size ); @@ -320,7 +321,7 @@ static block_t *ImageWrite( image_handler_t *p_image, picture_t *p_pic, p_image->p_filter = CreateFilter( p_image->p_parent, &fmt_in, - &p_image->p_enc->fmt_in.video, NULL ); + &p_image->p_enc->fmt_in.video ); if( !p_image->p_filter ) { @@ -345,8 +346,7 @@ static block_t *ImageWrite( image_handler_t *p_image, picture_t *p_pic, { p_block = p_image->p_enc->pf_encode_video( p_image->p_enc, p_tmp_pic ); - p_image->p_filter->pf_video_buffer_del( p_image->p_filter, - p_tmp_pic ); + picture_Release( p_tmp_pic ); } else p_block = NULL; @@ -381,7 +381,7 @@ static int ImageWriteUrl( image_handler_t *p_image, picture_t *p_pic, file = vlc_fopen( psz_url, "wb" ); if( !file ) { - msg_Err( p_image->p_parent, "%s: %m", psz_url ); + msg_Err( p_image->p_parent, "%s: %s", psz_url, vlc_strerror_c(errno) ); return VLC_EGENERIC; } @@ -401,7 +401,7 @@ static int ImageWriteUrl( image_handler_t *p_image, picture_t *p_pic, if( err ) { errno = err; - msg_Err( p_image->p_parent, "%s: %m", psz_url ); + msg_Err( p_image->p_parent, "%s: %s", psz_url, vlc_strerror_c(errno) ); } return err ? VLC_EGENERIC : VLC_SUCCESS; @@ -457,7 +457,7 @@ static picture_t *ImageConvert( image_handler_t *p_image, picture_t *p_pic, fmt_in.video = *p_fmt_in; p_image->p_filter = - CreateFilter( p_image->p_parent, &fmt_in, p_fmt_out, NULL ); + CreateFilter( p_image->p_parent, &fmt_in, p_fmt_out ); if( !p_image->p_filter ) { @@ -481,7 +481,7 @@ static picture_t *ImageConvert( image_handler_t *p_image, picture_t *p_pic, { /* Duplicate image */ picture_Release( p_pif ); /* XXX: Better fix must be possible */ - p_pif = p_image->p_filter->pf_video_buffer_new( p_image->p_filter ); + p_pif = filter_NewPicture( p_image->p_filter ); if( p_pif ) picture_Copy( p_pif, p_pic ); } @@ -489,41 +489,6 @@ static picture_t *ImageConvert( image_handler_t *p_image, picture_t *p_pic, return p_pif; } -/** - * Filter an image with a psz_module filter - * - */ - -static picture_t *ImageFilter( image_handler_t *p_image, picture_t *p_pic, - video_format_t *p_fmt, const char *psz_module ) -{ - /* Start a filter */ - if( !p_image->p_filter ) - { - es_format_t fmt; - es_format_Init( &fmt, VIDEO_ES, p_fmt->i_chroma ); - fmt.video = *p_fmt; - - p_image->p_filter = - CreateFilter( p_image->p_parent, &fmt, &fmt.video, psz_module ); - - if( !p_image->p_filter ) - { - return NULL; - } - } - else - { - /* Filters should handle on-the-fly size changes */ - p_image->p_filter->fmt_in.video = *p_fmt; - p_image->p_filter->fmt_out.video = *p_fmt; - } - - picture_Hold( p_pic ); - - return p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic ); -} - /** * Misc functions * @@ -538,6 +503,7 @@ static const struct { VLC_CODEC_JPEG, "jpeg" }, { VLC_CODEC_JPEG, "jpg" }, { VLC_CODEC_JPEGLS, "ljpg" }, + { VLC_CODEC_BPG, "bpg" }, { VLC_CODEC_PNG, "png" }, { VLC_CODEC_PGM, "pgm" }, { VLC_CODEC_PGMYUV, "pgmyuv" }, @@ -550,6 +516,7 @@ static const struct { VLC_FOURCC('x','c','f',' '), "xcf" }, { VLC_CODEC_PCX, "pcx" }, { VLC_CODEC_GIF, "gif" }, + { VLC_CODEC_SVG, "svg" }, { VLC_CODEC_TIFF, "tif" }, { VLC_CODEC_TIFF, "tiff" }, { VLC_FOURCC('l','b','m',' '), "lbm" }, @@ -601,8 +568,10 @@ static const struct { VLC_CODEC_PNM, "image/x-portable-pixmap" }, { VLC_CODEC_GIF, "image/gif" }, { VLC_CODEC_JPEG, "image/jpeg" }, + { VLC_CODEC_BPG, "image/bpg" }, { VLC_CODEC_PCX, "image/pcx" }, { VLC_CODEC_PNG, "image/png" }, + { VLC_CODEC_SVG, "image/svg+xml" }, { VLC_CODEC_TIFF, "image/tiff" }, { VLC_CODEC_TARGA, "image/x-tga" }, { VLC_FOURCC('x','p','m',' '), "image/x-xpixmap" }, @@ -618,29 +587,15 @@ vlc_fourcc_t image_Mime2Fourcc( const char *psz_mime ) return 0; } - -static picture_t *video_new_buffer( decoder_t *p_dec ) +static int video_update_format( decoder_t *p_dec ) { p_dec->fmt_out.video.i_chroma = p_dec->fmt_out.i_codec; - return picture_NewFromFormat( &p_dec->fmt_out.video ); -} - -static void video_del_buffer( decoder_t *p_dec, picture_t *p_pic ) -{ - (void)p_dec; - picture_Release( p_pic ); -} - -static void video_link_picture( decoder_t *p_dec, picture_t *p_pic ) -{ - (void)p_dec; - picture_Hold( p_pic ); + return 0; } -static void video_unlink_picture( decoder_t *p_dec, picture_t *p_pic ) +static picture_t *video_new_buffer( decoder_t *p_dec ) { - (void)p_dec; - picture_Release( p_pic ); + return picture_NewFromFormat( &p_dec->fmt_out.video ); } static decoder_t *CreateDecoder( vlc_object_t *p_this, video_format_t *fmt ) @@ -657,10 +612,8 @@ static decoder_t *CreateDecoder( vlc_object_t *p_this, video_format_t *fmt ) p_dec->fmt_in.video = *fmt; p_dec->b_pace_control = true; + p_dec->pf_vout_format_update = video_update_format; p_dec->pf_vout_buffer_new = video_new_buffer; - p_dec->pf_vout_buffer_del = video_del_buffer; - p_dec->pf_picture_link = video_link_picture; - p_dec->pf_picture_unlink = video_unlink_picture; /* Find a suitable decoder module */ p_dec->p_module = module_need( p_dec, "decoder", "$codec", false ); @@ -703,34 +656,39 @@ static encoder_t *CreateEncoder( vlc_object_t *p_this, video_format_t *fmt_in, p_enc->p_module = NULL; es_format_Init( &p_enc->fmt_in, VIDEO_ES, fmt_in->i_chroma ); p_enc->fmt_in.video = *fmt_in; - if( fmt_out->i_width > 0 && fmt_out->i_height > 0 ) - { - p_enc->fmt_in.video.i_width = fmt_out->i_width; - p_enc->fmt_in.video.i_height = fmt_out->i_height; - if( fmt_out->i_visible_width > 0 && - fmt_out->i_visible_height > 0 ) + if( p_enc->fmt_in.video.i_visible_width == 0 || + p_enc->fmt_in.video.i_visible_height == 0 ) + { + if( fmt_out->i_width > 0 && fmt_out->i_height > 0 ) { - p_enc->fmt_in.video.i_visible_width = fmt_out->i_visible_width; - p_enc->fmt_in.video.i_visible_height = fmt_out->i_visible_height; + p_enc->fmt_in.video.i_width = fmt_out->i_width; + p_enc->fmt_in.video.i_height = fmt_out->i_height; + + if( fmt_out->i_visible_width > 0 && + fmt_out->i_visible_height > 0 ) + { + p_enc->fmt_in.video.i_visible_width = fmt_out->i_visible_width; + p_enc->fmt_in.video.i_visible_height = fmt_out->i_visible_height; + } + else + { + p_enc->fmt_in.video.i_visible_width = fmt_out->i_width; + p_enc->fmt_in.video.i_visible_height = fmt_out->i_height; + } } - else + else if( fmt_out->i_sar_num && fmt_out->i_sar_den && + fmt_out->i_sar_num * fmt_in->i_sar_den != + fmt_out->i_sar_den * fmt_in->i_sar_num ) { - p_enc->fmt_in.video.i_visible_width = fmt_out->i_width; - p_enc->fmt_in.video.i_visible_height = fmt_out->i_height; + p_enc->fmt_in.video.i_width = + fmt_in->i_sar_num * (int64_t)fmt_out->i_sar_den * fmt_in->i_width / + fmt_in->i_sar_den / fmt_out->i_sar_num; + p_enc->fmt_in.video.i_visible_width = + fmt_in->i_sar_num * (int64_t)fmt_out->i_sar_den * + fmt_in->i_visible_width / fmt_in->i_sar_den / fmt_out->i_sar_num; } } - else if( fmt_out->i_sar_num && fmt_out->i_sar_den && - fmt_out->i_sar_num * fmt_in->i_sar_den != - fmt_out->i_sar_den * fmt_in->i_sar_num ) - { - p_enc->fmt_in.video.i_width = - fmt_in->i_sar_num * (int64_t)fmt_out->i_sar_den * fmt_in->i_width / - fmt_in->i_sar_den / fmt_out->i_sar_num; - p_enc->fmt_in.video.i_visible_width = - fmt_in->i_sar_num * (int64_t)fmt_out->i_sar_den * - fmt_in->i_visible_width / fmt_in->i_sar_den / fmt_out->i_sar_num; - } p_enc->fmt_in.video.i_frame_rate = 25; p_enc->fmt_in.video.i_frame_rate_base = 1; @@ -768,23 +726,19 @@ static void DeleteEncoder( encoder_t * p_enc ) } 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 ) + video_format_t *p_fmt_out ) { filter_t *p_filter; p_filter = vlc_custom_create( p_this, sizeof(filter_t), "filter" ); - p_filter->pf_video_buffer_new = + p_filter->owner.video.buffer_new = (picture_t *(*)(filter_t *))video_new_buffer; - p_filter->pf_video_buffer_del = - (void (*)(filter_t *, picture_t *))video_del_buffer; p_filter->fmt_in = *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", - psz_module, false ); + p_filter->p_module = module_need( p_filter, "video filter2", NULL, false ); if( !p_filter->p_module ) {