On Sun, 10 Jun 2012 17:50:12 -0400, Justin Ruggles <[email protected]> 
wrote:
> simplifies allocation
> ---
> Fixed a memleak in the previous patch.
> 
>  libavfilter/af_amix.c |   77 
> +++++++++++++++++++++++--------------------------
>  1 files changed, 36 insertions(+), 41 deletions(-)
> 
> diff --git a/libavfilter/af_amix.c b/libavfilter/af_amix.c
> index 7e26400..d249af1 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);
>              }
>          }
>      }
> @@ -329,9 +327,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)
> @@ -351,13 +349,13 @@ static int request_samples(AVFilterContext *ctx, int 
> min_samples)
>  
>      for (i = 1; i < s->nb_inputs; i++) {
>          ret = 0;
> -        if (s->input_state[i] == INPUT_OFF)
> +        if (s->inputs[i].state == INPUT_OFF)
>              continue;
> -        while (!ret && av_audio_fifo_size(s->fifos[i]) < min_samples)
> +        while (!ret && av_audio_fifo_size(s->inputs[i].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(s->inputs[i].fifo) == 0) {
> +                s->inputs[i].state = INPUT_OFF;
>                  continue;
>              }
>          } else if (ret)
> @@ -377,11 +375,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;
> @@ -398,7 +396,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;
> @@ -417,7 +415,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
> @@ -473,7 +471,7 @@ static void filter_samples(AVFilterLink *inlink, 
> AVFilterBufferRef *buf)
>          frame_list_add_frame(s->frame_list, buf->audio->nb_samples, pts);
>      }
>  
> -    av_audio_fifo_write(s->fifos[i], (void **)buf->extended_data,
> +    av_audio_fifo_write(s->inputs[i].fifo, (void **)buf->extended_data,
>                          buf->audio->nb_samples);
>  
>      avfilter_unref_buffer(buf);
> @@ -515,15 +513,12 @@ static void uninit(AVFilterContext *ctx)
>      int i;
>      MixContext *s = ctx->priv;
>  
> -    if (s->fifos) {
> -        for (i = 0; i < s->nb_inputs; i++)
> -            av_audio_fifo_free(s->fifos[i]);
> -        av_freep(&s->fifos);
> -    }
> +    for (i = 0; i < s->nb_inputs; i++)
> +        av_audio_fifo_free(s->inputs[i].fifo);

If init fails without allocating inputs, uninit will still be called i
think.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to