diff --git a/libswresample/swresample.c b/libswresample/swresample.c
index 44a2917ff936d882933e3aa4a4194c62e580b511..5ce377fd6ff4204e20a35658186c687a7c2b6e14 100644
--- a/libswresample/swresample.c
+++ b/libswresample/swresample.c
@@ -435,19 +435,22 @@ int swr_convert(struct SwrContext *s, uint8_t *out_arg[SWR_CH_MAX], int out_coun
 
     if(!in_arg){
         if(s->in_buffer_count){
-            AudioData *a= &s->in_buffer;
-            int i, j, ret;
-            if((ret=realloc_audio(a, s->in_buffer_index + 2*s->in_buffer_count)) < 0)
-                return ret;
-            av_assert0(a->planar);
-            for(i=0; i<a->ch_count; i++){
-                for(j=0; j<s->in_buffer_count; j++){
-                    memcpy(a->ch[i] + (s->in_buffer_index+s->in_buffer_count+j  )*a->bps,
-                           a->ch[i] + (s->in_buffer_index+s->in_buffer_count-j-1)*a->bps, a->bps);
+            if (!s->flushed) {
+                AudioData *a= &s->in_buffer;
+                int i, j, ret;
+                if((ret=realloc_audio(a, s->in_buffer_index + 2*s->in_buffer_count)) < 0)
+                    return ret;
+                av_assert0(a->planar);
+                for(i=0; i<a->ch_count; i++){
+                    for(j=0; j<s->in_buffer_count; j++){
+                        memcpy(a->ch[i] + (s->in_buffer_index+s->in_buffer_count+j  )*a->bps,
+                            a->ch[i] + (s->in_buffer_index+s->in_buffer_count-j-1)*a->bps, a->bps);
+                    }
                 }
+                s->in_buffer_count += (s->in_buffer_count+1)/2;
+                s->resample_in_constraint = 0;
+                s->flushed = 1;
             }
-            s->in_buffer_count += (s->in_buffer_count+1)/2;
-            s->resample_in_constraint = 0;
         }else{
             return 0;
         }
diff --git a/libswresample/swresample_internal.h b/libswresample/swresample_internal.h
index e3c0b3dd3897f38a7eed83f08a6b4d852751ab80..dc7304ce11db2d095e1f32680f81fea059ebe3a0 100644
--- a/libswresample/swresample_internal.h
+++ b/libswresample/swresample_internal.h
@@ -64,6 +64,7 @@ struct SwrContext {
     int in_buffer_index;                            ///< cached buffer position
     int in_buffer_count;                            ///< cached buffer length
     int resample_in_constraint;                     ///< 1 if the input end was reach before the output end, 0 otherwise
+    int flushed;                                    ///< 1 if data is to be flushed and no further input is expected
 
     struct AudioConvert *in_convert;                ///< input conversion context
     struct AudioConvert *out_convert;               ///< output conversion context