X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fxbmdec.c;h=bed68c33ed790d0a41258939ef8eefaa8b57334c;hb=bc70684e74a185d7b80c8b80bdedda659cb581b8;hp=b783d5abe5ee8d827b1489d7864a0df146f53f39;hpb=42c636c9722f64fe6290ea8eee13658d25f5fbe3;p=ffmpeg diff --git a/libavcodec/xbmdec.c b/libavcodec/xbmdec.c index b783d5abe5e..bed68c33ed7 100644 --- a/libavcodec/xbmdec.c +++ b/libavcodec/xbmdec.c @@ -26,15 +26,19 @@ #include "internal.h" #include "mathops.h" -static int convert(uint8_t x) +static int get_nibble(uint8_t x) { - if (x >= 'a') - x -= 87; - else if (x >= 'A') - x -= 55; - else - x -= '0'; - return x; + int ret = 255; + + if (x <= '9') { + if (x >= '0') + ret = x - '0'; + } else if (x >= 'a') { + if (x <= 'f') + ret = x - ('a' - 10); + } else if (x >= 'A' && x <= 'F') + ret = x - ('A' - 10); + return ret; } static int parse_str_int(const uint8_t *p, const uint8_t *end, const uint8_t *key) @@ -94,22 +98,26 @@ static int xbm_decode_frame(AVCodecContext *avctx, void *data, for (i = 0; i < avctx->height; i++) { dst = p->data[0] + i * p->linesize[0]; for (j = 0; j < linesize; j++) { - uint8_t val; + uint8_t nib, val; while (ptr < end && *ptr != 'x' && *ptr != '$') ptr++; ptr ++; - if (ptr < end && av_isxdigit(*ptr)) { - val = convert(*ptr++); - if (av_isxdigit(*ptr)) - val = (val << 4) + convert(*ptr++); + if (ptr < end && (val = get_nibble(*ptr)) <= 15) { + ptr++; + if ((nib = get_nibble(*ptr)) <= 15) { + val = (val << 4) + nib; + ptr++; + } *dst++ = ff_reverse[val]; - if (av_isxdigit(*ptr) && j+1 < linesize) { + if ((val = get_nibble(*ptr)) <= 15 && j+1 < linesize) { j++; - val = convert(*ptr++); - if (av_isxdigit(*ptr)) - val = (val << 4) + convert(*ptr++); + ptr++; + if ((nib = get_nibble(*ptr)) <= 15) { + val = (val << 4) + nib; + ptr++; + } *dst++ = ff_reverse[val]; } } else { @@ -128,7 +136,7 @@ static int xbm_decode_frame(AVCodecContext *avctx, void *data, return avpkt->size; } -AVCodec ff_xbm_decoder = { +const AVCodec ff_xbm_decoder = { .name = "xbm", .long_name = NULL_IF_CONFIG_SMALL("XBM (X BitMap) image"), .type = AVMEDIA_TYPE_VIDEO,