vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Mar 3 10:34:22 2019 +0200| [db8827e5a75a7deea637ca3c3105e2fb0cb105e4] | committer: Rémi Denis-Courmont
demux/image: revector, use ARRAY_SIZE() Move format detection to a separate function to ease writing the loop. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=db8827e5a75a7deea637ca3c3105e2fb0cb105e4 --- modules/demux/image.c | 63 +++++++++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/modules/demux/image.c b/modules/demux/image.c index 049fb399c7..c1e99e11b5 100644 --- a/modules/demux/image.c +++ b/modules/demux/image.c @@ -645,51 +645,56 @@ static const image_format_t formats[] = { { .codec = VLC_CODEC_TARGA, .detect = IsTarga, }, - { .codec = 0 } }; -static int Open(vlc_object_t *object) +static vlc_fourcc_t Detect(stream_t *s) { - demux_t *demux = (demux_t*)object; + const uint8_t *peek; + size_t peek_size = 0; - /* Detect the image type */ - const image_format_t *img; + for (size_t i = 0; i < ARRAY_SIZE(formats); i++) { + const image_format_t *img = &formats[i]; - const uint8_t *peek; - ssize_t peek_size = 0; - for (int i = 0; ; i++) { - img = &formats[i]; - if (!img->codec) - return VLC_EGENERIC; + if (img->detect != NULL) { + if (img->detect(s)) + return img->codec; - if (img->detect) { - if (img->detect(demux->s)) - break; /* detect callbacks can invalidate the current peek buffer */ peek_size = 0; - } else { - if ((size_t) peek_size < img->marker_size) - { - peek_size = vlc_stream_Peek(demux->s, &peek, img->marker_size); - if (peek_size == -1) - return VLC_ENOMEM; - } - if ((size_t) peek_size >= img->marker_size && - !memcmp(peek, img->marker, img->marker_size)) - break; + continue; + } + + if (peek_size < img->marker_size) { + ssize_t val = vlc_stream_Peek(s, &peek, img->marker_size); + if (val < 0) + continue; } + + if (peek_size >= img->marker_size + && memcmp(peek, img->marker, img->marker_size) == 0) + return img->codec; } + return 0; +} + +static int Open(vlc_object_t *object) +{ + demux_t *demux = (demux_t*)object; + + /* Detect the image type */ + vlc_fourcc_t codec = Detect(demux->s); + if (codec == 0) + return VLC_EGENERIC; + msg_Dbg(demux, "Detected image: %s", - vlc_fourcc_GetDescription(VIDEO_ES, img->codec)); + vlc_fourcc_GetDescription(VIDEO_ES, codec)); - if( img->codec == VLC_CODEC_MXPEG ) - { + if (codec == VLC_CODEC_MXPEG) return VLC_EGENERIC; //let avformat demux this file - } /* Load and if selected decode */ es_format_t fmt; - es_format_Init(&fmt, VIDEO_ES, img->codec); + es_format_Init(&fmt, VIDEO_ES, codec); fmt.video.i_chroma = fmt.i_codec; block_t *data = Load(demux); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
