From 42b43513333275afbecfb8b57fac96f59264ab6d Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Fri, 25 May 2018 20:06:34 +0200 Subject: lavf/img2dec: Auto-detect xwd images. --- libavformat/img2dec.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'libavformat/img2dec.c') 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) -- cgit v1.2.3