From f3e7b79981501b560b7b1e20c3a5354aa0b53680 Mon Sep 17 00:00:00 2001 From: Francois Cartegnie Date: Mon, 19 Nov 2018 13:21:13 +0100 Subject: [PATCH] vlc_image: add extradata as codec parameter some pics are now based on h264/hevc/av1 and require extradata for the decoder. --- include/vlc_image.h | 6 ++++-- src/misc/image.c | 26 ++++++++++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/include/vlc_image.h b/include/vlc_image.h index 2b308fd0e5..5e91c6532e 100644 --- a/include/vlc_image.h +++ b/include/vlc_image.h @@ -39,7 +39,8 @@ extern "C" { struct image_handler_t { picture_t * (*pf_read) ( image_handler_t *, block_t *, - const video_format_t *, video_format_t * ); + const video_format_t *, const uint8_t *, size_t, + video_format_t * ); picture_t * (*pf_read_url) ( image_handler_t *, const char *, video_format_t *, video_format_t * ); block_t * (*pf_write) ( image_handler_t *, picture_t *, @@ -64,7 +65,8 @@ VLC_API image_handler_t * image_HandlerCreate( vlc_object_t * ) VLC_USED; #define image_HandlerCreate( a ) image_HandlerCreate( VLC_OBJECT(a) ) VLC_API void image_HandlerDelete( image_handler_t * ); -#define image_Read( a, b, c, d ) a->pf_read( a, b, c, d ) +#define image_Read( a, b, c, d ) a->pf_read( a, b, c, NULL, 0, d ) +#define image_ReadExt( a, b, c, d, e, f ) a->pf_read( a, b, c, d, e, f ) #define image_ReadUrl( a, b, c, d ) a->pf_read_url( a, b, c, d ) #define image_Write( a, b, c, d ) a->pf_write( a, b, c, d ) #define image_WriteUrl( a, b, c, d, e ) a->pf_write_url( a, b, c, d, e ) diff --git a/src/misc/image.c b/src/misc/image.c index beca4e190c..8e9f6fa3a9 100644 --- a/src/misc/image.c +++ b/src/misc/image.c @@ -61,7 +61,8 @@ static inline struct decoder_owner *dec_get_owner( decoder_t *p_dec ) } static picture_t *ImageRead( image_handler_t *, block_t *, - const video_format_t *, video_format_t * ); + const video_format_t *, const uint8_t *, size_t, + video_format_t * ); static picture_t *ImageReadUrl( image_handler_t *, const char *, video_format_t *, video_format_t * ); static block_t *ImageWrite( image_handler_t *, picture_t *, @@ -72,7 +73,8 @@ static int ImageWriteUrl( image_handler_t *, picture_t *, static picture_t *ImageConvert( image_handler_t *, picture_t *, const video_format_t *, video_format_t * ); -static decoder_t *CreateDecoder( image_handler_t *, const video_format_t * ); +static decoder_t *CreateDecoder( image_handler_t *, const video_format_t *, + const uint8_t *, size_t ); static void DeleteDecoder( decoder_t * ); static encoder_t *CreateEncoder( vlc_object_t *, const video_format_t *, const video_format_t * ); @@ -140,6 +142,7 @@ static void ImageQueueVideo( decoder_t *p_dec, picture_t *p_pic ) static picture_t *ImageRead( image_handler_t *p_image, block_t *p_block, const video_format_t *p_fmt_in, + const uint8_t *p_extra, size_t i_extra, video_format_t *p_fmt_out ) { picture_t *p_pic = NULL; @@ -155,7 +158,8 @@ static picture_t *ImageRead( image_handler_t *p_image, block_t *p_block, /* Start a decoder */ if( !p_image->p_dec ) { - p_image->p_dec = CreateDecoder( p_image, p_fmt_in ); + p_image->p_dec = CreateDecoder( p_image, p_fmt_in, + p_extra, i_extra ); if( !p_image->p_dec ) { block_Release(p_block); @@ -317,7 +321,7 @@ static picture_t *ImageReadUrl( image_handler_t *p_image, const char *psz_url, p_fmt_in->i_chroma = image_Ext2Fourcc( psz_url ); } - p_pic = ImageRead( p_image, p_block, p_fmt_in, p_fmt_out ); + p_pic = ImageRead( p_image, p_block, p_fmt_in, NULL, 0, p_fmt_out ); return p_pic; error: @@ -670,7 +674,8 @@ static picture_t *video_new_buffer( decoder_t *p_dec ) return picture_NewFromFormat( &p_dec->fmt_out.video ); } -static decoder_t *CreateDecoder( image_handler_t *p_image, const video_format_t *fmt ) +static decoder_t *CreateDecoder( image_handler_t *p_image, const video_format_t *fmt, + const uint8_t *p_extra, size_t i_extra ) { decoder_t *p_dec; struct decoder_owner *p_owner; @@ -683,6 +688,15 @@ static decoder_t *CreateDecoder( image_handler_t *p_image, const video_format_t p_dec->p_module = NULL; es_format_InitFromVideo( &p_dec->fmt_in, fmt ); + if( i_extra ) + { + p_dec->fmt_in.p_extra = malloc( i_extra ); + if( p_dec->fmt_in.p_extra ) + { + memcpy( p_dec->fmt_in.p_extra, p_extra, i_extra ); + p_dec->fmt_in.i_extra = i_extra; + } + } es_format_Init( &p_dec->fmt_out, VIDEO_ES, 0 ); p_dec->b_frame_drop_allowed = false; @@ -705,7 +719,7 @@ static decoder_t *CreateDecoder( image_handler_t *p_image, const video_format_t (char*)&p_dec->fmt_in.i_codec ); DeleteDecoder( p_dec ); - return NULL; + p_dec = NULL; } return p_dec; -- 2.11.4.GIT