mirror of https://git.ffmpeg.org/ffmpeg.git
avcodec/flacdec: Attempt to auto-detect old buggy flac
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
83356cf6cc
commit
b6fcb2bb6d
|
@ -315,6 +315,33 @@ static int decode_subframe_fixed(FLACContext *s, int32_t *decoded,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void lpc_analyze_remodulate(int32_t *decoded, const int coeffs[32],
|
||||||
|
int order, int qlevel, int len, int bps)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
int ebps = 1 << (bps-1);
|
||||||
|
unsigned sigma = 0;
|
||||||
|
|
||||||
|
for (i = order; i < len; i++)
|
||||||
|
sigma |= decoded[i] + ebps;
|
||||||
|
|
||||||
|
if (sigma < 2*ebps)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = len - 1; i >= order; i--) {
|
||||||
|
int64_t p = 0;
|
||||||
|
for (j = 0; j < order; j++)
|
||||||
|
p += coeffs[j] * (int64_t)decoded[i-order+j];
|
||||||
|
decoded[i] -= p >> qlevel;
|
||||||
|
}
|
||||||
|
for (i = order; i < len; i++, decoded++) {
|
||||||
|
int32_t p = 0;
|
||||||
|
for (j = 0; j < order; j++)
|
||||||
|
p += coeffs[j] * (uint32_t)decoded[j];
|
||||||
|
decoded[j] += p >> qlevel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int decode_subframe_lpc(FLACContext *s, int32_t *decoded, int pred_order,
|
static int decode_subframe_lpc(FLACContext *s, int32_t *decoded, int pred_order,
|
||||||
int bps)
|
int bps)
|
||||||
{
|
{
|
||||||
|
@ -352,6 +379,8 @@ static int decode_subframe_lpc(FLACContext *s, int32_t *decoded, int pred_order,
|
||||||
s->dsp.lpc16(decoded, coeffs, pred_order, qlevel, s->blocksize);
|
s->dsp.lpc16(decoded, coeffs, pred_order, qlevel, s->blocksize);
|
||||||
} else {
|
} else {
|
||||||
s->dsp.lpc32(decoded, coeffs, pred_order, qlevel, s->blocksize);
|
s->dsp.lpc32(decoded, coeffs, pred_order, qlevel, s->blocksize);
|
||||||
|
if (s->flac_stream_info.bps <= 16)
|
||||||
|
lpc_analyze_remodulate(decoded, coeffs, pred_order, qlevel, s->blocksize, bps);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue