From patchwork Wed Apr 29 03:02:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Reid X-Patchwork-Id: 19357 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 DD7BE44B6E0 for ; Wed, 29 Apr 2020 06:02:49 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CF35E68BE6E; Wed, 29 Apr 2020 06:02:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f171.google.com (mail-pg1-f171.google.com [209.85.215.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0361E68BE50 for ; Wed, 29 Apr 2020 06:02:45 +0300 (EEST) Received: by mail-pg1-f171.google.com with SMTP id n16so335826pgb.7 for ; Tue, 28 Apr 2020 20:02:45 -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 :mime-version:content-transfer-encoding; bh=5ts9itd2+w0xvq4HgPRj4t+bfyAXI2mhrghjB9JjtH4=; b=b96YEBVP/U9F0lTWdZYTubjA6XLqCKigaBXI+FJ7rXHdVGdFSEchgB5EKiBvc18fBf 73Au/7Hdgb1KcTgqZk535xBB7OIVgpZW1Rdu6phZV2R6IWCjQUJobobTMjpiU8191pMs kmz+DxnaUOKwF3p9Udfuu0EQ4bOIs1vFzBgHJmscGAwOWuMmcF+ryG+HJgZd8FlJ5vzm hMuEADgEf5ZR0K2yu8+PHKrF/i0h4VvY+OVkAM5moUM9bO+vDQ//Nw7by/WlOW4vjyFc hICN0/bItgFajB2axO93bCk4OvtbRvfnL1GlWet2pAdVRV6nweJypZRAVByhqWGEnUMn l1Ag== 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:mime-version:content-transfer-encoding; bh=5ts9itd2+w0xvq4HgPRj4t+bfyAXI2mhrghjB9JjtH4=; b=moWozW69XH40OuH6ErxjeAKhPskr5JjkQNmcRJtM8jGBtSCSi7KKvNNWOZZML9vYEq gPObKjiKie26wWppY5yT9Lq/shDIIKI0WmX1G/QRFrWA00K53Lxgt9zJwjl7drw4UODZ 2oNF18ZKu4Vp8ftAgonXDDpBv2G8J07ZYkycLTzAdo/sDUPXR+5N9Nqjvy/jlE9qHf7U NlN7HS1PtnUJT6uVTl86Sz0SXa/XEdnIkN+RQYTkeerXKCxF0QHmcxgcBdN8oFOWjo6a 04/nyoTC/BASGcMtbzFmVNE11xq2RYQVcglREkS0jB7cvfnOjVcDbkM759LmZ0/FE0o+ hjhw== X-Gm-Message-State: AGi0PuafIDssfAwADOp4UN3IvSPnaAfRlGgg9aXX+Iej4GfixAh8IH2l 7V6aqEuUVh0aPUIQPOTVYse+yXB9 X-Google-Smtp-Source: APiQypIFRnMAv03BjhSx/NET4DSh/9djEapvpe8Z6S/rSch4aOK2USjIZq8R5t1J0QKDfhxYfD4Gqw== X-Received: by 2002:a63:8c17:: with SMTP id m23mr14069925pgd.246.1588129363957; Tue, 28 Apr 2020 20:02:43 -0700 (PDT) Received: from localhost.localdomain (S01069050ca607903.vc.shawcable.net. [174.7.236.190]) by smtp.gmail.com with ESMTPSA id i9sm16335401pfk.199.2020.04.28.20.02.43 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 28 Apr 2020 20:02:43 -0700 (PDT) From: mindmark@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Apr 2020 20:02:33 -0700 Message-Id: <20200429030235.37074-2-mindmark@gmail.com> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200429030235.37074-1-mindmark@gmail.com> References: <20200429030235.37074-1-mindmark@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] libswscale: add input support AV_PIX_FMT_GBRAPF32 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: Mark Reid Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Mark Reid --- libswscale/input.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++ libswscale/utils.c | 4 ++ 2 files changed, 95 insertions(+) diff --git a/libswscale/input.c b/libswscale/input.c index 099661cb6d..e74cf04133 100644 --- a/libswscale/input.c +++ b/libswscale/input.c @@ -960,6 +960,59 @@ static av_always_inline void planar_rgb16_to_uv(uint8_t *_dstU, uint8_t *_dstV, } #undef rdpx +#define rdpx(src) (is_be ? av_int2float(AV_RB32(src)): av_int2float(AV_RL32(src))) + +static av_always_inline void planar_rgbf32_to_a(uint8_t *_dst, const uint8_t *_src[4], int width, int is_be, int32_t *rgb2yuv) +{ + int i; + const float **src = (const float **)_src; + uint16_t *dst = (uint16_t *)_dst; + + for (i = 0; i < width; i++) { + dst[i] = av_clip_uint16(lrintf(65535.0f * rdpx(src[3] + i))); + } +} + +static av_always_inline void planar_rgbf32_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src[4], int width, int is_be, int32_t *rgb2yuv) +{ + int i; + const float **src = (const float **)_src; + uint16_t *dstU = (uint16_t *)_dstU; + uint16_t *dstV = (uint16_t *)_dstV; + int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX]; + int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX]; + int bpc = 16; + int shift = 14; + for (i = 0; i < width; i++) { + int g = av_clip_uint16(lrintf(65535.0f * rdpx(src[0] + i))); + int b = av_clip_uint16(lrintf(65535.0f * rdpx(src[1] + i))); + int r = av_clip_uint16(lrintf(65535.0f * rdpx(src[2] + i))); + + dstU[i] = (ru*r + gu*g + bu*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14); + dstV[i] = (rv*r + gv*g + bv*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14); + } +} + +static av_always_inline void planar_rgbf32_to_y(uint8_t *_dst, const uint8_t *_src[4], int width, int is_be, int32_t *rgb2yuv) +{ + int i; + const float **src = (const float **)_src; + uint16_t *dst = (uint16_t *)_dst; + + int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX]; + int bpc = 16; + int shift = 14; + for (i = 0; i < width; i++) { + int g = av_clip_uint16(lrintf(65535.0f * rdpx(src[0] + i))); + int b = av_clip_uint16(lrintf(65535.0f * rdpx(src[1] + i))); + int r = av_clip_uint16(lrintf(65535.0f * rdpx(src[2] + i))); + + dst[i] = ((ry*r + gy*g + by*b + (33 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14)); + } +} + +#undef rdpx + static av_always_inline void grayf32ToY16_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused) { @@ -1022,6 +1075,26 @@ rgb9plus_planar_transparency_funcs(10) rgb9plus_planar_transparency_funcs(12) rgb9plus_planar_transparency_funcs(16) +#define rgbf32_planar_funcs_endian(endian_name, endian) \ +static void planar_rgbf32##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4], \ + int w, int32_t *rgb2yuv) \ +{ \ + planar_rgbf32_to_y(dst, src, w, endian, rgb2yuv); \ +} \ +static void planar_rgbf32##endian_name##_to_uv(uint8_t *dstU, uint8_t *dstV, \ + const uint8_t *src[4], int w, int32_t *rgb2yuv) \ +{ \ + planar_rgbf32_to_uv(dstU, dstV, src, w, endian, rgb2yuv); \ +} \ +static void planar_rgbf32##endian_name##_to_a(uint8_t *dst, const uint8_t *src[4], \ + int w, int32_t *rgb2yuv) \ +{ \ + planar_rgbf32_to_a(dst, src, w, endian, rgb2yuv); \ +} + +rgbf32_planar_funcs_endian(le, 0) +rgbf32_planar_funcs_endian(be, 1) + av_cold void ff_sws_init_input_funcs(SwsContext *c) { enum AVPixelFormat srcFormat = c->srcFormat; @@ -1070,6 +1143,10 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) case AV_PIX_FMT_GBRP16LE: c->readChrPlanar = planar_rgb16le_to_uv; break; + case AV_PIX_FMT_GBRAPF32LE: + case AV_PIX_FMT_GBRPF32LE: + c->readChrPlanar = planar_rgbf32le_to_uv; + break; case AV_PIX_FMT_GBRP9BE: c->readChrPlanar = planar_rgb9be_to_uv; break; @@ -1088,6 +1165,10 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) case AV_PIX_FMT_GBRP16BE: c->readChrPlanar = planar_rgb16be_to_uv; break; + case AV_PIX_FMT_GBRAPF32BE: + case AV_PIX_FMT_GBRPF32BE: + c->readChrPlanar = planar_rgbf32be_to_uv; + break; case AV_PIX_FMT_GBRAP: case AV_PIX_FMT_GBRP: c->readChrPlanar = planar_rgb_to_uv; @@ -1368,6 +1449,11 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) case AV_PIX_FMT_GBRP16LE: c->readLumPlanar = planar_rgb16le_to_y; break; + case AV_PIX_FMT_GBRAPF32LE: + c->readAlpPlanar = planar_rgbf32le_to_a; + case AV_PIX_FMT_GBRPF32LE: + c->readLumPlanar = planar_rgbf32le_to_y; + break; case AV_PIX_FMT_GBRP9BE: c->readLumPlanar = planar_rgb9be_to_y; break; @@ -1389,6 +1475,11 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) case AV_PIX_FMT_GBRP16BE: c->readLumPlanar = planar_rgb16be_to_y; break; + case AV_PIX_FMT_GBRAPF32BE: + c->readAlpPlanar = planar_rgbf32be_to_a; + case AV_PIX_FMT_GBRPF32BE: + c->readLumPlanar = planar_rgbf32be_to_y; + break; case AV_PIX_FMT_GBRAP: c->readAlpPlanar = planar_rgb_to_a; case AV_PIX_FMT_GBRP: diff --git a/libswscale/utils.c b/libswscale/utils.c index bb3495b990..193efdd881 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -236,6 +236,10 @@ static const FormatEntry format_entries[] = { [AV_PIX_FMT_GBRP14BE] = { 1, 1 }, [AV_PIX_FMT_GBRP16LE] = { 1, 1 }, [AV_PIX_FMT_GBRP16BE] = { 1, 1 }, + [AV_PIX_FMT_GBRPF32LE] = { 1, 0 }, + [AV_PIX_FMT_GBRPF32BE] = { 1, 0 }, + [AV_PIX_FMT_GBRAPF32LE] = { 1, 0 }, + [AV_PIX_FMT_GBRAPF32BE] = { 1, 0 }, [AV_PIX_FMT_GBRAP] = { 1, 1 }, [AV_PIX_FMT_GBRAP16LE] = { 1, 1 }, [AV_PIX_FMT_GBRAP16BE] = { 1, 1 },