[FFmpeg-devel] [PATCH] lavfi/af_atempo: use av_malloc for rDFT buffers.

Nicolas George nicolas.george at normalesup.org
Tue Aug 28 18:24:12 CEST 2012


Memory obtained from av_realloc is not aligned enough for AVX.
The buffers are always completely filled, data does not need
to be preserved.

Fix trac ticket #1692.

Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
---
 libavfilter/af_atempo.c |   18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
index 7971aef..4c4d376 100644
--- a/libavfilter/af_atempo.c
+++ b/libavfilter/af_atempo.c
@@ -219,6 +219,18 @@ static void yae_release_buffers(ATempoContext *atempo)
         field = new_field;                                      \
     } while (0)
 
+/* av_realloc is not aligned enough; fortunately, the data does not need to
+ * be preserved */
+#define RE_MALLOC_OR_FAIL(field, field_size)                    \
+    do {                                                        \
+        av_freep(&field);                                       \
+        field = av_malloc((field_size));                        \
+        if (!field) {                                           \
+            yae_release_buffers(atempo);                        \
+            return AVERROR(ENOMEM);                             \
+        }                                                       \
+    } while (0)
+
 /**
  * Prepare filter for processing audio data of given format,
  * sample rate and number of channels.
@@ -253,8 +265,8 @@ static int yae_reset(ATempoContext *atempo,
     // initialize audio fragment buffers:
     REALLOC_OR_FAIL(atempo->frag[0].data, atempo->window * atempo->stride);
     REALLOC_OR_FAIL(atempo->frag[1].data, atempo->window * atempo->stride);
-    REALLOC_OR_FAIL(atempo->frag[0].xdat, atempo->window * sizeof(FFTComplex));
-    REALLOC_OR_FAIL(atempo->frag[1].xdat, atempo->window * sizeof(FFTComplex));
+    RE_MALLOC_OR_FAIL(atempo->frag[0].xdat, atempo->window * sizeof(FFTComplex));
+    RE_MALLOC_OR_FAIL(atempo->frag[1].xdat, atempo->window * sizeof(FFTComplex));
 
     // initialize rDFT contexts:
     av_rdft_end(atempo->real_to_complex);
@@ -275,7 +287,7 @@ static int yae_reset(ATempoContext *atempo,
         return AVERROR(ENOMEM);
     }
 
-    REALLOC_OR_FAIL(atempo->correlation, atempo->window * sizeof(FFTComplex));
+    RE_MALLOC_OR_FAIL(atempo->correlation, atempo->window * sizeof(FFTComplex));
 
     atempo->ring = atempo->window * 3;
     REALLOC_OR_FAIL(atempo->buffer, atempo->ring * atempo->stride);
-- 
1.7.10.4



More information about the ffmpeg-devel mailing list