|
|
|
@ -46,6 +46,27 @@ static av_cold int cfhd_init(AVCodecContext *avctx) |
|
|
|
|
|
|
|
|
|
s->avctx = avctx; |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 64; i++) { |
|
|
|
|
int val = i; |
|
|
|
|
|
|
|
|
|
if (val >= 40) { |
|
|
|
|
if (val >= 54) { |
|
|
|
|
val -= 54; |
|
|
|
|
val <<= 2; |
|
|
|
|
val += 54; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
val -= 40; |
|
|
|
|
val <<= 2; |
|
|
|
|
val += 40; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
s->lut[0][i] = val; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 256; i++) |
|
|
|
|
s->lut[1][i] = i + ((768 * i * i * i) / (256 * 256 * 256)); |
|
|
|
|
|
|
|
|
|
return ff_cfhd_init_vlcs(s); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -83,16 +104,10 @@ static void init_frame_defaults(CFHDContext *s) |
|
|
|
|
init_peak_table_defaults(s); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* TODO: merge with VLC tables or use LUT */ |
|
|
|
|
static inline int dequant_and_decompand(int level, int quantisation, int codebook) |
|
|
|
|
static inline int dequant_and_decompand(CFHDContext *s, int level, int quantisation, int codebook) |
|
|
|
|
{ |
|
|
|
|
if (codebook == 0 || codebook == 1) { |
|
|
|
|
int64_t abslevel = abs(level); |
|
|
|
|
if (abslevel < 256) |
|
|
|
|
return (abslevel + ((768 * abslevel * abslevel * abslevel) / (256 * 256 * 256))) * |
|
|
|
|
FFSIGN(level) * quantisation; |
|
|
|
|
else |
|
|
|
|
return level * quantisation; |
|
|
|
|
return s->lut[codebook][abs(level)] * FFSIGN(level) * quantisation; |
|
|
|
|
} else |
|
|
|
|
return level * quantisation; |
|
|
|
|
} |
|
|
|
@ -708,7 +723,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame, |
|
|
|
|
if (count > expected) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
coeff = dequant_and_decompand(level, s->quantisation, 0); |
|
|
|
|
coeff = dequant_and_decompand(s, level, s->quantisation, 0); |
|
|
|
|
for (i = 0; i < run; i++) |
|
|
|
|
*coeff_data++ = coeff; |
|
|
|
|
} |
|
|
|
@ -727,7 +742,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame, |
|
|
|
|
if (count > expected) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
coeff = dequant_and_decompand(level, s->quantisation, s->codebook); |
|
|
|
|
coeff = dequant_and_decompand(s, level, s->quantisation, s->codebook); |
|
|
|
|
for (i = 0; i < run; i++) |
|
|
|
|
*coeff_data++ = coeff; |
|
|
|
|
} |
|
|
|
|