diff --git a/libavformat/Makefile b/libavformat/Makefile index a5585dcc7b..8fb075f06f 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -258,6 +258,7 @@ OBJS-$(CONFIG_IMAGE_SUNRAST_PIPE_DEMUXER) += img2dec.o img2.o OBJS-$(CONFIG_IMAGE_TIFF_PIPE_DEMUXER) += img2dec.o img2.o OBJS-$(CONFIG_IMAGE_WEBP_PIPE_DEMUXER) += img2dec.o img2.o OBJS-$(CONFIG_IMAGE_XPM_PIPE_DEMUXER) += img2dec.o img2.o +OBJS-$(CONFIG_IMAGE_XWD_PIPE_DEMUXER) += img2dec.o img2.o OBJS-$(CONFIG_INGENIENT_DEMUXER) += ingenientdec.o rawdec.o OBJS-$(CONFIG_IPMOVIE_DEMUXER) += ipmovie.o OBJS-$(CONFIG_IRCAM_DEMUXER) += ircamdec.o ircam.o pcm.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index a94364f41d..adcc8d90a7 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -476,6 +476,7 @@ extern AVInputFormat ff_image_sunrast_pipe_demuxer; extern AVInputFormat ff_image_tiff_pipe_demuxer; extern AVInputFormat ff_image_webp_pipe_demuxer; extern AVInputFormat ff_image_xpm_pipe_demuxer; +extern AVInputFormat ff_image_xwd_pipe_demuxer; /* external libraries */ extern AVOutputFormat ff_chromaprint_muxer; diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c index ffbc9a66d8..ff4757e532 100644 --- a/libavformat/img2dec.c +++ b/libavformat/img2dec.c @@ -34,6 +34,7 @@ #include "internal.h" #include "img2.h" #include "libavcodec/mjpeg.h" +#include "libavcodec/xwd.h" #include "subtitles.h" #if HAVE_GLOB @@ -974,6 +975,36 @@ static int xpm_probe(AVProbeData *p) return 0; } +static int xwd_probe(AVProbeData *p) +{ + const uint8_t *b = p->buf; + unsigned width, bpp, bpad, lsize; + + if ( p->buf_size < XWD_HEADER_SIZE + || AV_RB32(b ) < XWD_HEADER_SIZE // header size + || AV_RB32(b + 4) != XWD_VERSION // version + || AV_RB32(b + 8) != XWD_Z_PIXMAP // format + || AV_RB32(b + 12) > 32 || !AV_RB32(b + 12) // depth + || AV_RB32(b + 16) == 0 // width + || AV_RB32(b + 20) == 0 // height + || AV_RB32(b + 28) > 1 // byteorder + || AV_RB32(b + 32) & ~56 || av_popcount(AV_RB32(b + 32)) != 1 // bitmap unit + || AV_RB32(b + 36) > 1 // bitorder + || AV_RB32(b + 40) & ~56 || av_popcount(AV_RB32(b + 40)) != 1 // padding + || AV_RB32(b + 44) > 32 || !AV_RB32(b + 44) // bpp + || AV_RB32(b + 68) > 256) // colours + return 0; + + width = AV_RB32(b + 16); + bpad = AV_RB32(b + 40); + bpp = AV_RB32(b + 44); + lsize = AV_RB32(b + 48); + if (lsize < FFALIGN(width * bpp, bpad) >> 3) + return 0; + + return AVPROBE_SCORE_MAX / 2 + 1; +} + #define IMAGEAUTO_DEMUXER(imgname, codecid)\ static const AVClass imgname ## _class = {\ .class_name = AV_STRINGIFY(imgname) " demuxer",\ @@ -1016,3 +1047,4 @@ IMAGEAUTO_DEMUXER(svg, AV_CODEC_ID_SVG) IMAGEAUTO_DEMUXER(tiff, AV_CODEC_ID_TIFF) IMAGEAUTO_DEMUXER(webp, AV_CODEC_ID_WEBP) IMAGEAUTO_DEMUXER(xpm, AV_CODEC_ID_XPM) +IMAGEAUTO_DEMUXER(xwd, AV_CODEC_ID_XWD) diff --git a/libavformat/version.h b/libavformat/version.h index e3975f50ca..b0507474c1 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,7 +32,7 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 58 -#define LIBAVFORMAT_VERSION_MINOR 16 +#define LIBAVFORMAT_VERSION_MINOR 17 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \