From patchwork Sun May 3 23:10:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Reid X-Patchwork-Id: 19476 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 9EA6544B02D for ; Mon, 4 May 2020 02:10:18 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 835D868C2B3; Mon, 4 May 2020 02:10:18 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4A8AB68C257 for ; Mon, 4 May 2020 02:10:11 +0300 (EEST) Received: by mail-pj1-f49.google.com with SMTP id e6so2891317pjt.4 for ; Sun, 03 May 2020 16:10:11 -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=IfJPVYw2Rqh3VQS8UTDDwiKTPsoZyJ5tR85FgXAWtR5/kTyZnjPa2lw2PD+LBK6Msx /iPPu4i/sYoB30fQ3wceHEI29PKMGwWyESKuTL+KUHaXmMgKocg+WQ8lYLj+IsF7kJEQ TKCvsIl8tHhBuevz0L71cjjmkUtbTF5a5UQcwHZmyUuXDM2NQgLC4+5vw4XS5ZidsGyS 0zw6BD2eciwsRf4xHy8CYZAo3puLXTaiEfzC+3rd0MwVLYb2Rbj4U0vKjnAumCzdqCIy KbKfbj0VmQJ8H3/YnlGkO1QT2IHkNaqg5Atgpox2oFgoN8vskEwHWCt+bW/iDko5z5Li OT1w== 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=SJ4X0u4ofjoR/kmzwaDuneg5U0MNIn9SUb0yWQmq25R5xnG3wqBfYJNMvwmmQj/HvY DrsEl9lpkopBKLX8sYiR/6/i/M7kVR3Puiupt1AQG8S71LeOavRtz1QNJGvSLysH1qvb XIrVYWv/wRBqmX7YpknACjGe7EHq5HU8KllGt3kvQ4dD46OwbASZdvhGAbQoBpufAjwg WrpWq6liAkKoD+2BxxxQiMgTrgiYv6SobO0A5mMdz9fV9qSgAtkQloELckwz5WnnB+nT HU6Abn0HVpBPLBKH+JXI+T+oTo2pMYH3T0bsQQu6V7+Exm/CtiqvlKc5QVnkzloaYneb 8LEA== X-Gm-Message-State: AGi0PuZc8F6+I/Qq85lo1/zw2YWpgp685ee9ZTCxaJnoYjchGyDjex6C GYM4oH07xervxMSLvH95cclPMY+T X-Google-Smtp-Source: APiQypIF+V/vmj/EZUdN7J0g3okNyNzhyB3YaSIiNwb6dIoGGho1JCpt6bu3hUG7nEz3c1SAD2WEtg== X-Received: by 2002:a17:902:8d8d:: with SMTP id v13mr15357808plo.67.1588547408891; Sun, 03 May 2020 16:10:08 -0700 (PDT) Received: from marks-macbook.hitronhub.home (S01069050ca607903.vc.shawcable.net. [174.7.236.190]) by smtp.gmail.com with ESMTPSA id 30sm6400601pgp.38.2020.05.03.16.10.08 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 03 May 2020 16:10:08 -0700 (PDT) From: mindmark@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 May 2020 16:10:03 -0700 Message-Id: <20200503231004.47636-2-mindmark@gmail.com> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200503231004.47636-1-mindmark@gmail.com> References: <20200503231004.47636-1-mindmark@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 1/2] 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 },