From 0563143f20f127d7162ce854f03a08708c7f66cf Mon Sep 17 00:00:00 2001 From: Ethan Halsall Date: Sun, 25 May 2025 00:51:05 -0500 Subject: [PATCH] add yuv444p support to mcdeint Signed-off-by: Ethan Halsall --- libavfilter/vf_mcdeint.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/libavfilter/vf_mcdeint.c b/libavfilter/vf_mcdeint.c index 82048b51d0..11ad19f5cd 100644 --- a/libavfilter/vf_mcdeint.c +++ b/libavfilter/vf_mcdeint.c @@ -51,8 +51,10 @@ #include "libavutil/opt.h" #include "libavcodec/avcodec.h" +#include "libavutil/pixdesc.h" #include "avfilter.h" #include "filters.h" +#include "formats.h" #include "video.h" enum MCDeintMode { @@ -76,6 +78,7 @@ typedef struct MCDeintContext { AVPacket *pkt; AVFrame *frame_dec; AVCodecContext *enc_ctx; + const AVPixFmtDescriptor *pix_fmt_desc; } MCDeintContext; #define OFFSET(x) offsetof(MCDeintContext, x) @@ -99,6 +102,17 @@ static const AVOption mcdeint_options[] = { AVFILTER_DEFINE_CLASS(mcdeint); +static const enum AVPixelFormat pix_fmts[] = { + AV_PIX_FMT_YUV420P, + AV_PIX_FMT_YUV444P, + AV_PIX_FMT_NONE +}; + +static int query_formats(AVFilterContext *ctx) +{ + return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts)); +} + static int config_props(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; @@ -122,13 +136,16 @@ static int config_props(AVFilterLink *inlink) mcdeint->enc_ctx = avcodec_alloc_context3(enc); if (!mcdeint->enc_ctx) return AVERROR(ENOMEM); + mcdeint->pix_fmt_desc = av_pix_fmt_desc_get(inlink->format); + if (!mcdeint->pix_fmt_desc) + return AVERROR(ENOMEM); enc_ctx = mcdeint->enc_ctx; enc_ctx->width = inlink->w; enc_ctx->height = inlink->h; enc_ctx->time_base = (AVRational){1,25}; // meaningless enc_ctx->gop_size = INT_MAX; enc_ctx->max_b_frames = 0; - enc_ctx->pix_fmt = AV_PIX_FMT_YUV420P; + enc_ctx->pix_fmt = inlink->format; enc_ctx->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_LOW_DELAY | AV_CODEC_FLAG_RECON_FRAME; enc_ctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; enc_ctx->global_quality = 1; @@ -201,8 +218,14 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic) for (i = 0; i < 3; i++) { int is_chroma = !!i; - int w = AV_CEIL_RSHIFT(inlink->w, is_chroma); - int h = AV_CEIL_RSHIFT(inlink->h, is_chroma); + int w, h; + if (is_chroma) { + w = inlink->w >> mcdeint->pix_fmt_desc->log2_chroma_w; + h = inlink->h >> mcdeint->pix_fmt_desc->log2_chroma_h; + } else { + w = inlink->w; + h = inlink->h; + } int fils = frame_dec->linesize[i]; int srcs = inpic ->linesize[i]; int dsts = outpic ->linesize[i]; @@ -307,5 +330,6 @@ const FFFilter ff_vf_mcdeint = { .uninit = uninit, FILTER_INPUTS(mcdeint_inputs), FILTER_OUTPUTS(ff_video_default_filterpad), - FILTER_SINGLE_PIXFMT(AV_PIX_FMT_YUV420P), + FILTER_QUERY_FUNC(query_formats), }; + -- 2.43.0