From patchwork Tue Sep 29 03:44: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: 22653 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 16EA9448617 for ; Tue, 29 Sep 2020 06:44:53 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DDED06882F0; Tue, 29 Sep 2020 06:44:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0C6D06881E6 for ; Tue, 29 Sep 2020 06:44:46 +0300 (EEST) Received: by mail-pj1-f48.google.com with SMTP id b17so1922790pji.1 for ; Mon, 28 Sep 2020 20:44: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:mime-version :content-transfer-encoding; bh=W7sSmVASBucMed2D7BS4rYVC2vJCK18l73uaNWTiPSU=; b=L8q2zRKHH1KCSp5HUPkJSe95lbF9jJGevooULX77Zjp3TRmGUkHXPZ245cuHqWDggX 90IRK4/LHmGB3Cx7Tk5VrQdWk9PEKZ2GZSJD0mbqesXyZewNOqbUMWD72T1JZMwdp554 nHgE9X/f5U5XQsiic8VTClZnUj2EizDKeWsUV8HtQz/2Ci6dP7asS1whEVlYgdypLeIJ 4H2vUb8UwU2po+exQv0Ib7hyKjzxRqxqpW4pWgvE6aGtN5rJIMP8X4k7dG4VHUuNx0ZJ tY9jL8ceoqAAY2TbnbboYCLeLxu64JDuyr3QBsYRjSOx/mBNnBZRDp9c4KF2AunDVPG5 83Bg== 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:mime-version :content-transfer-encoding; bh=W7sSmVASBucMed2D7BS4rYVC2vJCK18l73uaNWTiPSU=; b=NLayeWN0GFMe5temecXEDpIg4cr4vWbHGGfMc81VluQ//S42rURVs2JCpMOI0Ie67i 6IgM5JoPHIKHHkoB+zImo3+JCE00Hi06oE44cFL2Z6SjW5li65Xz1U2LfZJjbvuJ9k2z w/85QW06ewhAr052Y4lT6EKgkx4uYm/s6/McPSe6SwnPP+EKb48cyET21asmAhXbeste yv22xN1f0/+ncDiR7vN6pjs2OLkiaQPNzlwb+3I2L43oTIWDoLTvSde3LhdM0OYS7OoQ ZNXTia0BbWLnKYvY4WsLnEIVn9eiwifmhjpOVWv4E2QORjtWF9VmrG8ZsC5sJYpjqAON KeJw== X-Gm-Message-State: AOAM530pLKLLrS/tv/ff447/lWxY7PQIYCNaueSycLqAoSQ50HeNpXw7 pZsHQlm3khyHXbSn1JHuGwTn9OIyYeo= X-Google-Smtp-Source: ABdhPJwfBBLlpO/yCbx3XyIeh4IysKd4pAooLTcyChOULPIrocx0PhzdUubap251fuP0sLuA1HA1dA== X-Received: by 2002:a17:90b:4b8b:: with SMTP id lr11mr1946278pjb.218.1601351083625; Mon, 28 Sep 2020 20:44:43 -0700 (PDT) Received: from localhost.localdomain (S01069050ca607903.vc.shawcable.net. [174.7.236.190]) by smtp.gmail.com with ESMTPSA id z23sm3315927pfj.177.2020.09.28.20.44.42 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Sep 2020 20:44:43 -0700 (PDT) From: mindmark@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 28 Sep 2020 20:44:33 -0700 Message-Id: <20200929034434.59110-1-mindmark@gmail.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 1/2] libswscale/tests: add floatimg_cmp test 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 changes since v1: - made into fate test - fixed c90 warnings - tests more intermediate formats - tested on BE mips too --- libswscale/Makefile | 1 + libswscale/tests/.gitignore | 1 + libswscale/tests/floatimg_cmp.c | 296 ++++++++++++++++++++++++++++++++ tests/fate/libswscale.mak | 4 + tests/ref/fate/sws-floatimg-cmp | 120 +++++++++++++ 5 files changed, 422 insertions(+) create mode 100644 libswscale/tests/floatimg_cmp.c create mode 100644 tests/ref/fate/sws-floatimg-cmp diff --git a/libswscale/Makefile b/libswscale/Makefile index 5e03e6fa0a..4b8f9de425 100644 --- a/libswscale/Makefile +++ b/libswscale/Makefile @@ -25,5 +25,6 @@ OBJS-$(CONFIG_SHARED) += log2_tab.o SLIBOBJS-$(HAVE_GNU_WINDRES) += swscaleres.o TESTPROGS = colorspace \ + floatimg_cmp \ pixdesc_query \ swscale \ diff --git a/libswscale/tests/.gitignore b/libswscale/tests/.gitignore index 1a26f038c4..c56abf0ee7 100644 --- a/libswscale/tests/.gitignore +++ b/libswscale/tests/.gitignore @@ -1,3 +1,4 @@ /colorspace +/floatimg_cmp /pixdesc_query /swscale diff --git a/libswscale/tests/floatimg_cmp.c b/libswscale/tests/floatimg_cmp.c new file mode 100644 index 0000000000..5c67594fb6 --- /dev/null +++ b/libswscale/tests/floatimg_cmp.c @@ -0,0 +1,296 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include + +#include "libavutil/avutil.h" +#include "libavutil/imgutils.h" +#include "libavutil/intfloat.h" +#include "libavutil/intreadwrite.h" +#include "libavutil/lfg.h" +#include "libavutil/mem.h" +#include "libavutil/parseutils.h" +#include "libavutil/pixdesc.h" + +#include "libswscale/swscale.h" + +#define DEFAULT_W 96 +#define DEFAULT_H 96 + +static const enum AVPixelFormat pix_fmts[] = { + AV_PIX_FMT_YUV444P16LE, + AV_PIX_FMT_YUV444P, + AV_PIX_FMT_YUV444P9LE, AV_PIX_FMT_YUV444P10LE, + AV_PIX_FMT_YUV444P12LE, AV_PIX_FMT_YUV444P14LE, + AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24, + AV_PIX_FMT_RGBA, AV_PIX_FMT_BGRA, + AV_PIX_FMT_ARGB, AV_PIX_FMT_ABGR, + AV_PIX_FMT_0RGB, AV_PIX_FMT_0BGR, + AV_PIX_FMT_RGB0, AV_PIX_FMT_BGR0, + AV_PIX_FMT_RGB48LE, AV_PIX_FMT_BGR48LE, + AV_PIX_FMT_RGBA64LE, AV_PIX_FMT_BGRA64LE, + AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP, + AV_PIX_FMT_GBRP9LE, + AV_PIX_FMT_GBRP10LE, AV_PIX_FMT_GBRAP10LE, + AV_PIX_FMT_GBRP12LE, AV_PIX_FMT_GBRAP12LE, + AV_PIX_FMT_GBRP14LE, + AV_PIX_FMT_GBRP16LE, AV_PIX_FMT_GBRAP16LE +}; + +const char *usage = "floatimg_cmp -pixel_format -size -ref \n"; + +int main(int argc, char **argv) +{ + enum AVPixelFormat inFormat = AV_PIX_FMT_NONE; + enum AVPixelFormat dstFormat = AV_PIX_FMT_NONE; + const AVPixFmtDescriptor *desc; + uint8_t *ptr; + uint32_t *in, *out; + + uint8_t *rgbIn[4] = {NULL, NULL, NULL, NULL}; + uint8_t *rgbOut[4] = {NULL, NULL, NULL, NULL}; + int rgbStride[4]; + + uint8_t *dst[4] = {NULL, NULL, NULL, NULL}; + int dstStride[4]; + + int i, x, y, p, size, count; + int res = -1; + int w = -1; + int h = -1; + union av_intfloat32 v0, v1; + + double sum; + float minimum, maximum, diff; + + struct SwsContext *sws = NULL; + AVLFG rand; + FILE *fp = NULL; + + for (i = 1; i < argc; i += 2) { + if (argv[i][0] != '-' || i + 1 == argc) + goto bad_option; + if (!strcmp(argv[i], "-ref")) { + fp = fopen(argv[i + 1], "rb"); + if (!fp) { + fprintf(stderr, "could not open '%s'\n", argv[i + 1]); + goto end; + } + } else if (!strcmp(argv[i], "-size")) { + res = av_parse_video_size(&w, &h, argv[i + 1]); + if (res < 0) { + fprintf(stderr, "invalid video size %s\n", argv[i + 1]); + goto end; + } + } else if (!strcmp(argv[i], "-pixel_format")) { + inFormat = av_get_pix_fmt(argv[i + 1]); + if (inFormat == AV_PIX_FMT_NONE) { + fprintf(stderr, "invalid pixel format %s\n", argv[i + 1]); + goto end; + } + } else { +bad_option: + fprintf(stderr, "%s", usage); + fprintf(stderr, "bad option or argument missing (%s)\n", argv[i]); + goto end; + }; + } + + if (!fp) { + inFormat = AV_PIX_FMT_GBRPF32LE; + w = DEFAULT_W; + h = DEFAULT_H; + } + + if (w <= 0 || h <= 0) { + fprintf(stderr, "%s", usage); + fprintf(stderr, "invalid -video_size\n"); + goto end; + } + + if (inFormat == AV_PIX_FMT_NONE) { + fprintf(stderr, "%s", usage); + fprintf(stderr, "invalid input pixel format\n"); + goto end; + } + + desc = av_pix_fmt_desc_get(inFormat); + if (!(desc->flags & AV_PIX_FMT_FLAG_FLOAT)) { + fprintf(stderr, "input pixel format not floating point.\n"); + goto end; + } + + res = av_image_fill_linesizes(rgbStride, inFormat, w); + if (res < 0) { + fprintf(stderr, "av_image_fill_linesizes failed\n"); + goto end; + } + for (p = 0; p < 4; p++) { + rgbStride[p] = FFALIGN(rgbStride[p], 16); + if (rgbStride[p]) { + rgbIn[p] = av_mallocz(rgbStride[p] * h + 16); + rgbOut[p] = av_mallocz(rgbStride[p] * h + 16); + } + if (rgbStride[p] && (!rgbIn[p] || !rgbOut[p])) { + goto end; + } + } + + for (i = 0; i < FF_ARRAY_ELEMS(pix_fmts); i++) { + dstFormat = pix_fmts[i]; + if (fp) { + fseek(fp, 0, SEEK_SET); + for (p = 0; p < 4; p++) { + if (!rgbStride[p]) + continue; + + ptr = rgbIn[p]; + for (y = 0; y < h; y++) { + size = fread(ptr, 1, w*4, fp); + if (size != w*4) { + fprintf(stderr, "read error: %d\n", size); + goto end; + } + ptr += rgbStride[p]; + } + } + } else { + // fill src with random values between 0.0 - 1.0 + av_lfg_init(&rand, 1); + for (p = 0; p < 4; p++) { + if (!rgbStride[p]) + continue; + + for (y = 0; y < h; y++) { + in = (uint32_t*)(rgbIn[p] + y * rgbStride[p]); + for (x = 0; x < w; x++) { + v0.f = (float)av_lfg_get(&rand)/(float)(UINT32_MAX); + *in++ = AV_RL32(&v0.i); + } + } + } + } + + // setup intermediate image + for (p = 0; p < 4; p++) { + av_freep(&dst[p]); + } + + res = av_image_fill_linesizes(dstStride, dstFormat, w); + if (res < 0) { + fprintf(stderr, "av_image_fill_linesizes failed\n"); + goto end; + } + for (p = 0; p < 4; p++) { + dstStride[p] = FFALIGN(dstStride[p], 16); + if (dstStride[p]) { + dst[p] = av_mallocz(dstStride[p] * h + 16); + } + if (dstStride[p] && !dst[p]) { + goto end; + } + } + + // srcFormat -> dstFormat + sws = sws_getContext(w, h, inFormat, w, h, + dstFormat, SWS_BILINEAR, NULL, NULL, NULL); + if (!sws) { + fprintf(stderr, "Failed to get %s -> %s\n", av_get_pix_fmt_name(inFormat), av_get_pix_fmt_name(dstFormat) ); + goto end; + } + + res = sws_scale(sws, (const uint8_t *const *)rgbIn, rgbStride, 0, h, dst, dstStride); + if (res < 0 || res != h) { + fprintf(stderr, "sws_scale failed\n"); + res = -1; + goto end; + } + sws_freeContext(sws); + + // dstFormat -> srcFormat + sws = sws_getContext(w, h, dstFormat, w, h, + inFormat, SWS_BILINEAR, NULL, NULL, NULL); + if(!sws) { + fprintf(stderr, "Failed to get %s -> %s\n", av_get_pix_fmt_name(dstFormat), av_get_pix_fmt_name(inFormat) ); + goto end; + } + + res = sws_scale(sws, (const uint8_t *const *)dst, dstStride, 0, h, rgbOut, rgbStride); + if (res < 0 || res != h) { + fprintf(stderr, "sws_scale failed\n"); + res = -1; + goto end; + } + sws_freeContext(sws); + sws = NULL; + + minimum = FLT_MAX; + maximum = -FLT_MAX; + count = 0; + sum = 0.0; + + for (p = 0; p < 4; p++) { + if (!rgbStride[p]) + continue; + + for (y = 0; y < h; y++) { + in = (uint32_t*)(rgbIn[p] + y * rgbStride[p]); + out = (uint32_t*)(rgbOut[p] + y * rgbStride[p]); + for (x = 0; x < w; x++) { + if (desc->flags & AV_PIX_FMT_FLAG_BE) { + v0.i = AV_RB32(in); + v1.i = AV_RB32(out); + } else { + v0.i = AV_RL32(in); + v1.i = AV_RL32(out); + } + + diff = fabsf(v0.f - v1.f); + sum += diff; + minimum = FFMIN(minimum, diff); + maximum = FFMAX(maximum, diff); + + count++; + in++; + out++; + } + } + } + + fprintf(stdout, "%s -> %s -> %s\n", av_get_pix_fmt_name(inFormat), av_get_pix_fmt_name(dstFormat), av_get_pix_fmt_name(inFormat) ); + fprintf(stdout, "avg diff: %f\nmin diff: %f\nmax diff: %f\n", sum / count, minimum, maximum); + res = 0; + } + +end: + sws_freeContext(sws); + for (p = 0; p < 4; p++) { + av_freep(&rgbIn[p]); + av_freep(&rgbOut[p]); + av_freep(&dst[p]); + } + if (fp) + fclose(fp); + + return res; +} diff --git a/tests/fate/libswscale.mak b/tests/fate/libswscale.mak index 68eb159fec..5ec5f34cc4 100644 --- a/tests/fate/libswscale.mak +++ b/tests/fate/libswscale.mak @@ -2,6 +2,10 @@ FATE_LIBSWSCALE += fate-sws-pixdesc-query fate-sws-pixdesc-query: libswscale/tests/pixdesc_query$(EXESUF) fate-sws-pixdesc-query: CMD = run libswscale/tests/pixdesc_query$(EXESUF) +FATE_LIBSWSCALE += fate-sws-floatimg-cmp +fate-sws-floatimg-cmp: libswscale/tests/floatimg_cmp$(EXESUF) +fate-sws-floatimg-cmp: CMD = run libswscale/tests/floatimg_cmp$(EXESUF) + FATE_LIBSWSCALE += $(FATE_LIBSWSCALE-yes) FATE-$(CONFIG_SWSCALE) += $(FATE_LIBSWSCALE) fate-libswscale: $(FATE_LIBSWSCALE) diff --git a/tests/ref/fate/sws-floatimg-cmp b/tests/ref/fate/sws-floatimg-cmp new file mode 100644 index 0000000000..24204254c4 --- /dev/null +++ b/tests/ref/fate/sws-floatimg-cmp @@ -0,0 +1,120 @@ +gbrpf32le -> yuv444p16le -> gbrpf32le +avg diff: 0.003852 +min diff: 0.000000 +max diff: 0.006638 +gbrpf32le -> yuv444p -> gbrpf32le +avg diff: 0.004316 +min diff: 0.000000 +max diff: 0.012704 +gbrpf32le -> yuv444p9le -> gbrpf32le +avg diff: 0.004053 +min diff: 0.000001 +max diff: 0.009402 +gbrpf32le -> yuv444p10le -> gbrpf32le +avg diff: 0.003960 +min diff: 0.000000 +max diff: 0.008123 +gbrpf32le -> yuv444p12le -> gbrpf32le +avg diff: 0.003878 +min diff: 0.000000 +max diff: 0.007011 +gbrpf32le -> yuv444p14le -> gbrpf32le +avg diff: 0.003868 +min diff: 0.000000 +max diff: 0.006729 +gbrpf32le -> rgb24 -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> bgr24 -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> rgba -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> bgra -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> argb -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> abgr -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> 0rgb -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> 0bgr -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> rgb0 -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> bgr0 -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> rgb48le -> gbrpf32le +avg diff: 0.003851 +min diff: 0.000000 +max diff: 0.007076 +gbrpf32le -> bgr48le -> gbrpf32le +avg diff: 0.003851 +min diff: 0.000000 +max diff: 0.007076 +gbrpf32le -> rgba64le -> gbrpf32le +avg diff: 0.003851 +min diff: 0.000000 +max diff: 0.007076 +gbrpf32le -> bgra64le -> gbrpf32le +avg diff: 0.003851 +min diff: 0.000000 +max diff: 0.007076 +gbrpf32le -> gbrp -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> gbrap -> gbrpf32le +avg diff: 0.004122 +min diff: 0.000000 +max diff: 0.008975 +gbrpf32le -> gbrp9le -> gbrpf32le +avg diff: 0.007737 +min diff: 0.000000 +max diff: 0.014009 +gbrpf32le -> gbrp10le -> gbrpf32le +avg diff: 0.007662 +min diff: 0.000000 +max diff: 0.013605 +gbrpf32le -> gbrap10le -> gbrpf32le +avg diff: 0.007662 +min diff: 0.000000 +max diff: 0.013605 +gbrpf32le -> gbrp12le -> gbrpf32le +avg diff: 0.007622 +min diff: 0.000000 +max diff: 0.013335 +gbrpf32le -> gbrap12le -> gbrpf32le +avg diff: 0.007622 +min diff: 0.000000 +max diff: 0.013335 +gbrpf32le -> gbrp14le -> gbrpf32le +avg diff: 0.007620 +min diff: 0.000000 +max diff: 0.013232 +gbrpf32le -> gbrp16le -> gbrpf32le +avg diff: 0.007680 +min diff: 0.000000 +max diff: 0.013275 +gbrpf32le -> gbrap16le -> gbrpf32le +avg diff: 0.007680 +min diff: 0.000000 +max diff: 0.013275 From patchwork Tue Sep 29 03:44:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Reid X-Patchwork-Id: 22654 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 56E51448617 for ; Tue, 29 Sep 2020 06:44:55 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3ADBE6882E8; Tue, 29 Sep 2020 06:44:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f193.google.com (mail-pg1-f193.google.com [209.85.215.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E9EF1688179 for ; Tue, 29 Sep 2020 06:44:46 +0300 (EEST) Received: by mail-pg1-f193.google.com with SMTP id x16so2758668pgj.3 for ; Mon, 28 Sep 2020 20:44:46 -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=Giuyjx5K1l+eBtWHu1vhuiX/iVK8rpXC+M35qj24xXo=; b=e8GtM14SIDupNcB+ZlBml+265uUz5u9QqRGUH/RDRno9VJZOux0bKvDOY3mZCBQitG 2J/S1WSFNu2mEFncp/CvwOSjpokOEeAHAepkVER+7g4MhNtgLAYCtIsqEbhWewsRPBAV RhKrb9nW1GeD3PVieqqi2f8sn7vKPc5I0e/24QQ7d9fNN2KLWAC9VBhnydVrnCnLX6bi N6zff4JsdvAl7GJcNc8Dai1/5RCY53phHB57ZrQdPBQvipb9gjvuLI8AmNoGJcr17MOv iRuWvW5iOgDQg3DQm1T8JKR86J1FeOmyZq0xTW5IZqAeLRUJxK+bp1kBD1fmEdfOlCeN SALg== 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=Giuyjx5K1l+eBtWHu1vhuiX/iVK8rpXC+M35qj24xXo=; b=AJJvsCnQyH6bqKwOlkiLBEYFKnwzds6k9vGlpEekO//Z0rm+2U/q9RoWj7PzwOvJAk SumV/fnmWyriMliO/nlkqOW8lSQtb6TvfxjWYhe5FE1wPcF7x4IBEHjiajyFAGDb5S25 PjD4P5eIZ2Sg6qGLXdNJqnh80fejayEIG5RGQddDNtWqWfKDQSgouu59KLQf4LDiAqA6 OSzvxCmWsPzD9SuBZbdCmgXpkrvqlz/mGsySfTYjCT3DbV5282eQLWxCawc8soxYaiff sk1gNuNIHqai+amBYcFJ/qrfpZh/gYAHNQnKN7jaihe/Vc803fb9gOE+zJIX78ytpz31 x3Qw== X-Gm-Message-State: AOAM5325YggCnVUfsY/69272G/l0NkTwn9w3EHdGmn9Ghoq1s7sZZJbJ /7DMHNBn6FnOKTcOEhmHirtzRs7TokE= X-Google-Smtp-Source: ABdhPJyimQ0g93Z3mTeKDOAXreDbtYvtVInI1lVIS6E/mWlkh5Kb5ypQYAimJiqhVK2ucAK3+/YhMg== X-Received: by 2002:a17:902:c403:b029:d2:83e9:8f8c with SMTP id k3-20020a170902c403b02900d283e98f8cmr2601422plk.80.1601351084504; Mon, 28 Sep 2020 20:44:44 -0700 (PDT) Received: from localhost.localdomain (S01069050ca607903.vc.shawcable.net. [174.7.236.190]) by smtp.gmail.com with ESMTPSA id z23sm3315927pfj.177.2020.09.28.20.44.43 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Sep 2020 20:44:43 -0700 (PDT) From: mindmark@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 28 Sep 2020 20:44:34 -0700 Message-Id: <20200929034434.59110-2-mindmark@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200929034434.59110-1-mindmark@gmail.com> References: <20200929034434.59110-1-mindmark@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 2/2] libswcale/input: use more accurate rgbf32 yuv conversions 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 | 12 ++- tests/ref/fate/filter-pixfmts-scale | 8 +- tests/ref/fate/sws-floatimg-cmp | 122 ++++++++++++++-------------- 3 files changed, 70 insertions(+), 72 deletions(-) diff --git a/libswscale/input.c b/libswscale/input.c index 064ed5902f..67a85b0418 100644 --- a/libswscale/input.c +++ b/libswscale/input.c @@ -984,15 +984,14 @@ static av_always_inline void planar_rgbf32_to_uv(uint8_t *_dstU, uint8_t *_dstV, 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); + dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT; + dstV[i] = (rv*r + gv*g + bv*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT; } } @@ -1003,14 +1002,13 @@ static av_always_inline void planar_rgbf32_to_y(uint8_t *_dst, const uint8_t *_s 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)); + dst[i] = (ry*r + gy*g + by*b + (0x2001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT; } } diff --git a/tests/ref/fate/filter-pixfmts-scale b/tests/ref/fate/filter-pixfmts-scale index d7020ad2c3..30e7cd5b06 100644 --- a/tests/ref/fate/filter-pixfmts-scale +++ b/tests/ref/fate/filter-pixfmts-scale @@ -25,8 +25,8 @@ gbrap12be 1d9b57766ba9c2192403f43967cb9af0 gbrap12le bb1ba1c157717db3dd612a76d38a018e gbrap16be c72b935a6e57a8e1c37bff08c2db55b1 gbrap16le 13eb0e62b1ac9c1c86c81521eaefab5f -gbrapf32be 42e53d9edccbd9e09c4cd78780ba92f3 -gbrapf32le eebf3973ef94c841f0a1ceb1ed61621d +gbrapf32be 366b804d5697276e8c481c4bdf05a00b +gbrapf32le 558a268e6d6b907449d1056afab78f29 gbrp dc3387f925f972c61aae7eb23cdc19f0 gbrp10be 0277d4c3a8498d75e2783fb81379e481 gbrp10le f3d70f8ab845c3c9b8f7452e4a6e285a @@ -38,8 +38,8 @@ gbrp16be 5fc826cfabebfc1442cb793c4b6303e2 gbrp16le 1b3e0b63d47a3e1b6b20931316883bf2 gbrp9be d9c88968001e1452ff31fbc8d16b18a0 gbrp9le 2ccfed0816bf6bd4bb3a5b7591d9603a -gbrpf32be 4614d32e4417f80e0adcc1bdcf6cde42 -gbrpf32le 1366ee77e5559672260bbe51040e28b2 +gbrpf32be f3d0cefdf11c861001880772d817aac8 +gbrpf32le 290468205c1c18a0667edfca45061aee gray 221201cc7cfc4964eacd8b3e426fd276 gray10be 9452756d0b37f4f5c7cae7635e22d747 gray10le 37fd2e1ec6b66410212d39a342e864df diff --git a/tests/ref/fate/sws-floatimg-cmp b/tests/ref/fate/sws-floatimg-cmp index 24204254c4..cf6788fc23 100644 --- a/tests/ref/fate/sws-floatimg-cmp +++ b/tests/ref/fate/sws-floatimg-cmp @@ -1,120 +1,120 @@ gbrpf32le -> yuv444p16le -> gbrpf32le -avg diff: 0.003852 +avg diff: 0.000125 min diff: 0.000000 -max diff: 0.006638 +max diff: 0.000501 gbrpf32le -> yuv444p -> gbrpf32le -avg diff: 0.004316 +avg diff: 0.001804 min diff: 0.000000 -max diff: 0.012704 +max diff: 0.006399 gbrpf32le -> yuv444p9le -> gbrpf32le -avg diff: 0.004053 -min diff: 0.000001 -max diff: 0.009402 +avg diff: 0.000906 +min diff: 0.000000 +max diff: 0.003313 gbrpf32le -> yuv444p10le -> gbrpf32le -avg diff: 0.003960 +avg diff: 0.000467 min diff: 0.000000 -max diff: 0.008123 +max diff: 0.001912 gbrpf32le -> yuv444p12le -> gbrpf32le -avg diff: 0.003878 +avg diff: 0.000166 min diff: 0.000000 -max diff: 0.007011 +max diff: 0.000802 gbrpf32le -> yuv444p14le -> gbrpf32le -avg diff: 0.003868 +avg diff: 0.000127 min diff: 0.000000 -max diff: 0.006729 +max diff: 0.000524 gbrpf32le -> rgb24 -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> bgr24 -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> rgba -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> bgra -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> argb -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> abgr -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> 0rgb -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> 0bgr -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> rgb0 -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> bgr0 -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> rgb48le -> gbrpf32le -avg diff: 0.003851 +avg diff: 0.000249 min diff: 0.000000 -max diff: 0.007076 +max diff: 0.000990 gbrpf32le -> bgr48le -> gbrpf32le -avg diff: 0.003851 +avg diff: 0.000249 min diff: 0.000000 -max diff: 0.007076 +max diff: 0.000990 gbrpf32le -> rgba64le -> gbrpf32le -avg diff: 0.003851 +avg diff: 0.000249 min diff: 0.000000 -max diff: 0.007076 +max diff: 0.000990 gbrpf32le -> bgra64le -> gbrpf32le -avg diff: 0.003851 +avg diff: 0.000249 min diff: 0.000000 -max diff: 0.007076 +max diff: 0.000990 gbrpf32le -> gbrp -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> gbrap -> gbrpf32le -avg diff: 0.004122 +avg diff: 0.001011 min diff: 0.000000 -max diff: 0.008975 +max diff: 0.004229 gbrpf32le -> gbrp9le -> gbrpf32le -avg diff: 0.007737 +avg diff: 0.003917 min diff: 0.000000 -max diff: 0.014009 +max diff: 0.007870 gbrpf32le -> gbrp10le -> gbrpf32le -avg diff: 0.007662 +avg diff: 0.003841 min diff: 0.000000 -max diff: 0.013605 +max diff: 0.007456 gbrpf32le -> gbrap10le -> gbrpf32le -avg diff: 0.007662 +avg diff: 0.003841 min diff: 0.000000 -max diff: 0.013605 +max diff: 0.007456 gbrpf32le -> gbrp12le -> gbrpf32le -avg diff: 0.007622 +avg diff: 0.003796 min diff: 0.000000 -max diff: 0.013335 +max diff: 0.007140 gbrpf32le -> gbrap12le -> gbrpf32le -avg diff: 0.007622 +avg diff: 0.003796 min diff: 0.000000 -max diff: 0.013335 +max diff: 0.007140 gbrpf32le -> gbrp14le -> gbrpf32le -avg diff: 0.007620 +avg diff: 0.003792 min diff: 0.000000 -max diff: 0.013232 +max diff: 0.007034 gbrpf32le -> gbrp16le -> gbrpf32le -avg diff: 0.007680 +avg diff: 0.003853 min diff: 0.000000 -max diff: 0.013275 +max diff: 0.007098 gbrpf32le -> gbrap16le -> gbrpf32le -avg diff: 0.007680 +avg diff: 0.003853 min diff: 0.000000 -max diff: 0.013275 +max diff: 0.007098