simplifies allocation
---
libavfilter/af_amix.c | 76 ++++++++++++++++++++++++-------------------------
1 files changed, 37 insertions(+), 39 deletions(-)
diff --git a/libavfilter/af_amix.c b/libavfilter/af_amix.c
index d79a626..ae16db0 100644
--- a/libavfilter/af_amix.c
+++ b/libavfilter/af_amix.c
@@ -151,6 +151,12 @@ static int frame_list_add_frame(FrameList *frame_list, int
nb_samples, int64_t p
}
+typedef struct MixInput {
+ AVAudioFifo *fifo; /**< audio fifo */
+ uint8_t state; /**< current state */
+ float scale; /**< mixing scale factor */
+} MixInput;
+
typedef struct MixContext {
const AVClass *class; /**< class for AVOptions */
AVFloatDSPContext fdsp;
@@ -163,12 +169,10 @@ typedef struct MixContext {
int nb_channels; /**< number of channels */
int sample_rate; /**< sample rate */
int planar;
- AVAudioFifo **fifos; /**< audio fifo for each input */
- uint8_t *input_state; /**< current state of each input */
- float *input_scale; /**< mixing scale factor for each input */
float scale_norm; /**< normalization factor for all inputs */
int64_t next_pts; /**< calculated pts for next output frame */
FrameList *frame_list; /**< list of frame info for the first input */
+ MixInput *inputs; /**< per-input information and data */
} MixContext;
#define OFFSET(x) offsetof(MixContext, x)
@@ -212,10 +216,10 @@ static void calculate_scales(MixContext *s, int
nb_samples)
}
for (i = 0; i < s->nb_inputs; i++) {
- if (s->input_state[i] == INPUT_ON)
- s->input_scale[i] = 1.0f / s->scale_norm;
+ if (s->inputs[i].state == INPUT_ON)
+ s->inputs[i].scale = 1.0f / s->scale_norm;
else
- s->input_scale[i] = 0.0f;
+ s->inputs[i].scale = 0.0f;
}
}
@@ -235,26 +239,20 @@ static int config_output(AVFilterLink *outlink)
if (!s->frame_list)
return AVERROR(ENOMEM);
- s->fifos = av_mallocz(s->nb_inputs * sizeof(*s->fifos));
- if (!s->fifos)
+ s->nb_channels =
av_get_channel_layout_nb_channels(outlink->channel_layout);
+
+ s->inputs = av_mallocz(s->nb_inputs * sizeof(*s->inputs));
+ if (!s->inputs)
return AVERROR(ENOMEM);
- s->nb_channels =
av_get_channel_layout_nb_channels(outlink->channel_layout);
for (i = 0; i < s->nb_inputs; i++) {
- s->fifos[i] = av_audio_fifo_alloc(outlink->format, s->nb_channels,
1024);
- if (!s->fifos[i])
+ s->inputs[i].fifo = av_audio_fifo_alloc(outlink->format,
s->nb_channels, 1024);
+ if (!s->inputs[i].fifo)
return AVERROR(ENOMEM);
- }
- s->input_state = av_malloc(s->nb_inputs);
- if (!s->input_state)
- return AVERROR(ENOMEM);
- memset(s->input_state, INPUT_ON, s->nb_inputs);
+ s->inputs[i].state = INPUT_ON;
+ }
s->active_inputs = s->nb_inputs;
-
- s->input_scale = av_mallocz(s->nb_inputs * sizeof(*s->input_scale));
- if (!s->input_scale)
- return AVERROR(ENOMEM);
s->scale_norm = s->active_inputs;
calculate_scales(s, 0);
@@ -288,10 +286,10 @@ static int output_frame(AVFilterLink *outlink, int
nb_samples)
return AVERROR(ENOMEM);
for (i = 0; i < s->nb_inputs; i++) {
- if (s->input_state[i] == INPUT_ON) {
+ if (s->inputs[i].state == INPUT_ON) {
int planes, plane_size, p;
- av_audio_fifo_read(s->fifos[i], (void **)in_buf->extended_data,
+ av_audio_fifo_read(s->inputs[i].fifo, (void
**)in_buf->extended_data,
nb_samples);
planes = s->planar ? s->nb_channels : 1;
@@ -301,7 +299,7 @@ static int output_frame(AVFilterLink *outlink, int
nb_samples)
for (p = 0; p < planes; p++) {
s->fdsp.vector_fmac_scalar((float *)out_buf->extended_data[p],
(float *) in_buf->extended_data[p],
- s->input_scale[i], plane_size);
+ s->inputs[i].scale, plane_size);
}
}
}
@@ -327,9 +325,9 @@ static int get_available_samples(MixContext *s)
for (i = 1; i < s->nb_inputs; i++) {
int nb_samples;
- if (s->input_state[i] == INPUT_OFF)
+ if (s->inputs[i].state == INPUT_OFF)
continue;
- nb_samples = av_audio_fifo_size(s->fifos[i]);
+ nb_samples = av_audio_fifo_size(s->inputs[i].fifo);
available_samples = FFMIN(available_samples, nb_samples);
}
if (available_samples == INT_MAX)
@@ -348,14 +346,15 @@ static int request_samples(AVFilterContext *ctx, int
min_samples)
av_assert0(s->nb_inputs > 1);
for (i = 1; i < s->nb_inputs; i++) {
+ MixInput *in = &s->inputs[i];
ret = 0;
- if (s->input_state[i] == INPUT_OFF)
+ if (in->state == INPUT_OFF)
continue;
- while (!ret && av_audio_fifo_size(s->fifos[i]) < min_samples)
+ while (!ret && av_audio_fifo_size(in->fifo) < min_samples)
ret = ff_request_frame(ctx->inputs[i]);
if (ret == AVERROR_EOF) {
- if (av_audio_fifo_size(s->fifos[i]) == 0) {
- s->input_state[i] = INPUT_OFF;
+ if (av_audio_fifo_size(in->fifo) == 0) {
+ in->state = INPUT_OFF;
continue;
}
} else if (ret < 0)
@@ -375,11 +374,11 @@ static int calc_active_inputs(MixContext *s)
int i;
int active_inputs = 0;
for (i = 0; i < s->nb_inputs; i++)
- active_inputs += !!(s->input_state[i] != INPUT_OFF);
+ active_inputs += !!(s->inputs[i].state != INPUT_OFF);
s->active_inputs = active_inputs;
if (!active_inputs ||
- (s->duration_mode == DURATION_FIRST && s->input_state[0] == INPUT_OFF)
||
+ (s->duration_mode == DURATION_FIRST && s->inputs[0].state ==
INPUT_OFF) ||
(s->duration_mode == DURATION_SHORTEST && active_inputs !=
s->nb_inputs))
return AVERROR_EOF;
return 0;
@@ -396,7 +395,7 @@ static int request_frame(AVFilterLink *outlink)
if (ret < 0)
return ret;
- if (s->input_state[0] == INPUT_OFF) {
+ if (s->inputs[0].state == INPUT_OFF) {
ret = request_samples(ctx, 1);
if (ret < 0)
return ret;
@@ -415,7 +414,7 @@ static int request_frame(AVFilterLink *outlink)
if (s->frame_list->nb_frames == 0) {
ret = ff_request_frame(ctx->inputs[0]);
if (ret == AVERROR_EOF) {
- s->input_state[0] = INPUT_OFF;
+ s->inputs[0].state = INPUT_OFF;
if (s->nb_inputs == 1)
return AVERROR_EOF;
else
@@ -476,7 +475,7 @@ static int filter_samples(AVFilterLink *inlink,
AVFilterBufferRef *buf)
goto fail;
}
- ret = av_audio_fifo_write(s->fifos[i], (void **)buf->extended_data,
+ ret = av_audio_fifo_write(s->inputs[i].fifo, (void **)buf->extended_data,
buf->audio->nb_samples);
fail:
@@ -521,15 +520,14 @@ static void uninit(AVFilterContext *ctx)
int i;
MixContext *s = ctx->priv;
- if (s->fifos) {
+ if (s->inputs) {
for (i = 0; i < s->nb_inputs; i++)
- av_audio_fifo_free(s->fifos[i]);
- av_freep(&s->fifos);
+ av_audio_fifo_free(s->inputs[i].fifo);
+ av_freep(&s->inputs);
}
+
frame_list_clear(s->frame_list);
av_freep(&s->frame_list);
- av_freep(&s->input_state);
- av_freep(&s->input_scale);
for (i = 0; i < ctx->nb_inputs; i++)
av_freep(&ctx->input_pads[i].name);
--
1.7.1
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel