Signed-off-by: Nicolas George <geo...@nsup.org> --- libavfilter/Makefile | 1 + libavfilter/allfilters.c | 1 + libavfilter/vf_framematch.c | 82 +++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 libavfilter/vf_framematch.c
Unfinished yet, but should be rather straightforward. I think I can squeeze some work on this the day after tomorrow. diff --git a/libavfilter/Makefile b/libavfilter/Makefile index 9b7813575a..290a473b63 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -313,6 +313,7 @@ OBJS-$(CONFIG_FIND_RECT_FILTER) += vf_find_rect.o lavfutils.o OBJS-$(CONFIG_FLOODFILL_FILTER) += vf_floodfill.o OBJS-$(CONFIG_FORMAT_FILTER) += vf_format.o OBJS-$(CONFIG_FPS_FILTER) += vf_fps.o +OBJS-$(CONFIG_FRAMEMATCH_FILTER) += vf_framematch.o OBJS-$(CONFIG_FRAMEPACK_FILTER) += vf_framepack.o OBJS-$(CONFIG_FRAMERATE_FILTER) += vf_framerate.o OBJS-$(CONFIG_FRAMESTEP_FILTER) += vf_framestep.o diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c index 9a7fadc58d..aa42b353c1 100644 --- a/libavfilter/allfilters.c +++ b/libavfilter/allfilters.c @@ -289,6 +289,7 @@ extern const AVFilter ff_vf_flip_vulkan; extern const AVFilter ff_vf_floodfill; extern const AVFilter ff_vf_format; extern const AVFilter ff_vf_fps; +extern const AVFilter ff_vf_framematch; extern const AVFilter ff_vf_framepack; extern const AVFilter ff_vf_framerate; extern const AVFilter ff_vf_framestep; diff --git a/libavfilter/vf_framematch.c b/libavfilter/vf_framematch.c new file mode 100644 index 0000000000..703b5ad93b --- /dev/null +++ b/libavfilter/vf_framematch.c @@ -0,0 +1,82 @@ + +#include "libavutil/avstring.h" +#include "libavutil/opt.h" + +#include "avfilter.h" +#include "framesync.h" +#include "internal.h" + +typedef struct MatchContext { + const AVClass *class; + int nb; + FFFrameSync fs; +} MatchContext; + +static av_cold int init(AVFilterContext *ctx) +{ + int i, ret; + MatchContext *s = ctx->priv; + + for (i = 0; i < s->nb; i++) { + AVFilterPad pad = { 0 }; + pad.type = AVMEDIA_TYPE_VIDEO; + pad.name = av_asprintf("input%d", i); + if (!pad.name) + return AVERROR(ENOMEM); + if ((ret = ff_append_inpad_free_name(ctx, &pad)) < 0) + return ret; + pad.name = av_asprintf("output%d", i); + if (!pad.name) + return AVERROR(ENOMEM); + if ((ret = ff_append_outpad_free_name(ctx, &pad)) < 0) + return ret; + } + return 0; +} + +static int query_formats(AVFilterContext *ctx) +{ + MatchContext *s = ctx->priv; + int i, ret; + + for (i = 0; i < s->nb; i++) { + AVFilterFormats *f = ff_all_formats(AVMEDIA_TYPE_AUDIO); + if ((ret = ff_formats_ref(f, &ctx->inputs [i]-> incfg.formats)) < 0 || + (ret = ff_formats_ref(f, &ctx->outputs[i]->outcfg.formats)) < 0) + return ret; + } + return 0; +} + +static av_cold void uninit(AVFilterContext *ctx) +{ + MatchContext *s = ctx->priv; + //ff_framesync_uninit(&s->fs); +} + +static int activate(AVFilterContext *ctx) +{ + MatchContext *s = ctx->priv; + return ff_framesync_activate(&s->fs); +} + +#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM +#define OFFSET(x) offsetof(MatchContext, x) +static const AVOption framematch_options[] = { + { "s", "set number of streams", OFFSET(nb), AV_OPT_TYPE_INT, {.i64=2}, 2, INT_MAX, .flags = FLAGS }, + { NULL }, +}; + +AVFILTER_DEFINE_CLASS(framematch); + +const AVFilter ff_vf_framematch = { + .name = "framematch", + .description = NULL_IF_CONFIG_SMALL("Match frames from multiple inputs"), + .priv_size = sizeof(MatchContext), + .priv_class = &framematch_class, + FILTER_QUERY_FUNC(query_formats), + .init = init, + .uninit = uninit, + .activate = activate, + .flags = AVFILTER_FLAG_DYNAMIC_INPUTS | AVFILTER_FLAG_DYNAMIC_OUTPUTS, +}; -- 2.39.2 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".