summaryrefslogtreecommitdiff
path: root/libavfilter/vsrc_gradients.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2020-09-04 18:50:57 +0200
committerPaul B Mahol <onemda@gmail.com>2020-09-04 19:37:29 +0200
commit9f5f971efd54b7325b60f48269ecd0cf3456ac04 (patch)
tree46fea26c680e210bd433db87e715258e1aeef701 /libavfilter/vsrc_gradients.c
parente8819d86fa772787f281ce693e89cb1b769f005f (diff)
downloadffmpeg-9f5f971efd54b7325b60f48269ecd0cf3456ac04.tar.gz
avfilter/vsrc_gradients: switch to activate
Allow to set the EOF timestamp.
Diffstat (limited to 'libavfilter/vsrc_gradients.c')
-rw-r--r--libavfilter/vsrc_gradients.c53
1 files 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,
};