From patchwork Thu May 3 18:08:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 8766 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp2080709jad; Thu, 3 May 2018 11:08:20 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpebfhf+/2o9tCD1Fl8Yj+TIMo1m8MJ92QNzMkER/dk3A10sPe465GLDtuYvkQ+OO4TD1LN X-Received: by 2002:adf:be90:: with SMTP id i16-v6mr20030403wrh.63.1525370900890; Thu, 03 May 2018 11:08:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525370900; cv=none; d=google.com; s=arc-20160816; b=Yr8qbwxA3HwYU0fmPse775Xtn1nSnkV7iI65Zkt6lqy97l9GVC0+Xdy1Q2d8C9lJnv En1vLIH60TxkFdI0wFpDwqo5vOA/LvWAFuCAV4vWBsap/+huVogvsfM2T+YxTiEXBDdl onD06HEqWlCLqfpRprfsa+XTTU6Wf4OUJRuRJCx9WenSQCIdCGDcE6JhKqfMXt/Ko7eu GGpDc3uAq2CjzEoGI9yjnBfQqsQwWnjk9WzUOVQEnOybNnqqWF2/ij3RiQ6kAkY0qWNv CzlLgpT/ZXonb8OJQcrcdMtmx9qjeEvC+fYAuxb+nngsnrXMvKpB1iEHXQg1AQCBdV8a RBuQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=+l/E2TlbJ7EZhkUxKe6ohQHYTqgES0o6kCvSOr1WVRA=; b=uYvxES078KacGDd6I4T/hyipABvaBckp2jZosawfEJ5by96TgtkAWQl4jVFuqfwIka WwRPQx7v+dpXWPntWy8Qtlaalx360cHBblJAXZ/SEBd5kTedlEOueSu6o0EWN5v2j2BG lS+HtB4qZQBrrf7Kbs7UUD/rPwdlT3jKeirVstsZHlaR8hOssLe3x3i1AhniDPa0ics7 L0RzFXt5cSR8gc3HuI4otAt30Yex8JIeTiYFN6S5ZEuIfDMuH7U5JwIXXtU0DNAaz7WU V3LH6tCJdSURj+W3XwsqcbUSWLaowq/wnksoTaLSPF0/K4ni/nDw6DKxhIWgbcSSCO13 Z0eQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=sduK+sik; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id u126si81913wme.89.2018.05.03.11.08.20; Thu, 03 May 2018 11:08:20 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=sduK+sik; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8BA7468A4AC; Thu, 3 May 2018 21:07:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f196.google.com (mail-wr0-f196.google.com [209.85.128.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BF97668A483 for ; Thu, 3 May 2018 21:07:39 +0300 (EEST) Received: by mail-wr0-f196.google.com with SMTP id c14-v6so18538817wrd.4 for ; Thu, 03 May 2018 11:08:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=Ao8Yaj8ACtDE6eIZ8I3SkS/echC87aW/XD6V5gw9/1s=; b=sduK+sikfb2OBO6FBakJmvo2/fpO96USqe6smAeRaA42uGJR6cDBKB+El78tRaGJsi K4nM1tvQ5gvt45zVRO7JwM6ISOy0x1jCd5XDnBEhFWv6wBzWxi++wUeJdH/rzSr9/YCH TMr0zR/MKama/d98kEBQVKC+gp2gqbtFJogXg7g3lryYa/v5Hmj7R+NBWHDXtiVyfVAv Twk7bJvF577wIqrW1TqWU2Y+qqSTni9+nwhNZw5kIGJwpyBHS7ghrZDHG8xhrHbtTQ4s 0IQnktUtTXt73yb3HA680CzlLPkoRmuIH7Dic43Y3HYq3ZvIyzKI09LJREN3E1WOrsku Jddg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=Ao8Yaj8ACtDE6eIZ8I3SkS/echC87aW/XD6V5gw9/1s=; b=J0sYkTtZRkWH9hamDLTe7320WRpJPXFq7iFMs5YXaifgyTSc0PRsfig3fOa2rmGBWx HnmrCDlfFpsAiLh0wT1SglhxPFGDX8kMtxAD9IxjMylRdC7dsSAdOK+nmP9YAmItXHES TyQ4UVcZX2EDl2OrI8sFKv+bkQ8j9IEnohn1OVozHUFOwSWbdnTJo/U6+YMVkgrVGRZr sX8m66Tv7IkWwErNwUWbskwg5xe5Ac2jSmmiQ2RBdsnbTUa6LTpP1scwaWEn2LNBe59D 53tqg6JpkrHeAaK1XR16JNlkyJNjBeVKXkE4N3BfnvEnPA/yON3cwSVgl+zROy9EHzaB EHkA== X-Gm-Message-State: ALQs6tCZjVTJI2gYSPkOH9ZAkFiUGxeGP5SmfH3iQIWxPhdv6tLi3mte mZD/0CTeR4oUXVXoZeo6syOuZA== X-Received: by 2002:adf:a453:: with SMTP id e19-v6mr18735732wra.121.1525370892599; Thu, 03 May 2018 11:08:12 -0700 (PDT) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id 109-v6sm14955395wra.32.2018.05.03.11.08.11 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 May 2018 11:08:12 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Thu, 3 May 2018 20:08:03 +0200 Message-Id: <20180503180803.27477-1-onemda@gmail.com> X-Mailer: git-send-email 2.11.0 Subject: [FFmpeg-devel] [PATCH] avfilter/vf_lut3d: add planar rgb support 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavfilter/vf_lut3d.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 111 insertions(+), 3 deletions(-) diff --git a/libavfilter/vf_lut3d.c b/libavfilter/vf_lut3d.c index c9b72249aa..2f8fc723b7 100644 --- a/libavfilter/vf_lut3d.c +++ b/libavfilter/vf_lut3d.c @@ -198,6 +198,83 @@ static inline struct rgbvec interp_tetrahedral(const LUT3DContext *lut3d, return c; } +#define DEFINE_INTERP_FUNC_PLANAR(name, nbits, depth) \ +static int interp_##nbits##_##name##_p##depth(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) \ +{ \ + int x, y; \ + const LUT3DContext *lut3d = ctx->priv; \ + const ThreadData *td = arg; \ + const AVFrame *in = td->in; \ + const AVFrame *out = td->out; \ + const int direct = out == in; \ + const int slice_start = (in->height * jobnr ) / nb_jobs; \ + const int slice_end = (in->height * (jobnr+1)) / nb_jobs; \ + uint8_t *grow = out->data[0] + slice_start * out->linesize[0]; \ + uint8_t *brow = out->data[1] + slice_start * out->linesize[1]; \ + uint8_t *rrow = out->data[2] + slice_start * out->linesize[2]; \ + uint8_t *arow = out->data[2] + slice_start * out->linesize[2]; \ + const uint8_t *srcgrow = in->data[0] + slice_start * in->linesize[0]; \ + const uint8_t *srcbrow = in->data[1] + slice_start * in->linesize[1]; \ + const uint8_t *srcrrow = in->data[2] + slice_start * in->linesize[2]; \ + const uint8_t *srcarow = in->data[3] + slice_start * in->linesize[3]; \ + const float scale = (1. / ((1<lutsize - 1); \ + \ + for (y = slice_start; y < slice_end; y++) { \ + uint##nbits##_t *dstg = (uint##nbits##_t *)grow; \ + uint##nbits##_t *dstb = (uint##nbits##_t *)brow; \ + uint##nbits##_t *dstr = (uint##nbits##_t *)rrow; \ + uint##nbits##_t *dsta = (uint##nbits##_t *)arow; \ + const uint##nbits##_t *srcg = (const uint##nbits##_t *)srcgrow; \ + const uint##nbits##_t *srcb = (const uint##nbits##_t *)srcbrow; \ + const uint##nbits##_t *srcr = (const uint##nbits##_t *)srcrrow; \ + const uint##nbits##_t *srca = (const uint##nbits##_t *)srcarow; \ + for (x = 0; x < in->width; x++) { \ + const struct rgbvec scaled_rgb = {srcr[x] * scale, \ + srcg[x] * scale, \ + srcb[x] * scale}; \ + struct rgbvec vec = interp_##name(lut3d, &scaled_rgb); \ + dstr[x] = av_clip(vec.r * (float)((1<linesize[3]) \ + dsta[x] = srca[x]; \ + } \ + grow += out->linesize[0]; \ + brow += out->linesize[1]; \ + rrow += out->linesize[2]; \ + arow += out->linesize[3]; \ + srcgrow += in->linesize[0]; \ + srcbrow += in->linesize[1]; \ + srcrrow += in->linesize[2]; \ + srcarow += in->linesize[3]; \ + } \ + return 0; \ +} + +DEFINE_INTERP_FUNC_PLANAR(nearest, 8, 8) +DEFINE_INTERP_FUNC_PLANAR(trilinear, 8, 8) +DEFINE_INTERP_FUNC_PLANAR(tetrahedral, 8, 8) + +DEFINE_INTERP_FUNC_PLANAR(nearest, 16, 9) +DEFINE_INTERP_FUNC_PLANAR(trilinear, 16, 9) +DEFINE_INTERP_FUNC_PLANAR(tetrahedral, 16, 9) + +DEFINE_INTERP_FUNC_PLANAR(nearest, 16, 10) +DEFINE_INTERP_FUNC_PLANAR(trilinear, 16, 10) +DEFINE_INTERP_FUNC_PLANAR(tetrahedral, 16, 10) + +DEFINE_INTERP_FUNC_PLANAR(nearest, 16, 12) +DEFINE_INTERP_FUNC_PLANAR(trilinear, 16, 12) +DEFINE_INTERP_FUNC_PLANAR(tetrahedral, 16, 12) + +DEFINE_INTERP_FUNC_PLANAR(nearest, 16, 14) +DEFINE_INTERP_FUNC_PLANAR(trilinear, 16, 14) +DEFINE_INTERP_FUNC_PLANAR(tetrahedral, 16, 14) + +DEFINE_INTERP_FUNC_PLANAR(nearest, 16, 16) +DEFINE_INTERP_FUNC_PLANAR(trilinear, 16, 16) +DEFINE_INTERP_FUNC_PLANAR(tetrahedral, 16, 16) + #define DEFINE_INTERP_FUNC(name, nbits) \ static int interp_##nbits##_##name(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) \ { \ @@ -470,6 +547,12 @@ static int query_formats(AVFilterContext *ctx) AV_PIX_FMT_RGB0, AV_PIX_FMT_BGR0, AV_PIX_FMT_RGB48, AV_PIX_FMT_BGR48, AV_PIX_FMT_RGBA64, AV_PIX_FMT_BGRA64, + AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP, + AV_PIX_FMT_GBRP9, + AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRAP10, + AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRAP12, + AV_PIX_FMT_GBRP14, + AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRAP16, AV_PIX_FMT_NONE }; AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts); @@ -480,24 +563,49 @@ static int query_formats(AVFilterContext *ctx) static int config_input(AVFilterLink *inlink) { - int is16bit = 0; + int depth, is16bit = 0, planar = 0; LUT3DContext *lut3d = inlink->dst->priv; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); + depth = desc->comp[0].depth; + switch (inlink->format) { case AV_PIX_FMT_RGB48: case AV_PIX_FMT_BGR48: case AV_PIX_FMT_RGBA64: case AV_PIX_FMT_BGRA64: is16bit = 1; + break; + case AV_PIX_FMT_GBRP9: + case AV_PIX_FMT_GBRP10: + case AV_PIX_FMT_GBRP12: + case AV_PIX_FMT_GBRP14: + case AV_PIX_FMT_GBRP16: + case AV_PIX_FMT_GBRAP10: + case AV_PIX_FMT_GBRAP12: + case AV_PIX_FMT_GBRAP16: + is16bit = 1; + case AV_PIX_FMT_GBRP: + case AV_PIX_FMT_GBRAP: + planar = 1; + break; } ff_fill_rgba_map(lut3d->rgba_map, inlink->format); lut3d->step = av_get_padded_bits_per_pixel(desc) >> (3 + is16bit); #define SET_FUNC(name) do { \ - if (is16bit) lut3d->interp = interp_16_##name; \ - else lut3d->interp = interp_8_##name; \ + if (planar) { \ + switch (depth) { \ + case 8: lut3d->interp = interp_8_##name##_p8; break; \ + case 9: lut3d->interp = interp_16_##name##_p9; break; \ + case 10: lut3d->interp = interp_16_##name##_p10; break; \ + case 12: lut3d->interp = interp_16_##name##_p12; break; \ + case 14: lut3d->interp = interp_16_##name##_p14; break; \ + case 16: lut3d->interp = interp_16_##name##_p16; break; \ + } \ + } else if (is16bit) { lut3d->interp = interp_16_##name; \ + } else { lut3d->interp = interp_8_##name; } \ } while (0) switch (lut3d->interpolation) {