summaryrefslogtreecommitdiff
path: root/libavfilter/avf_showspectrum.c
diff options
context:
space:
mode:
authorClément Bœsch <ubitux@gmail.com>2012-10-26 18:42:54 +0200
committerClément Bœsch <ubitux@gmail.com>2012-10-27 22:59:05 +0200
commit6078bd80247101db326b40f7e295bbd87b669c18 (patch)
tree61298a5688e7845d493bd2f101833c54c60d4854 /libavfilter/avf_showspectrum.c
parent2ef26b5e73373d0684a3507f74adfbf3a1e22785 (diff)
lavf/showspectrum: fix unaligned rdft data.
Diffstat (limited to 'libavfilter/avf_showspectrum.c')
-rw-r--r--libavfilter/avf_showspectrum.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/libavfilter/avf_showspectrum.c b/libavfilter/avf_showspectrum.c
index 1600265415..21d06e7133 100644
--- a/libavfilter/avf_showspectrum.c
+++ b/libavfilter/avf_showspectrum.c
@@ -132,16 +132,20 @@ static int config_output(AVFilterLink *outlink)
/* (re-)configuration if the video output changed (or first init) */
if (rdft_bits != showspectrum->rdft_bits) {
+ size_t rdft_size;
AVFilterBufferRef *outpicref;
av_rdft_end(showspectrum->rdft);
showspectrum->rdft = av_rdft_init(rdft_bits, DFT_R2C);
showspectrum->rdft_bits = rdft_bits;
- /* RDFT buffers: x2 for each (display) channel buffer */
- showspectrum->rdft_data =
- av_realloc_f(showspectrum->rdft_data, 2 * win_size,
- sizeof(*showspectrum->rdft_data));
+ /* RDFT buffers: x2 for each (display) channel buffer.
+ * Note: we use free and malloc instead of a realloc-like function to
+ * make sure the buffer is aligned in memory for the FFT functions. */
+ av_freep(&showspectrum->rdft_data);
+ if (av_size_mult(sizeof(*showspectrum->rdft_data), 2 * win_size, &rdft_size) < 0)
+ return AVERROR(EINVAL);
+ showspectrum->rdft_data = av_malloc(rdft_size);
if (!showspectrum->rdft_data)
return AVERROR(ENOMEM);
showspectrum->filled = 0;