mirror of https://git.ffmpeg.org/ffmpeg.git
avcodec/cfhd: use LUT for 9 and 18 codebook decompanding
Also fix codebook 9 decompanding, fixing artifact with codebook 9 samples. Reused Gagandeep Singh patch.
This commit is contained in:
parent
b4ae780693
commit
05e58ce4e2
|
@ -46,6 +46,27 @@ static av_cold int cfhd_init(AVCodecContext *avctx)
|
||||||
|
|
||||||
s->avctx = 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);
|
return ff_cfhd_init_vlcs(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,16 +104,10 @@ static void init_frame_defaults(CFHDContext *s)
|
||||||
init_peak_table_defaults(s);
|
init_peak_table_defaults(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: merge with VLC tables or use LUT */
|
static inline int dequant_and_decompand(CFHDContext *s, int level, int quantisation, int codebook)
|
||||||
static inline int dequant_and_decompand(int level, int quantisation, int codebook)
|
|
||||||
{
|
{
|
||||||
if (codebook == 0 || codebook == 1) {
|
if (codebook == 0 || codebook == 1) {
|
||||||
int64_t abslevel = abs(level);
|
return s->lut[codebook][abs(level)] * FFSIGN(level) * quantisation;
|
||||||
if (abslevel < 256)
|
|
||||||
return (abslevel + ((768 * abslevel * abslevel * abslevel) / (256 * 256 * 256))) *
|
|
||||||
FFSIGN(level) * quantisation;
|
|
||||||
else
|
|
||||||
return level * quantisation;
|
|
||||||
} else
|
} else
|
||||||
return level * quantisation;
|
return level * quantisation;
|
||||||
}
|
}
|
||||||
|
@ -708,7 +723,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
||||||
if (count > expected)
|
if (count > expected)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
coeff = dequant_and_decompand(level, s->quantisation, 0);
|
coeff = dequant_and_decompand(s, level, s->quantisation, 0);
|
||||||
for (i = 0; i < run; i++)
|
for (i = 0; i < run; i++)
|
||||||
*coeff_data++ = coeff;
|
*coeff_data++ = coeff;
|
||||||
}
|
}
|
||||||
|
@ -727,7 +742,7 @@ static int cfhd_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
||||||
if (count > expected)
|
if (count > expected)
|
||||||
break;
|
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++)
|
for (i = 0; i < run; i++)
|
||||||
*coeff_data++ = coeff;
|
*coeff_data++ = coeff;
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,6 +136,8 @@ typedef struct CFHDContext {
|
||||||
CFHD_RL_VLC_ELEM table_18_rl_vlc[4572];
|
CFHD_RL_VLC_ELEM table_18_rl_vlc[4572];
|
||||||
VLC vlc_18;
|
VLC vlc_18;
|
||||||
|
|
||||||
|
int lut[2][256];
|
||||||
|
|
||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
|
|
||||||
int coded_width;
|
int coded_width;
|
||||||
|
|
Loading…
Reference in New Issue