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