ffmpeg: update vf-deinterlace-v4l2m2m patch

Patch created using revisions b08d796..accf519
from branch vf-deinterlace-v4l2m2m-n7.1 of https://github.com/jernejsk/FFmpeg
This commit is contained in:
Alex Bee 2024-12-15 12:35:24 +01:00 committed by Matthias Reichl
parent 3464df829e
commit 3ce49a8aa5

View File

@ -1,4 +1,4 @@
From d38cb51a9362250b53aa9c7637b17d90718f5f65 Mon Sep 17 00:00:00 2001 From accf519d251f366afbbbffb67ebac3553a3c7cbb Mon Sep 17 00:00:00 2001
From: Jernej Skrabec <jernej.skrabec@siol.net> From: Jernej Skrabec <jernej.skrabec@siol.net>
Date: Tue, 3 Dec 2019 21:01:18 +0100 Date: Tue, 3 Dec 2019 21:01:18 +0100
Subject: [PATCH] Add V4L2 m2m deinterlace filter Subject: [PATCH] Add V4L2 m2m deinterlace filter
@ -7,15 +7,15 @@ Signed-off-by: Alex Bee <knaerzche@gmail.com>
--- ---
libavfilter/Makefile | 1 + libavfilter/Makefile | 1 +
libavfilter/allfilters.c | 1 + libavfilter/allfilters.c | 1 +
libavfilter/vf_deinterlace_v4l2m2m.c | 1009 ++++++++++++++++++++++++++ libavfilter/vf_deinterlace_v4l2m2m.c | 1011 ++++++++++++++++++++++++++
3 files changed, 1011 insertions(+) 3 files changed, 1013 insertions(+)
create mode 100644 libavfilter/vf_deinterlace_v4l2m2m.c create mode 100644 libavfilter/vf_deinterlace_v4l2m2m.c
diff --git a/libavfilter/Makefile b/libavfilter/Makefile diff --git a/libavfilter/Makefile b/libavfilter/Makefile
index b3d3d981dd..9103e3b395 100644 index 91487afb21..84adb9ba46 100644
--- a/libavfilter/Makefile --- a/libavfilter/Makefile
+++ b/libavfilter/Makefile +++ b/libavfilter/Makefile
@@ -262,6 +262,7 @@ OBJS-$(CONFIG_DEFLATE_FILTER) += vf_neighbor.o @@ -272,6 +272,7 @@ OBJS-$(CONFIG_DEFLATE_FILTER) += vf_neighbor.o
OBJS-$(CONFIG_DEFLICKER_FILTER) += vf_deflicker.o OBJS-$(CONFIG_DEFLICKER_FILTER) += vf_deflicker.o
OBJS-$(CONFIG_DEINTERLACE_QSV_FILTER) += vf_vpp_qsv.o OBJS-$(CONFIG_DEINTERLACE_QSV_FILTER) += vf_vpp_qsv.o
OBJS-$(CONFIG_DEINTERLACE_VAAPI_FILTER) += vf_deinterlace_vaapi.o vaapi_vpp.o OBJS-$(CONFIG_DEINTERLACE_VAAPI_FILTER) += vf_deinterlace_vaapi.o vaapi_vpp.o
@ -24,10 +24,10 @@ index b3d3d981dd..9103e3b395 100644
OBJS-$(CONFIG_DELOGO_FILTER) += vf_delogo.o OBJS-$(CONFIG_DELOGO_FILTER) += vf_delogo.o
OBJS-$(CONFIG_DENOISE_VAAPI_FILTER) += vf_misc_vaapi.o vaapi_vpp.o OBJS-$(CONFIG_DENOISE_VAAPI_FILTER) += vf_misc_vaapi.o vaapi_vpp.o
diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
index d7db46c2af..075f065f3c 100644 index 9819f0f95b..c6d93340e6 100644
--- a/libavfilter/allfilters.c --- a/libavfilter/allfilters.c
+++ b/libavfilter/allfilters.c +++ b/libavfilter/allfilters.c
@@ -240,6 +240,7 @@ extern const AVFilter ff_vf_dedot; @@ -248,6 +248,7 @@ extern const AVFilter ff_vf_dedot;
extern const AVFilter ff_vf_deflate; extern const AVFilter ff_vf_deflate;
extern const AVFilter ff_vf_deflicker; extern const AVFilter ff_vf_deflicker;
extern const AVFilter ff_vf_deinterlace_qsv; extern const AVFilter ff_vf_deinterlace_qsv;
@ -37,10 +37,10 @@ index d7db46c2af..075f065f3c 100644
extern const AVFilter ff_vf_delogo; extern const AVFilter ff_vf_delogo;
diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c
new file mode 100644 new file mode 100644
index 0000000000..ff5ed500a9 index 0000000000..bf163279ce
--- /dev/null --- /dev/null
+++ b/libavfilter/vf_deinterlace_v4l2m2m.c +++ b/libavfilter/vf_deinterlace_v4l2m2m.c
@@ -0,0 +1,1009 @@ @@ -0,0 +1,1011 @@
+/* +/*
+ * This file is part of FFmpeg. + * This file is part of FFmpeg.
+ * + *
@ -85,13 +85,13 @@ index 0000000000..ff5ed500a9
+#include "libavutil/hwcontext_drm.h" +#include "libavutil/hwcontext_drm.h"
+#include "libavutil/internal.h" +#include "libavutil/internal.h"
+#include "libavutil/mathematics.h" +#include "libavutil/mathematics.h"
+#include "libavutil/mem.h"
+#include "libavutil/opt.h" +#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h" +#include "libavutil/pixdesc.h"
+#include "libavutil/time.h" +#include "libavutil/time.h"
+ +
+#include "avfilter.h" +#include "avfilter.h"
+#include "formats.h" +#include "formats.h"
+#include "internal.h"
+#include "video.h" +#include "video.h"
+ +
+typedef struct V4L2Queue V4L2Queue; +typedef struct V4L2Queue V4L2Queue;
@ -178,8 +178,8 @@ index 0000000000..ff5ed500a9
+ case DRM_FORMAT_NV61: + case DRM_FORMAT_NV61:
+ return V4L2_PIX_FMT_NV61; + return V4L2_PIX_FMT_NV61;
+ default: + default:
+ av_log(NULL, AV_LOG_WARNING, "%s unknown drm format 0x%llx using default v4l2_pix_fmt 0x%x\n", + av_log(NULL, AV_LOG_WARNING, "%s unknown drm format %s using default v4l2_pix_fmt %s\n",
+ __func__ , drm_format, V4L2_PIX_FMT_NV12); + __func__ , av_fourcc2str(drm_format), av_fourcc2str(V4L2_PIX_FMT_NV12));
+ return V4L2_PIX_FMT_NV12; + return V4L2_PIX_FMT_NV12;
+ } + }
+} +}
@ -333,12 +333,12 @@ index 0000000000..ff5ed500a9
+ else if (!V4L2_TYPE_IS_OUTPUT(queue->format.type)) { + else if (!V4L2_TYPE_IS_OUTPUT(queue->format.type)) {
+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type) && fmt->fmt.pix_mp.pixelformat != v4l2_pix_fmt) { + if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type) && fmt->fmt.pix_mp.pixelformat != v4l2_pix_fmt) {
+ ctx->drm_out_format = drm_format_from_v4l2_pix_fmt(fmt->fmt.pix_mp.pixelformat); + ctx->drm_out_format = drm_format_from_v4l2_pix_fmt(fmt->fmt.pix_mp.pixelformat);
+ av_log(NULL, AV_LOG_DEBUG, "%s driver updated v4l2_pixfmt from: %x to %x, so now using %llx as drm output format\n", + av_log(NULL, AV_LOG_DEBUG, "%s driver updated v4l2_pixfmt from: %s to %s, so now using %s as drm output format\n",
+ __func__, v4l2_pix_fmt, fmt->fmt.pix_mp.pixelformat, ctx->drm_out_format); + __func__, av_fourcc2str(v4l2_pix_fmt), av_fourcc2str(fmt->fmt.pix_mp.pixelformat), av_fourcc2str(ctx->drm_out_format));
+ } else if (fmt->fmt.pix.pixelformat != v4l2_pix_fmt) { + } else if (fmt->fmt.pix.pixelformat != v4l2_pix_fmt) {
+ ctx->drm_out_format = drm_format_from_v4l2_pix_fmt(fmt->fmt.pix.pixelformat); + ctx->drm_out_format = drm_format_from_v4l2_pix_fmt(fmt->fmt.pix.pixelformat);
+ av_log(NULL, AV_LOG_DEBUG, "%s driver updated v4l2_pixfmt from: %x to %x, so now using %llx as drm output format\n", + av_log(NULL, AV_LOG_DEBUG, "%s driver updated v4l2_pixfmt from: %s to %s, so now using %s as drm output format\n",
+ __func__, v4l2_pix_fmt, fmt->fmt.pix.pixelformat, ctx->drm_out_format); + __func__, av_fourcc2str(v4l2_pix_fmt), av_fourcc2str(fmt->fmt.pix.pixelformat), av_fourcc2str(ctx->drm_out_format));
+ } + }
+ } + }
+ +
@ -818,7 +818,7 @@ index 0000000000..ff5ed500a9
+ if (err < 0) + if (err < 0)
+ goto fail_out1; + goto fail_out1;
+ +
+ output_frame_1->interlaced_frame = 0; + output_frame_1->flags &= ~AV_FRAME_FLAG_INTERLACED;
+ +
+ output_frame_2 = av_frame_alloc(); + output_frame_2 = av_frame_alloc();
+ if (!output_frame_2) { + if (!output_frame_2) {
@ -836,7 +836,7 @@ index 0000000000..ff5ed500a9
+ if (err < 0) + if (err < 0)
+ goto fail_out2; + goto fail_out2;
+ +
+ output_frame_2->interlaced_frame = 0; + output_frame_2->flags &= ~AV_FRAME_FLAG_INTERLACED;
+ +
+ if (ctx->prev_in_frame && ctx->prev_in_frame->pts != AV_NOPTS_VALUE + if (ctx->prev_in_frame && ctx->prev_in_frame->pts != AV_NOPTS_VALUE
+ && input_frame->pts != AV_NOPTS_VALUE) { + && input_frame->pts != AV_NOPTS_VALUE) {
@ -874,13 +874,15 @@ index 0000000000..ff5ed500a9
+ AVFilterContext *avctx = outlink->src; + AVFilterContext *avctx = outlink->src;
+ DeintV4L2M2MContext *priv = avctx->priv; + DeintV4L2M2MContext *priv = avctx->priv;
+ DeintV4L2M2MContextShared *ctx = priv->shared; + DeintV4L2M2MContextShared *ctx = priv->shared;
+ FilterLink *fl_inlink = ff_filter_link(inlink);
+ FilterLink *fl_outlink = ff_filter_link(outlink);
+ int ret; + int ret;
+ +
+ ctx->height = avctx->inputs[0]->h; + ctx->height = avctx->inputs[0]->h;
+ ctx->width = avctx->inputs[0]->w; + ctx->width = avctx->inputs[0]->w;
+ +
+ outlink->frame_rate = av_mul_q(inlink->frame_rate, + fl_outlink->frame_rate = av_mul_q(fl_inlink->frame_rate,
+ (AVRational){ 2, 1 }); + (AVRational){ 2, 1 });
+ outlink->time_base = av_mul_q(inlink->time_base, + outlink->time_base = av_mul_q(inlink->time_base,
+ (AVRational){ 1, 2 }); + (AVRational){ 1, 2 });
+ +
@ -888,12 +890,12 @@ index 0000000000..ff5ed500a9
+ if (ret) + if (ret)
+ return ret; + return ret;
+ +
+ if (!inlink->hw_frames_ctx) { + if (!fl_inlink->hw_frames_ctx) {
+ av_log(priv, AV_LOG_ERROR, "No hw context provided on input\n"); + av_log(priv, AV_LOG_ERROR, "No hw context provided on input\n");
+ return AVERROR(EINVAL); + return AVERROR(EINVAL);
+ } + }
+ +
+ ctx->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx); + ctx->hw_frames_ctx = av_buffer_ref(fl_inlink->hw_frames_ctx);
+ if (!ctx->hw_frames_ctx) + if (!ctx->hw_frames_ctx)
+ return AVERROR(ENOMEM); + return AVERROR(ENOMEM);
+ +
@ -920,7 +922,7 @@ index 0000000000..ff5ed500a9
+ int ret; + int ret;
+ +
+ av_log(priv, AV_LOG_DEBUG, "input pts: %"PRId64" field :%d interlaced: %d\n", + av_log(priv, AV_LOG_DEBUG, "input pts: %"PRId64" field :%d interlaced: %d\n",
+ in->pts, in->top_field_first, in->interlaced_frame); + in->pts, !!(in->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST), !!(in->flags & AV_FRAME_FLAG_INTERLACED));
+ +
+ ctx->cur_in_frame = in; + ctx->cur_in_frame = in;
+ +
@ -931,7 +933,7 @@ index 0000000000..ff5ed500a9
+ ctx->drm_in_format = drm_desc->layers->format; + ctx->drm_in_format = drm_desc->layers->format;
+ ctx->drm_out_format = drm_desc->layers->format; + ctx->drm_out_format = drm_desc->layers->format;
+ +
+ if (in->top_field_first) + if (!!(in->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST))
+ ctx->field_order = V4L2_FIELD_INTERLACED_TB; + ctx->field_order = V4L2_FIELD_INTERLACED_TB;
+ else + else
+ ctx->field_order = V4L2_FIELD_INTERLACED_BT; + ctx->field_order = V4L2_FIELD_INTERLACED_BT;