From patchwork Sat Sep 5 19:15:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carl Eugen Hoyos X-Patchwork-Id: 22123 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 7B1EA44BB7E for ; Sat, 5 Sep 2020 22:15:55 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5BCBF687ED6; Sat, 5 Sep 2020 22:15:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 564026802C1 for ; Sat, 5 Sep 2020 22:15:49 +0300 (EEST) Received: by mail-pj1-f43.google.com with SMTP id a9so1520895pjg.1 for ; Sat, 05 Sep 2020 12:15:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=r9rhNeiaoQWRq7GtFG6AjariXeZB6z2qtxPMEObtq9w=; b=Idx5+yrWPncb6Qwme7aERbZXqlOzlo3zh+byemGeqseKEOIDLRm7jOMzmMLMIZKP2K 8hatPxduAKmsD/YntXnZ6dx3p82mRutZraJ32o0X1i5HBRqOf8YcyP3C5nOlljMcu4rH LwdnH1jpJWWOJeAOQuMqXpsQoWfaKodExyIDyViKoPMRbYCO7YSu/7V4XHWWcks54Rpu Hr+MVquQqNDDr7N3m4Zu1WuWiZm1Jz96oZvFIBDcYX6MIKgsn5vF0M74hxbMci5k7VC1 hcyAqT5DkX4GEPlJplGBMQ41X8XrqefPRyOwA3ammwyPONLG62+Rsw9B3kIjH+nd5p3x lAKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=r9rhNeiaoQWRq7GtFG6AjariXeZB6z2qtxPMEObtq9w=; b=Y/BOEN20UefLdlZYXQbv3EMkT2NNmi+nkjdHRtFOTGEQOkG+oGu7MBhrg0tjBpgxQo X5VFVyHu2sAtiGmFJMzE3Kyvc6U9QgaQ+ULgnwexGW75aEAmt5Owl+F6aM/lxL161UpK 72KQYP+JwvfrZpM2b7gAyCSLsYBzt8FgJNQbZGmQIvaPzvikhL+bfiv+wRADxWhn8aht qcNrPL0NqT2udGeQJQQ7nPk2uGiBPlJlVymH/Y2zPv+bqEREMnqWmOK3ECejMhp+EoM9 fwDXMGYp6GI3dnu4JwGjXAhFodk70mfSq9LpOs8wjngOfRhXJrP8VY0obRUpISe9Qj9Z aZJA== X-Gm-Message-State: AOAM5327PpysFnGZfqmN9IiF+3dpMH5QTTfP8wNilSC6UrJXjNBV3S4H ukIRprDOIPxnUcy48h2NzFWy1suuu+34y11VrSCB+39VBMI= X-Google-Smtp-Source: ABdhPJzbCfAPzaBIZgi3ulxhMXp/RR0DDBelgEr8TjmNnsHLYsT7V6/8U/2Kd5BzvnvtWE+ASKWkQawTU7J+lFxhPYw= X-Received: by 2002:a17:90b:d90:: with SMTP id bg16mr13349772pjb.199.1599333347149; Sat, 05 Sep 2020 12:15:47 -0700 (PDT) MIME-Version: 1.0 From: Carl Eugen Hoyos Date: Sat, 5 Sep 2020 21:15:36 +0200 Message-ID: To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH]lavfi/vflip: Support Bayer vertical flip X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Hi! Attached patch fixes ticket #8819. Please comment, Carl Eugen Subject: [PATCH] lavfi/vflip: Support Bayer vertical flip. Fixes ticket #8819. --- libavfilter/vf_vflip.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/libavfilter/vf_vflip.c b/libavfilter/vf_vflip.c index c7c39d3341..fb729142ab 100644 --- a/libavfilter/vf_vflip.c +++ b/libavfilter/vf_vflip.c @@ -33,6 +33,7 @@ typedef struct FlipContext { const AVClass *class; int vsub; ///< vertical chroma subsampling + int bayer; } FlipContext; static const AVOption vflip_options[] = { @@ -47,6 +48,7 @@ static int config_input(AVFilterLink *link) const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); flip->vsub = desc->log2_chroma_h; + flip->bayer = !!(desc->flags & AV_PIX_FMT_FLAG_BAYER); return 0; } @@ -74,11 +76,44 @@ static AVFrame *get_video_buffer(AVFilterLink *link, int w, int h) return frame; } +static int flip_bayer(AVFilterLink *link, AVFrame *in) +{ + AVFilterContext *ctx = link->dst; + AVFilterLink *outlink = ctx->outputs[0]; + AVFrame *out; + uint8_t *inrow = in->data[0], *outrow; + int width, i, is16 = av_pix_fmt_desc_get(link->format)->comp[0].step > 1; + if (outlink->h & 1) { + av_log(ctx, AV_LOG_ERROR, "Bayer vertical flip needs even height\n"); + return AVERROR_INVALIDDATA; + } + + width = outlink->w << is16; + out = ff_get_video_buffer(outlink, outlink->w, outlink->h); + if (!out) { + av_frame_free(&in); + return AVERROR(ENOMEM); + } + av_frame_copy_props(out, in); + outrow = out->data[0] + out->linesize[0] * (outlink->h - 2); + for (i = 0; i < outlink->h >> 1; i++) { + memcpy(outrow, inrow, width); + memcpy(outrow + out->linesize[0], inrow + in->linesize[0], width); + inrow += 2 * in->linesize[0]; + outrow -= 2 * out->linesize[0]; + } + av_frame_free(&in); + return ff_filter_frame(outlink, out); +} + static int filter_frame(AVFilterLink *link, AVFrame *frame) { FlipContext *flip = link->dst->priv; int i; + if (flip->bayer) + return flip_bayer(link, frame); + for (i = 0; i < 4; i ++) { int vsub = i == 1 || i == 2 ? flip->vsub : 0; int height = AV_CEIL_RSHIFT(link->h, vsub);