Commit d1b8e01e authored by Ilya Basin's avatar Ilya Basin Committed by Michael Niedermayer

examples/muxing: fix memleaks in resampler

  - do not allocate resample dst buffer when resample is off
  - free sample buffers in addition to freeing data pointer arrays
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 7d1d0b3e
...@@ -163,6 +163,11 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st) ...@@ -163,6 +163,11 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st)
exit(1); exit(1);
} }
/* compute the number of converted samples: buffering is avoided
* ensuring that the output buffer will contain at least all the
* converted input samples */
max_dst_nb_samples = src_nb_samples;
/* create resampler context */ /* create resampler context */
if (c->sample_fmt != AV_SAMPLE_FMT_S16) { if (c->sample_fmt != AV_SAMPLE_FMT_S16) {
swr_ctx = swr_alloc(); swr_ctx = swr_alloc();
...@@ -184,18 +189,16 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st) ...@@ -184,18 +189,16 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st)
fprintf(stderr, "Failed to initialize the resampling context\n"); fprintf(stderr, "Failed to initialize the resampling context\n");
exit(1); exit(1);
} }
}
/* compute the number of converted samples: buffering is avoided
* ensuring that the output buffer will contain at least all the
* converted input samples */
max_dst_nb_samples = src_nb_samples;
ret = av_samples_alloc_array_and_samples(&dst_samples_data, &dst_samples_linesize, c->channels, ret = av_samples_alloc_array_and_samples(&dst_samples_data, &dst_samples_linesize, c->channels,
max_dst_nb_samples, c->sample_fmt, 0); max_dst_nb_samples, c->sample_fmt, 0);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "Could not allocate destination samples\n"); fprintf(stderr, "Could not allocate destination samples\n");
exit(1); exit(1);
} }
} else {
dst_samples_data = src_samples_data;
}
dst_samples_size = av_samples_get_buffer_size(NULL, c->channels, max_dst_nb_samples, dst_samples_size = av_samples_get_buffer_size(NULL, c->channels, max_dst_nb_samples,
c->sample_fmt, 0); c->sample_fmt, 0);
} }
...@@ -254,7 +257,6 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st) ...@@ -254,7 +257,6 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st)
exit(1); exit(1);
} }
} else { } else {
dst_samples_data[0] = src_samples_data[0];
dst_nb_samples = src_nb_samples; dst_nb_samples = src_nb_samples;
} }
...@@ -287,8 +289,12 @@ freeframe: ...@@ -287,8 +289,12 @@ freeframe:
static void close_audio(AVFormatContext *oc, AVStream *st) static void close_audio(AVFormatContext *oc, AVStream *st)
{ {
avcodec_close(st->codec); avcodec_close(st->codec);
av_free(src_samples_data[0]); if (dst_samples_data != src_samples_data) {
av_free(dst_samples_data[0]); av_free(dst_samples_data[0]);
av_free(dst_samples_data);
}
av_free(src_samples_data[0]);
av_free(src_samples_data);
} }
/**************************************************************/ /**************************************************************/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment