diff options
author | Jose Da Silva <digital@joescat.com> | 2021-01-31 19:51:10 -0800 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2021-02-03 16:03:15 +0100 |
commit | 7ccea3bf0959d4493959f4a22f9674144aef405b (patch) | |
tree | f454f4f208c4decb22c57ada92d0920be39b1a48 | |
parent | 8c3d31fbeee157d6f529402c86371c857026fcff (diff) | |
download | ffmpeg-7ccea3bf0959d4493959f4a22f9674144aef405b.tar.gz |
avcodec/xbmdec: get_nibble() minor speed increase, and binary reduction
Replace av_isxdigit(*ptr) and convert(*ptr) with get_nibble(*ptr) which
returns a valid nibble=={0x00..0x0f} or false==255 for all other values.
This way we only need to work with *ptr once instead of twice.
Removing inline av_isxdigit(x) functions also shrinks executable size.
Signed-off-by: Joe Da Silva <digital@joescat.com>
-rw-r--r-- | libavcodec/xbmdec.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/libavcodec/xbmdec.c b/libavcodec/xbmdec.c index 52615dc7ab..c1fc6cb650 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 <= '9') - x -= '0'; - else if (x >= 'a') - x -= ('a' - 10); - else - x -= ('A' - 10); - 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 { |