@@ -27,6 +27,7 @@
#include <string.h>
#include "avfilter.h"
+#include "filters.h"
#include "formats.h"
#include "internal.h"
#include "scale.h"
@@ -545,6 +546,41 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
return ret;
}
+static int activate(AVFilterContext *ctx)
+{
+ AVFilterLink *inlink = ctx->inputs[0];
+ AVFilterLink *outlink = ctx->outputs[0];
+ AVFrame *in, *out;
+ int64_t pts;
+ int ret, status;
+ int got_frame = 0;
+
+ FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+ ret = ff_inlink_consume_frame(inlink, &in);
+ if (ret > 0) {
+ ret = scale_frame(inlink, in, &out, &got_frame);
+ if (ret)
+ return ret;
+ }
+
+ if (ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+ if (status == AVERROR_EOF) {
+ /* frame flushing */
+ }
+
+ ff_outlink_set_status(outlink, status, pts);
+ return ret;
+ }
+
+ if (got_frame)
+ return ff_filter_frame(outlink, out);
+
+ FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+ return FFERROR_NOT_READY;
+}
+
static int filter_frame_ref(AVFilterLink *link, AVFrame *in)
{
AVFilterLink *outlink = link->dst->outputs[1];
@@ -643,7 +679,6 @@ static const AVFilterPad avfilter_vf_scale_inputs[] = {
{
.name = "default",
.type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame,
},
{ NULL }
};
@@ -662,6 +697,7 @@ AVFilter ff_vf_scale = {
.description = NULL_IF_CONFIG_SMALL("Scale the input video size and/or convert the image format."),
.init_dict = init_dict,
.uninit = uninit,
+ .activate = activate,
.query_formats = query_formats,
.priv_size = sizeof(ScaleContext),
.priv_class = &scale_class,