[FFmpeg-cvslog] avfilter/vsrc_gradients: switch to activate

Paul B Mahol git at videolan.org
Fri Sep 4 20:46:15 EEST 2020


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Fri Sep  4 18:50:57 2020 +0200| [9f5f971efd54b7325b60f48269ecd0cf3456ac04] | committer: Paul B Mahol

avfilter/vsrc_gradients: switch to activate

Allow to set the EOF timestamp.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9f5f971efd54b7325b60f48269ecd0cf3456ac04
---

 libavfilter/vsrc_gradients.c | 53 ++++++++++++++++++++++++++------------------
 1 file changed, 31 insertions(+), 22 deletions(-)

diff --git a/libavfilter/vsrc_gradients.c b/libavfilter/vsrc_gradients.c
index 9de0544f5b..895557396c 100644
--- a/libavfilter/vsrc_gradients.c
+++ b/libavfilter/vsrc_gradients.c
@@ -19,6 +19,7 @@
  */
 
 #include "avfilter.h"
+#include "filters.h"
 #include "formats.h"
 #include "video.h"
 #include "internal.h"
@@ -247,44 +248,51 @@ static int draw_gradients_slice16(AVFilterContext *ctx, void *arg, int job, int
     return 0;
 }
 
-static int gradients_request_frame(AVFilterLink *outlink)
+static int activate(AVFilterContext *ctx)
 {
-    AVFilterContext *ctx = outlink->src;
     GradientsContext *s = ctx->priv;
-    AVFrame *frame = ff_get_video_buffer(outlink, s->w, s->h);
-    float angle = fmodf(s->pts * s->speed, 2.f * M_PI);
-    const float w2 = s->w / 2.f;
-    const float h2 = s->h / 2.f;
+    AVFilterLink *outlink = ctx->outputs[0];
 
     if (s->duration >= 0 &&
-        av_rescale_q(s->pts, outlink->time_base, AV_TIME_BASE_Q) >= s->duration)
-        return AVERROR_EOF;
+        av_rescale_q(s->pts, outlink->time_base, AV_TIME_BASE_Q) >= s->duration) {
+        ff_outlink_set_status(outlink, AVERROR_EOF, s->pts);
+        return 0;
+    }
 
-    s->fx0 = (s->x0 - w2) * cosf(angle) - (s->y0 - h2) * sinf(angle) + w2;
-    s->fy0 = (s->x0 - w2) * sinf(angle) + (s->y0 - h2) * cosf(angle) + h2;
+    if (ff_outlink_frame_wanted(outlink)) {
+        AVFrame *frame = ff_get_video_buffer(outlink, s->w, s->h);
+        float angle = fmodf(s->pts * s->speed, 2.f * M_PI);
+        const float w2 = s->w / 2.f;
+        const float h2 = s->h / 2.f;
 
-    s->fx1 = (s->x1 - w2) * cosf(angle) - (s->y1 - h2) * sinf(angle) + w2;
-    s->fy1 = (s->x1 - w2) * sinf(angle) + (s->y1 - h2) * cosf(angle) + h2;
+        s->fx0 = (s->x0 - w2) * cosf(angle) - (s->y0 - h2) * sinf(angle) + w2;
+        s->fy0 = (s->x0 - w2) * sinf(angle) + (s->y0 - h2) * cosf(angle) + h2;
 
-    if (!frame)
-        return AVERROR(ENOMEM);
+        s->fx1 = (s->x1 - w2) * cosf(angle) - (s->y1 - h2) * sinf(angle) + w2;
+        s->fy1 = (s->x1 - w2) * sinf(angle) + (s->y1 - h2) * cosf(angle) + h2;
+
+        if (!frame)
+            return AVERROR(ENOMEM);
 
-    frame->key_frame           = 1;
-    frame->interlaced_frame    = 0;
-    frame->pict_type           = AV_PICTURE_TYPE_I;
-    frame->sample_aspect_ratio = (AVRational) {1, 1};
-    frame->pts = s->pts++;
+        frame->key_frame           = 1;
+        frame->interlaced_frame    = 0;
+        frame->pict_type           = AV_PICTURE_TYPE_I;
+        frame->sample_aspect_ratio = (AVRational) {1, 1};
+        frame->pts = s->pts++;
 
-    ctx->internal->execute(ctx, s->draw_slice, frame, NULL, FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
+        ctx->internal->execute(ctx, s->draw_slice, frame, NULL,
+                               FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
+
+        return ff_filter_frame(outlink, frame);
+    }
 
-    return ff_filter_frame(outlink, frame);
+    return FFERROR_NOT_READY;
 }
 
 static const AVFilterPad gradients_outputs[] = {
     {
         .name          = "default",
         .type          = AVMEDIA_TYPE_VIDEO,
-        .request_frame = gradients_request_frame,
         .config_props  = config_output,
     },
     { NULL }
@@ -298,5 +306,6 @@ AVFilter ff_vsrc_gradients = {
     .query_formats = query_formats,
     .inputs        = NULL,
     .outputs       = gradients_outputs,
+    .activate      = activate,
     .flags         = AVFILTER_FLAG_SLICE_THREADS,
 };



More information about the ffmpeg-cvslog mailing list