mirror of https://git.ffmpeg.org/ffmpeg.git
ac3enc: fix allocation of floating point samples.
sizeof(SampleType) is different for fixed and float encoders.
This commit is contained in:
parent
35bdaf3d42
commit
99477adc31
|
@ -2215,15 +2215,9 @@ static av_cold int allocate_buffers(AVCodecContext *avctx)
|
||||||
AC3EncodeContext *s = avctx->priv_data;
|
AC3EncodeContext *s = avctx->priv_data;
|
||||||
int channels = s->channels + 1; /* includes coupling channel */
|
int channels = s->channels + 1; /* includes coupling channel */
|
||||||
|
|
||||||
FF_ALLOC_OR_GOTO(avctx, s->windowed_samples, AC3_WINDOW_SIZE *
|
if (s->allocate_sample_buffers(s))
|
||||||
sizeof(*s->windowed_samples), alloc_fail);
|
goto alloc_fail;
|
||||||
FF_ALLOC_OR_GOTO(avctx, s->planar_samples, s->channels * sizeof(*s->planar_samples),
|
|
||||||
alloc_fail);
|
|
||||||
for (ch = 0; ch < s->channels; ch++) {
|
|
||||||
FF_ALLOCZ_OR_GOTO(avctx, s->planar_samples[ch],
|
|
||||||
(AC3_FRAME_SIZE+AC3_BLOCK_SIZE) * sizeof(**s->planar_samples),
|
|
||||||
alloc_fail);
|
|
||||||
}
|
|
||||||
FF_ALLOC_OR_GOTO(avctx, s->bap_buffer, AC3_MAX_BLOCKS * channels *
|
FF_ALLOC_OR_GOTO(avctx, s->bap_buffer, AC3_MAX_BLOCKS * channels *
|
||||||
AC3_MAX_COEFS * sizeof(*s->bap_buffer), alloc_fail);
|
AC3_MAX_COEFS * sizeof(*s->bap_buffer), alloc_fail);
|
||||||
FF_ALLOC_OR_GOTO(avctx, s->bap1_buffer, AC3_MAX_BLOCKS * channels *
|
FF_ALLOC_OR_GOTO(avctx, s->bap1_buffer, AC3_MAX_BLOCKS * channels *
|
||||||
|
@ -2323,6 +2317,8 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
|
||||||
AC3EncodeContext *s = avctx->priv_data;
|
AC3EncodeContext *s = avctx->priv_data;
|
||||||
int ret, frame_size_58;
|
int ret, frame_size_58;
|
||||||
|
|
||||||
|
s->avctx = avctx;
|
||||||
|
|
||||||
s->eac3 = avctx->codec_id == CODEC_ID_EAC3;
|
s->eac3 = avctx->codec_id == CODEC_ID_EAC3;
|
||||||
|
|
||||||
avctx->frame_size = AC3_FRAME_SIZE;
|
avctx->frame_size = AC3_FRAME_SIZE;
|
||||||
|
@ -2355,6 +2351,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
|
||||||
s->apply_window = ff_ac3_fixed_apply_window;
|
s->apply_window = ff_ac3_fixed_apply_window;
|
||||||
s->normalize_samples = ff_ac3_fixed_normalize_samples;
|
s->normalize_samples = ff_ac3_fixed_normalize_samples;
|
||||||
s->scale_coefficients = ff_ac3_fixed_scale_coefficients;
|
s->scale_coefficients = ff_ac3_fixed_scale_coefficients;
|
||||||
|
s->allocate_sample_buffers = ff_ac3_fixed_allocate_sample_buffers;
|
||||||
s->deinterleave_input_samples = ff_ac3_fixed_deinterleave_input_samples;
|
s->deinterleave_input_samples = ff_ac3_fixed_deinterleave_input_samples;
|
||||||
s->apply_mdct = ff_ac3_fixed_apply_mdct;
|
s->apply_mdct = ff_ac3_fixed_apply_mdct;
|
||||||
s->apply_channel_coupling = ff_ac3_fixed_apply_channel_coupling;
|
s->apply_channel_coupling = ff_ac3_fixed_apply_channel_coupling;
|
||||||
|
@ -2364,6 +2361,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
|
||||||
s->mdct_init = ff_ac3_float_mdct_init;
|
s->mdct_init = ff_ac3_float_mdct_init;
|
||||||
s->apply_window = ff_ac3_float_apply_window;
|
s->apply_window = ff_ac3_float_apply_window;
|
||||||
s->scale_coefficients = ff_ac3_float_scale_coefficients;
|
s->scale_coefficients = ff_ac3_float_scale_coefficients;
|
||||||
|
s->allocate_sample_buffers = ff_ac3_float_allocate_sample_buffers;
|
||||||
s->deinterleave_input_samples = ff_ac3_float_deinterleave_input_samples;
|
s->deinterleave_input_samples = ff_ac3_float_deinterleave_input_samples;
|
||||||
s->apply_mdct = ff_ac3_float_apply_mdct;
|
s->apply_mdct = ff_ac3_float_apply_mdct;
|
||||||
s->apply_channel_coupling = ff_ac3_float_apply_channel_coupling;
|
s->apply_channel_coupling = ff_ac3_float_apply_channel_coupling;
|
||||||
|
|
|
@ -135,6 +135,7 @@ typedef struct AC3Block {
|
||||||
typedef struct AC3EncodeContext {
|
typedef struct AC3EncodeContext {
|
||||||
AVClass *av_class; ///< AVClass used for AVOption
|
AVClass *av_class; ///< AVClass used for AVOption
|
||||||
AC3EncOptions options; ///< encoding options
|
AC3EncOptions options; ///< encoding options
|
||||||
|
AVCodecContext *avctx; ///< parent AVCodecContext
|
||||||
PutBitContext pb; ///< bitstream writer context
|
PutBitContext pb; ///< bitstream writer context
|
||||||
DSPContext dsp;
|
DSPContext dsp;
|
||||||
AC3DSPContext ac3dsp; ///< AC-3 optimized functions
|
AC3DSPContext ac3dsp; ///< AC-3 optimized functions
|
||||||
|
@ -230,6 +231,7 @@ typedef struct AC3EncodeContext {
|
||||||
void (*scale_coefficients)(struct AC3EncodeContext *s);
|
void (*scale_coefficients)(struct AC3EncodeContext *s);
|
||||||
|
|
||||||
/* fixed vs. float templated function pointers */
|
/* fixed vs. float templated function pointers */
|
||||||
|
int (*allocate_sample_buffers)(struct AC3EncodeContext *s);
|
||||||
void (*deinterleave_input_samples)(struct AC3EncodeContext *s,
|
void (*deinterleave_input_samples)(struct AC3EncodeContext *s,
|
||||||
const SampleType *samples);
|
const SampleType *samples);
|
||||||
void (*apply_mdct)(struct AC3EncodeContext *s);
|
void (*apply_mdct)(struct AC3EncodeContext *s);
|
||||||
|
@ -276,6 +278,9 @@ void ff_ac3_float_scale_coefficients(AC3EncodeContext *s);
|
||||||
|
|
||||||
/* prototypes for functions in ac3enc_template.c */
|
/* prototypes for functions in ac3enc_template.c */
|
||||||
|
|
||||||
|
int ff_ac3_fixed_allocate_sample_buffers(AC3EncodeContext *s);
|
||||||
|
int ff_ac3_float_allocate_sample_buffers(AC3EncodeContext *s);
|
||||||
|
|
||||||
void ff_ac3_fixed_deinterleave_input_samples(AC3EncodeContext *s,
|
void ff_ac3_fixed_deinterleave_input_samples(AC3EncodeContext *s,
|
||||||
const SampleType *samples);
|
const SampleType *samples);
|
||||||
void ff_ac3_float_deinterleave_input_samples(AC3EncodeContext *s,
|
void ff_ac3_float_deinterleave_input_samples(AC3EncodeContext *s,
|
||||||
|
|
|
@ -31,6 +31,26 @@
|
||||||
#include "ac3enc.h"
|
#include "ac3enc.h"
|
||||||
|
|
||||||
|
|
||||||
|
int AC3_NAME(allocate_sample_buffers)(AC3EncodeContext *s)
|
||||||
|
{
|
||||||
|
int ch;
|
||||||
|
|
||||||
|
FF_ALLOC_OR_GOTO(s->avctx, s->windowed_samples, AC3_WINDOW_SIZE *
|
||||||
|
sizeof(*s->windowed_samples), alloc_fail);
|
||||||
|
FF_ALLOC_OR_GOTO(s->avctx, s->planar_samples, s->channels * sizeof(*s->planar_samples),
|
||||||
|
alloc_fail);
|
||||||
|
for (ch = 0; ch < s->channels; ch++) {
|
||||||
|
FF_ALLOCZ_OR_GOTO(s->avctx, s->planar_samples[ch],
|
||||||
|
(AC3_FRAME_SIZE+AC3_BLOCK_SIZE) * sizeof(**s->planar_samples),
|
||||||
|
alloc_fail);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
alloc_fail:
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deinterleave input samples.
|
* Deinterleave input samples.
|
||||||
* Channels are reordered from Libav's default order to AC-3 order.
|
* Channels are reordered from Libav's default order to AC-3 order.
|
||||||
|
|
Loading…
Reference in New Issue