Browse code

avfilter/af_rubberband: flush only if there is something available

Signed-off-by: Paul B Mahol <onemda@gmail.com>

Paul B Mahol authored on 2015/09/30 20:02:03
Showing 1 changed files
... ...
@@ -175,29 +175,31 @@ static int request_frame(AVFilterLink *outlink)
175 175
     ret = ff_request_frame(ctx->inputs[0]);
176 176
 
177 177
     if (ret == AVERROR_EOF && !s->flushed) {
178
-        AVFrame *out = ff_get_audio_buffer(inlink, 1);
179
-        int nb_samples;
178
+        if (rubberband_available(s->rbs) > 0) {
179
+            AVFrame *out = ff_get_audio_buffer(inlink, 1);
180
+            int nb_samples;
180 181
 
181
-        if (!out)
182
-            return AVERROR(ENOMEM);
183
-
184
-        rubberband_process(s->rbs, (const float *const *)out->data, 1, 1);
185
-        av_frame_free(&out);
186
-        s->flushed = 1;
187
-        nb_samples = rubberband_available(s->rbs);
188
-
189
-        if (nb_samples > 0) {
190
-            out = ff_get_audio_buffer(inlink, nb_samples);
191 182
             if (!out)
192 183
                 return AVERROR(ENOMEM);
193
-            out->pts = av_rescale_q(s->nb_samples_out,
194
-                         (AVRational){ 1, outlink->sample_rate },
195
-                         outlink->time_base);
196
-            nb_samples = rubberband_retrieve(s->rbs, (float *const *)out->data, nb_samples);
197
-            out->nb_samples = nb_samples;
198
-            ret = ff_filter_frame(outlink, out);
199
-            s->nb_samples_out += nb_samples;
184
+
185
+            rubberband_process(s->rbs, (const float *const *)out->data, 1, 1);
186
+            av_frame_free(&out);
187
+            nb_samples = rubberband_available(s->rbs);
188
+
189
+            if (nb_samples > 0) {
190
+                out = ff_get_audio_buffer(inlink, nb_samples);
191
+                if (!out)
192
+                    return AVERROR(ENOMEM);
193
+                out->pts = av_rescale_q(s->nb_samples_out,
194
+                             (AVRational){ 1, outlink->sample_rate },
195
+                             outlink->time_base);
196
+                nb_samples = rubberband_retrieve(s->rbs, (float *const *)out->data, nb_samples);
197
+                out->nb_samples = nb_samples;
198
+                ret = ff_filter_frame(outlink, out);
199
+                s->nb_samples_out += nb_samples;
200
+            }
200 201
         }
202
+        s->flushed = 1;
201 203
         av_log(ctx, AV_LOG_DEBUG, "nb_samples_in %"PRId64" nb_samples_out %"PRId64"\n",
202 204
                                    s->nb_samples_in, s->nb_samples_out);
203 205
     }