avfilter/af_aresample: split flushing code out
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 4 Nov 2014 15:00:07 +0000 (16:00 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 4 Nov 2014 16:17:23 +0000 (17:17 +0100)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavfilter/af_aresample.c

index 8a8b386..7e9eae8 100644 (file)
@@ -223,6 +223,37 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamplesref)
     return ret;
 }
 
+static int flush_frame(AVFilterLink *outlink, int final, AVFrame **outsamplesref_ret)
+{
+    AVFilterContext *ctx = outlink->src;
+    AResampleContext *aresample = ctx->priv;
+    AVFilterLink *const inlink = outlink->src->inputs[0];
+    AVFrame *outsamplesref;
+    int n_out = 4096;
+    int64_t pts;
+
+    outsamplesref = ff_get_audio_buffer(outlink, n_out);
+    *outsamplesref_ret = outsamplesref;
+    if (!outsamplesref)
+        return AVERROR(ENOMEM);
+
+    pts = swr_next_pts(aresample->swr, INT64_MIN);
+    pts = ROUNDED_DIV(pts, inlink->sample_rate);
+
+    n_out = swr_convert(aresample->swr, outsamplesref->extended_data, n_out, final ? NULL : (void*)outsamplesref->extended_data, 0);
+    if (n_out <= 0) {
+        av_frame_free(&outsamplesref);
+        return (n_out == 0) ? AVERROR_EOF : n_out;
+    }
+
+    outsamplesref->sample_rate = outlink->sample_rate;
+    outsamplesref->nb_samples  = n_out;
+
+    outsamplesref->pts = pts;
+
+    return 0;
+}
+
 static int request_frame(AVFilterLink *outlink)
 {
     AVFilterContext *ctx = outlink->src;
@@ -237,26 +268,9 @@ static int request_frame(AVFilterLink *outlink)
 
     if (ret == AVERROR_EOF) {
         AVFrame *outsamplesref;
-        int n_out = 4096;
-        int64_t pts;
-
-        outsamplesref = ff_get_audio_buffer(outlink, n_out);
-        if (!outsamplesref)
-            return AVERROR(ENOMEM);
-
-        pts = swr_next_pts(aresample->swr, INT64_MIN);
-        pts = ROUNDED_DIV(pts, inlink->sample_rate);
-
-        n_out = swr_convert(aresample->swr, outsamplesref->extended_data, n_out, 0, 0);
-        if (n_out <= 0) {
-            av_frame_free(&outsamplesref);
-            return (n_out == 0) ? AVERROR_EOF : n_out;
-        }
-
-        outsamplesref->sample_rate = outlink->sample_rate;
-        outsamplesref->nb_samples  = n_out;
 
-        outsamplesref->pts = pts;
+        if ((ret = flush_frame(outlink, 1, &outsamplesref)) < 0)
+            return ret;
 
         return ff_filter_frame(outlink, outsamplesref);
     }