mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-28 12:32:17 +02:00
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>
This commit is contained in:
parent
7d1d0b3ecf
commit
d1b8e01ef1
@ -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,17 +189,15 @@ 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
|
ret = av_samples_alloc_array_and_samples(&dst_samples_data, &dst_samples_linesize, c->channels,
|
||||||
* ensuring that the output buffer will contain at least all the
|
max_dst_nb_samples, c->sample_fmt, 0);
|
||||||
* converted input samples */
|
if (ret < 0) {
|
||||||
max_dst_nb_samples = src_nb_samples;
|
fprintf(stderr, "Could not allocate destination samples\n");
|
||||||
ret = av_samples_alloc_array_and_samples(&dst_samples_data, &dst_samples_linesize, c->channels,
|
exit(1);
|
||||||
max_dst_nb_samples, c->sample_fmt, 0);
|
}
|
||||||
if (ret < 0) {
|
} else {
|
||||||
fprintf(stderr, "Could not allocate destination samples\n");
|
dst_samples_data = src_samples_data;
|
||||||
exit(1);
|
|
||||||
}
|
}
|
||||||
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)
|
|||||||
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:
|
|||||||
static void close_audio(AVFormatContext *oc, AVStream *st)
|
static void close_audio(AVFormatContext *oc, AVStream *st)
|
||||||
{
|
{
|
||||||
avcodec_close(st->codec);
|
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(src_samples_data[0]);
|
||||||
av_free(dst_samples_data[0]);
|
av_free(src_samples_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user