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