From: Nicolas George <george@nsup.org> To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [WIP] [PATCH 2/2] lavfi/vf_framematch: add filter to output matching synchronized frames Date: Mon, 26 Jun 2023 22:09:32 +0200 Message-ID: <20230626200932.1329118-2-george@nsup.org> (raw) In-Reply-To: <20230626200932.1329118-1-george@nsup.org> Signed-off-by: Nicolas George <george@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-request@ffmpeg.org with subject "unsubscribe".
prev parent reply other threads:[~2023-06-26 20:09 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-06-26 20:09 [FFmpeg-devel] [WIP] [PATCH 1/2] lavfi/framesync: support filters with multiple outputs Nicolas George 2023-06-26 20:09 ` Nicolas George [this message]
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20230626200932.1329118-2-george@nsup.org \ --to=george@nsup.org \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git