mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-13 18:55:08 +00:00
binkaudio: store interleaved overlap samples in BinkAudioContext.
This fixes the requirement for the buffer size to be larger than the number of samples actually decoded.
This commit is contained in:
parent
9f48039a37
commit
eaddd29e00
@ -59,7 +59,9 @@ typedef struct {
|
|||||||
float root;
|
float root;
|
||||||
DECLARE_ALIGNED(32, FFTSample, coeffs)[BINK_BLOCK_MAX_SIZE];
|
DECLARE_ALIGNED(32, FFTSample, coeffs)[BINK_BLOCK_MAX_SIZE];
|
||||||
DECLARE_ALIGNED(16, short, previous)[BINK_BLOCK_MAX_SIZE / 16]; ///< coeffs from previous audio block
|
DECLARE_ALIGNED(16, short, previous)[BINK_BLOCK_MAX_SIZE / 16]; ///< coeffs from previous audio block
|
||||||
|
DECLARE_ALIGNED(16, int16_t, current)[BINK_BLOCK_MAX_SIZE / 16];
|
||||||
float *coeffs_ptr[MAX_CHANNELS]; ///< pointers to the coeffs arrays for float_to_int16_interleave
|
float *coeffs_ptr[MAX_CHANNELS]; ///< pointers to the coeffs arrays for float_to_int16_interleave
|
||||||
|
float *prev_ptr[MAX_CHANNELS]; ///< pointers to the overlap points in the coeffs array
|
||||||
union {
|
union {
|
||||||
RDFTContext rdft;
|
RDFTContext rdft;
|
||||||
DCTContext dct;
|
DCTContext dct;
|
||||||
@ -132,8 +134,10 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
|||||||
s->first = 1;
|
s->first = 1;
|
||||||
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
||||||
|
|
||||||
for (i = 0; i < s->channels; i++)
|
for (i = 0; i < s->channels; i++) {
|
||||||
s->coeffs_ptr[i] = s->coeffs + i * s->frame_len;
|
s->coeffs_ptr[i] = s->coeffs + i * s->frame_len;
|
||||||
|
s->prev_ptr[i] = s->coeffs_ptr[i] + s->frame_len - s->overlap_len;
|
||||||
|
}
|
||||||
|
|
||||||
if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == CODEC_ID_BINKAUDIO_RDFT)
|
if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == CODEC_ID_BINKAUDIO_RDFT)
|
||||||
ff_rdft_init(&s->trans.rdft, frame_len_bits, DFT_C2R);
|
ff_rdft_init(&s->trans.rdft, frame_len_bits, DFT_C2R);
|
||||||
@ -256,8 +260,12 @@ static int decode_block(BinkAudioContext *s, short *out, int use_dct)
|
|||||||
s->trans.rdft.rdft_calc(&s->trans.rdft, coeffs);
|
s->trans.rdft.rdft_calc(&s->trans.rdft, coeffs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s->fmt_conv.float_to_int16_interleave(s->current,
|
||||||
|
(const float **)s->prev_ptr,
|
||||||
|
s->overlap_len, s->channels);
|
||||||
s->fmt_conv.float_to_int16_interleave(out, (const float **)s->coeffs_ptr,
|
s->fmt_conv.float_to_int16_interleave(out, (const float **)s->coeffs_ptr,
|
||||||
s->frame_len, s->channels);
|
s->frame_len - s->overlap_len,
|
||||||
|
s->channels);
|
||||||
|
|
||||||
if (!s->first) {
|
if (!s->first) {
|
||||||
int count = s->overlap_len * s->channels;
|
int count = s->overlap_len * s->channels;
|
||||||
@ -267,8 +275,8 @@ static int decode_block(BinkAudioContext *s, short *out, int use_dct)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(s->previous, out + s->block_size,
|
memcpy(s->previous, s->current,
|
||||||
s->overlap_len * s->channels * sizeof(*out));
|
s->overlap_len * s->channels * sizeof(*s->previous));
|
||||||
|
|
||||||
s->first = 0;
|
s->first = 0;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user