diff options
author | Ilya Basin <basinilya@gmail.com> | 2013-12-16 13:08:34 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-12-21 12:22:49 +0100 |
commit | d1b8e01ef1fe53281e91e0e89be626fc759a2524 (patch) | |
tree | e931fd33b83639d92ed458bf850b8c4ccfccccdb | |
parent | 7d1d0b3ecf98d178bc93dd1a4e75614abea1cd67 (diff) | |
download | ffmpeg-d1b8e01ef1fe53281e91e0e89be626fc759a2524.tar.gz |
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: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | doc/examples/muxing.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/doc/examples/muxing.c b/doc/examples/muxing.c index d6e0256e60..4cd3f65455 100644 --- a/doc/examples/muxing.c +++ b/doc/examples/muxing.c @@ -163,6 +163,11 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st) 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 */ if (c->sample_fmt != AV_SAMPLE_FMT_S16) { swr_ctx = swr_alloc(); @@ -184,17 +189,15 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st) fprintf(stderr, "Failed to initialize the resampling context\n"); 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, - max_dst_nb_samples, c->sample_fmt, 0); - if (ret < 0) { - fprintf(stderr, "Could not allocate destination samples\n"); - exit(1); + ret = av_samples_alloc_array_and_samples(&dst_samples_data, &dst_samples_linesize, c->channels, + max_dst_nb_samples, c->sample_fmt, 0); + if (ret < 0) { + fprintf(stderr, "Could not allocate destination samples\n"); + exit(1); + } + } else { + dst_samples_data = src_samples_data; } dst_samples_size = av_samples_get_buffer_size(NULL, c->channels, max_dst_nb_samples, c->sample_fmt, 0); @@ -254,7 +257,6 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st) exit(1); } } else { - dst_samples_data[0] = src_samples_data[0]; dst_nb_samples = src_nb_samples; } @@ -287,8 +289,12 @@ freeframe: static void close_audio(AVFormatContext *oc, AVStream *st) { avcodec_close(st->codec); + if (dst_samples_data != src_samples_data) { + av_free(dst_samples_data[0]); + av_free(dst_samples_data); + } av_free(src_samples_data[0]); - av_free(dst_samples_data[0]); + av_free(src_samples_data); } /**************************************************************/ |