From patchwork Thu Aug 2 18:52:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Lavrushkin X-Patchwork-Id: 9874 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp2403343jad; Thu, 2 Aug 2018 12:02:09 -0700 (PDT) X-Google-Smtp-Source: AAOMgpetWHVAtMbYRCnhs8V01ttodqhwM/xCS6pkQMPUwmrFOoGJQrdWPKDE9uuQO6KUR6tHNfnb X-Received: by 2002:a1c:b58e:: with SMTP id e136-v6mr2666523wmf.141.1533236529254; Thu, 02 Aug 2018 12:02:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1533236529; cv=none; d=google.com; s=arc-20160816; b=cROl7gfTGwfMuskYHVO10vGi/SizBhx8jRXB4XdqlDajWvS3HKrlFphxVt8o++QoSh c/wTWEl+GAzD+UOZ4qe0wGi0P0d7yObi/x3syLJKCMX+0CNvcrmAUlxhl38eOGWSE8EU FvggbQXhFsACeRP6/EmFRA21aXmT73z6O0O36ZbejdmHOWV/Hn2bsde3JOgPFrltNOdK 3MsIqtKTM7DwIXWZandCHd1YC9vXLauakXihdmdr5Wrzq6Hk5O4u99Q7ofZYwYlQAUeb QOCNUQWzc9Zvhoie0bEn1GNvDNmB6nVeGpd76uM+OCWB9FZVM7t48D6+OpGtHDIasY3V 6AZw== 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:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=i91DtIjawQ81z7IAi0Hs4FhWTiWfxcw/hq+OgwpfWHQ=; b=GBU4EheiJxmOMw2v4oVKf+HOKaY7AgSAlY5zvFb+YPAuVvWQwEpBVQbtGBmF4UwV/C cLvolUFwfNeHTp9fKSygJTsm5XAfAI6z4gxxBqHAHEJr3ZV9mTHxn7UfjBNDOCIZR0+3 0Nbv6pxelewLXVsV8iRQBJ3IiakEMmgVYV7qyV6aQ4Bpz0Jpx/C8kBsVBsRDnNJD3Ve8 hGs7Rd5TEPABQPV6QiKCLTVey5/3GHtQQeJGno7sDj2PYJvAvDcBEz3cQKSnR4gQHKzW 5K7xO3lTGBzF4bxNnlpBTzb4N3xq/M75PemjnqBxLF79RQrh/9Nxb077e74qY3qkdAJe w+wg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=sF2Ltq04; 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 q9-v6si1746379wrw.327.2018.08.02.12.02.08; Thu, 02 Aug 2018 12:02:09 -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=sF2Ltq04; 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 BAE0768A3E2; Thu, 2 Aug 2018 22:01:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CF7BA689B55 for ; Thu, 2 Aug 2018 22:01:42 +0300 (EEST) Received: by mail-lj1-f182.google.com with SMTP id p6-v6so2858364ljc.5 for ; Thu, 02 Aug 2018 12:02:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Xa7bRxxbHn3rGsOv1/V5H0nV2boAsoIjRQRgVOaWbVU=; b=sF2Ltq04Cd/5oMvsyHvm9nW/x/khvapKjDYc54Du7QevAKFQ0Lx3MZD7igbQe3Gaq2 1fwpanjKVbQzs/mElta7IFLXdFnxhtFlXTAZezv9Af35QUOfCQbXA05TejUgGwJwYgXm viD+7JbP9PLKxFAwPu7E1EQfQBVOHMoJgNHC3/LtV2tazbNXVc38b0ms8CbzkN22kkRh 1SVGk5OEgfQOsgwddjT0/liF0YQVlTg6iPBWe6tOxkFFTHXqvCkDAVcm0vo1yaf3QnKK zNworIWIdH4iZZtCq06H42PXlV2LbGivxcC3W7oIQyjHw1SQF6E7mxNwFF4TfNqD59/2 vm8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Xa7bRxxbHn3rGsOv1/V5H0nV2boAsoIjRQRgVOaWbVU=; b=W5U6YRGZ+LQmttSezxHLnzUgGrftQ68k4x9tPEj77QPjA/3M9IYYrdKE6NnvRxsU+d sdamKbUIXO/NjOujLSRisXyRHrR/FXhegaZ0CEg/jryRY3guvXUXyMZnGimbKP+o9USB 0+tfrxweWQ8podTmNZy5qXo0JqSxPB6KgzoMawDZcHA7bw99bsnR62a6aCImdolea5u1 u2SKOZz4QfzEG95KHEppKEcXrZpxl1m3OhQubs+OEryoxeizk9z5vggtHKJN6LZLV2eC hB6wpBY0z0/h17KDKvLBZjjY/FcjkOg3ZTdEK0dKopRrwO+KsAH4ClNYMu8VzPhiFzIH 9Cog== X-Gm-Message-State: AOUpUlGZUBHWm6eZQ74fw36wTGNDGjJ5+MMddf9fTTNErmxiUCNMG3yU j+L6E7W6CsEYeZPxAxIJy2Ob8BUS X-Received: by 2002:a2e:9ec9:: with SMTP id h9-v6mr2707156ljk.133.1533236064383; Thu, 02 Aug 2018 11:54:24 -0700 (PDT) Received: from localhost.localdomain (nat-1-27.msu.umos.ru. [85.89.127.27]) by smtp.gmail.com with ESMTPSA id h4-v6sm410377lfj.69.2018.08.02.11.54.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 02 Aug 2018 11:54:23 -0700 (PDT) From: Sergey Lavrushkin To: ffmpeg-devel@ffmpeg.org Date: Thu, 2 Aug 2018 21:52:45 +0300 Message-Id: <20180802185248.18168-5-dualfal@gmail.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180802185248.18168-1-dualfal@gmail.com> References: <20180802185248.18168-1-dualfal@gmail.com> Subject: [FFmpeg-devel] [PATCH 4/7] Adds gray floating-point pixel formats. 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 Cc: Sergey Lavrushkin MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This patch adds two floating-point gray formats to use them in sr filter for conversion with libswscale. I added conversion from uint gray to float and backwards in swscale_unscaled.c, that is enough for sr filter. But for proper format addition, should I add anything else? --- libavutil/pixdesc.c | 22 ++++++++++++++++++ libavutil/pixfmt.h | 5 ++++ libswscale/swscale_internal.h | 7 ++++++ libswscale/swscale_unscaled.c | 54 +++++++++++++++++++++++++++++++++++++++++-- libswscale/utils.c | 5 +++- 5 files changed, 90 insertions(+), 3 deletions(-) diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c index 96e079584a..7d307d9120 100644 --- a/libavutil/pixdesc.c +++ b/libavutil/pixdesc.c @@ -2198,6 +2198,28 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA | AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_FLOAT, }, + [AV_PIX_FMT_GRAYF32BE] = { + .name = "grayf32be", + .nb_components = 1, + .log2_chroma_w = 0, + .log2_chroma_h = 0, + .comp = { + { 0, 4, 0, 0, 32, 3, 31, 1 }, /* Y */ + }, + .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_FLOAT, + .alias = "yf32be", + }, + [AV_PIX_FMT_GRAYF32LE] = { + .name = "grayf32le", + .nb_components = 1, + .log2_chroma_w = 0, + .log2_chroma_h = 0, + .comp = { + { 0, 4, 0, 0, 32, 3, 31, 1 }, /* Y */ + }, + .flags = AV_PIX_FMT_FLAG_FLOAT, + .alias = "yf32le", + }, [AV_PIX_FMT_DRM_PRIME] = { .name = "drm_prime", .flags = AV_PIX_FMT_FLAG_HWACCEL, diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h index 2b3307845e..aa9a4f60c1 100644 --- a/libavutil/pixfmt.h +++ b/libavutil/pixfmt.h @@ -320,6 +320,9 @@ enum AVPixelFormat { AV_PIX_FMT_GBRAPF32BE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian AV_PIX_FMT_GBRAPF32LE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian + AV_PIX_FMT_GRAYF32BE, ///< IEEE-754 single precision Y, 32bpp, big-endian + AV_PIX_FMT_GRAYF32LE, ///< IEEE-754 single precision Y, 32bpp, little-endian + /** * DRM-managed buffers exposed through PRIME buffer sharing. * @@ -405,6 +408,8 @@ enum AVPixelFormat { #define AV_PIX_FMT_GBRPF32 AV_PIX_FMT_NE(GBRPF32BE, GBRPF32LE) #define AV_PIX_FMT_GBRAPF32 AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE) +#define AV_PIX_FMT_GRAYF32 AV_PIX_FMT_NE(GRAYF32BE, GRAYF32LE) + #define AV_PIX_FMT_YUVA420P9 AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE) #define AV_PIX_FMT_YUVA422P9 AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE) #define AV_PIX_FMT_YUVA444P9 AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE) diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h index 1703856ab2..4a2cdfe658 100644 --- a/libswscale/swscale_internal.h +++ b/libswscale/swscale_internal.h @@ -764,6 +764,13 @@ static av_always_inline int isAnyRGB(enum AVPixelFormat pix_fmt) pix_fmt == AV_PIX_FMT_MONOBLACK || pix_fmt == AV_PIX_FMT_MONOWHITE; } +static av_always_inline int isFloat(enum AVPixelFormat pix_fmt) +{ + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); + av_assert0(desc); + return desc->flags & AV_PIX_FMT_FLAG_FLOAT; +} + static av_always_inline int isALPHA(enum AVPixelFormat pix_fmt) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c index 6480070cbf..f5b4c9be9d 100644 --- a/libswscale/swscale_unscaled.c +++ b/libswscale/swscale_unscaled.c @@ -1467,6 +1467,46 @@ static int yvu9ToYv12Wrapper(SwsContext *c, const uint8_t *src[], return srcSliceH; } +static int uint_y_to_float_y_wrapper(SwsContext *c, const uint8_t *src[], + int srcStride[], int srcSliceY, + int srcSliceH, uint8_t *dst[], int dstStride[]) +{ + int y, x; + int dstStrideFloat = dstStride[0] >> 2;; + const uint8_t *srcPtr = src[0]; + float *dstPtr = (float *)(dst[0] + dstStride[0] * srcSliceY); + + for (y = 0; y < srcSliceH; ++y){ + for (x = 0; x < c->srcW; ++x){ + dstPtr[x] = (float)srcPtr[x] / 255.0f; + } + srcPtr += srcStride[0]; + dstPtr += dstStrideFloat; + } + + return srcSliceH; +} + +static int float_y_to_uint_y_wrapper(SwsContext *c, const uint8_t* src[], + int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]) +{ + int y, x; + int srcStrideFloat = srcStride[0] >> 2; + const float *srcPtr = (const float *)src[0]; + uint8_t *dstPtr = dst[0] + dstStride[0] * srcSliceY; + + for (y = 0; y < srcSliceH; ++y){ + for (x = 0; x < c->srcW; ++x){ + dstPtr[x] = (uint8_t)(255.0f * FFMIN(FFMAX(srcPtr[x], 0.0f), 1.0f)); + } + srcPtr += srcStrideFloat; + dstPtr += dstStride[0]; + } + + return srcSliceH; +} + /* unscaled copy like stuff (assumes nearly identical formats) */ static int packedCopyWrapper(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, @@ -1899,6 +1939,16 @@ void ff_get_unscaled_swscale(SwsContext *c) c->swscale = yuv422pToUyvyWrapper; } + /* uint Y to float Y */ + if (srcFormat == AV_PIX_FMT_GRAY8 && dstFormat == AV_PIX_FMT_GRAYF32){ + c->swscale = uint_y_to_float_y_wrapper; + } + + /* float Y to uint Y */ + if (srcFormat == AV_PIX_FMT_GRAYF32 && dstFormat == AV_PIX_FMT_GRAY8){ + c->swscale = float_y_to_uint_y_wrapper; + } + /* LQ converters if -sws 0 or -sws 4*/ if (c->flags&(SWS_FAST_BILINEAR|SWS_POINT)) { /* yv12_to_yuy2 */ @@ -1925,13 +1975,13 @@ void ff_get_unscaled_swscale(SwsContext *c) if ( srcFormat == dstFormat || (srcFormat == AV_PIX_FMT_YUVA420P && dstFormat == AV_PIX_FMT_YUV420P) || (srcFormat == AV_PIX_FMT_YUV420P && dstFormat == AV_PIX_FMT_YUVA420P) || - (isPlanarYUV(srcFormat) && isPlanarGray(dstFormat)) || + (isFloat(srcFormat) == isFloat(dstFormat)) && ((isPlanarYUV(srcFormat) && isPlanarGray(dstFormat)) || (isPlanarYUV(dstFormat) && isPlanarGray(srcFormat)) || (isPlanarGray(dstFormat) && isPlanarGray(srcFormat)) || (isPlanarYUV(srcFormat) && isPlanarYUV(dstFormat) && c->chrDstHSubSample == c->chrSrcHSubSample && c->chrDstVSubSample == c->chrSrcVSubSample && - !isSemiPlanarYUV(srcFormat) && !isSemiPlanarYUV(dstFormat))) + !isSemiPlanarYUV(srcFormat) && !isSemiPlanarYUV(dstFormat)))) { if (isPacked(c->srcFormat)) c->swscale = packedCopyWrapper; diff --git a/libswscale/utils.c b/libswscale/utils.c index 61b47182f8..dffb236724 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -258,6 +258,8 @@ static const FormatEntry format_entries[AV_PIX_FMT_NB] = { [AV_PIX_FMT_P010BE] = { 1, 1 }, [AV_PIX_FMT_P016LE] = { 1, 1 }, [AV_PIX_FMT_P016BE] = { 1, 1 }, + [AV_PIX_FMT_GRAYF32LE] = { 1, 1 }, + [AV_PIX_FMT_GRAYF32BE] = { 1, 1 }, }; int sws_isSupportedInput(enum AVPixelFormat pix_fmt) @@ -1793,7 +1795,8 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, /* unscaled special cases */ if (unscaled && !usesHFilter && !usesVFilter && - (c->srcRange == c->dstRange || isAnyRGB(dstFormat))) { + (c->srcRange == c->dstRange || isAnyRGB(dstFormat) || + srcFormat == AV_PIX_FMT_GRAYF32 || dstFormat == AV_PIX_FMT_GRAYF32)) { ff_get_unscaled_swscale(c); if (c->swscale) {