mirror of https://git.ffmpeg.org/ffmpeg.git
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>
This commit is contained in:
parent
8c3d31fbee
commit
7ccea3bf09
|
@ -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…
Reference in New Issue