Browse Source

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>
tags/n4.4
Jose Da Silva Paul B Mahol 5 years ago
parent
commit
7ccea3bf09
1 changed files with 25 additions and 17 deletions
  1. +25
    -17
      libavcodec/xbmdec.c

+ 25
- 17
libavcodec/xbmdec.c View File

@@ -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 {


Loading…
Cancel
Save