diff options
author | Carl Eugen Hoyos | 2018-05-25 20:06:34 +0200 |
---|---|---|
committer | Carl Eugen Hoyos | 2018-05-25 20:06:34 +0200 |
commit | 42b43513333275afbecfb8b57fac96f59264ab6d (patch) | |
tree | d661761aded4a49dcbac82778465deb33b9737dd /libavformat/img2dec.c | |
parent | 7c333dc6a7fe1dc991f484c70ed7990d6ee62724 (diff) |
lavf/img2dec: Auto-detect xwd images.
Diffstat (limited to 'libavformat/img2dec.c')
-rw-r--r-- | libavformat/img2dec.c | 32 |
1 files changed, 32 insertions, 0 deletions
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) |