[FFmpeg-devel] [PATCH] swr/resample: free existing ResampleContext on reinit

James Almer jamrial at gmail.com
Tue Mar 21 03:33:53 EET 2017


Fixes memleak (See opus-testvector12 fate test).

Signed-off-by: James Almer <jamrial at gmail.com>
---
 libswresample/resample.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/libswresample/resample.c b/libswresample/resample.c
index 144b232462..ad6410142b 100644
--- a/libswresample/resample.c
+++ b/libswresample/resample.c
@@ -276,6 +276,13 @@ fail:
     return ret;
 }
 
+static void resample_free(ResampleContext **c){
+    if(!*c)
+        return;
+    av_freep(&(*c)->filter_bank);
+    av_freep(c);
+}
+
 static ResampleContext *resample_init(ResampleContext *c, int out_rate, int in_rate, int filter_size, int phase_shift, int linear,
                                     double cutoff0, enum AVSampleFormat format, enum SwrFilterType filter_type, double kaiser_beta,
                                     double precision, int cheby, int exact_rational)
@@ -302,6 +309,7 @@ static ResampleContext *resample_init(ResampleContext *c, int out_rate, int in_r
     if (!c || c->phase_count != phase_count || c->linear!=linear || c->factor != factor
            || c->filter_length != filter_length || c->format != format
            || c->filter_type != filter_type || c->kaiser_beta != kaiser_beta) {
+        resample_free(&c);
         c = av_mallocz(sizeof(*c));
         if (!c)
             return NULL;
@@ -371,13 +379,6 @@ error:
     return NULL;
 }
 
-static void resample_free(ResampleContext **c){
-    if(!*c)
-        return;
-    av_freep(&(*c)->filter_bank);
-    av_freep(c);
-}
-
 static int rebuild_filter_bank_with_compensation(ResampleContext *c)
 {
     uint8_t *new_filter_bank;
-- 
2.12.0



More information about the ffmpeg-devel mailing list