tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

butteraugli_test.cc (3807B)


      1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style
      4 // license that can be found in the LICENSE file.
      5 
      6 #include "lib/jxl/butteraugli/butteraugli.h"
      7 
      8 #include <jxl/memory_manager.h>
      9 #include <jxl/types.h>
     10 
     11 #include <algorithm>
     12 #include <cstddef>
     13 #include <cstdint>
     14 #include <utility>
     15 
     16 #include "lib/extras/metrics.h"
     17 #include "lib/extras/packed_image.h"
     18 #include "lib/jxl/base/random.h"
     19 #include "lib/jxl/base/status.h"
     20 #include "lib/jxl/enc_external_image.h"
     21 #include "lib/jxl/image.h"
     22 #include "lib/jxl/image_ops.h"
     23 #include "lib/jxl/test_image.h"
     24 #include "lib/jxl/test_memory_manager.h"
     25 #include "lib/jxl/test_utils.h"
     26 #include "lib/jxl/testing.h"
     27 
     28 namespace jxl {
     29 namespace {
     30 
     31 using ::jxl::extras::PackedImage;
     32 using ::jxl::extras::PackedPixelFile;
     33 using ::jxl::test::GetColorImage;
     34 using ::jxl::test::TestImage;
     35 
     36 Image3F SinglePixelImage(float red, float green, float blue) {
     37  JxlMemoryManager* memory_manager = jxl::test::MemoryManager();
     38  JXL_TEST_ASSIGN_OR_DIE(Image3F img, Image3F::Create(memory_manager, 1, 1));
     39  img.PlaneRow(0, 0)[0] = red;
     40  img.PlaneRow(1, 0)[0] = green;
     41  img.PlaneRow(2, 0)[0] = blue;
     42  return img;
     43 }
     44 
     45 void AddUniformNoise(Image3F* img, float d, uint64_t seed) {
     46  Rng generator(seed);
     47  for (size_t y = 0; y < img->ysize(); ++y) {
     48    for (int c = 0; c < 3; ++c) {
     49      for (size_t x = 0; x < img->xsize(); ++x) {
     50        img->PlaneRow(c, y)[x] += generator.UniformF(-d, d);
     51      }
     52    }
     53  }
     54 }
     55 
     56 void AddEdge(Image3F* img, float d, size_t x0, size_t y0) {
     57  const size_t h = std::min<size_t>(img->ysize() - y0, 100);
     58  const size_t w = std::min<size_t>(img->xsize() - x0, 5);
     59  for (size_t dy = 0; dy < h; ++dy) {
     60    for (size_t dx = 0; dx < w; ++dx) {
     61      img->PlaneRow(1, y0 + dy)[x0 + dx] += d;
     62    }
     63  }
     64 }
     65 
     66 TEST(ButteraugliInPlaceTest, SinglePixel) {
     67  Image3F rgb0 = SinglePixelImage(0.5f, 0.5f, 0.5f);
     68  Image3F rgb1 = SinglePixelImage(0.5f, 0.49f, 0.5f);
     69  ButteraugliParams butteraugli_params;
     70  ImageF diffmap;
     71  double diffval;
     72  EXPECT_TRUE(
     73      ButteraugliInterface(rgb0, rgb1, butteraugli_params, diffmap, diffval));
     74  EXPECT_NEAR(diffval, 2.5, 0.5);
     75  ImageF diffmap2;
     76  double diffval2;
     77  EXPECT_TRUE(ButteraugliInterfaceInPlace(std::move(rgb0), std::move(rgb1),
     78                                          butteraugli_params, diffmap2,
     79                                          diffval2));
     80  EXPECT_NEAR(diffval, diffval2, 1e-10);
     81 }
     82 
     83 TEST(ButteraugliInPlaceTest, LargeImage) {
     84  JxlMemoryManager* memory_manager = jxl::test::MemoryManager();
     85  const size_t xsize = 1024;
     86  const size_t ysize = 1024;
     87  TestImage img;
     88  ASSERT_TRUE(img.SetDimensions(xsize, ysize));
     89  JXL_TEST_ASSIGN_OR_DIE(auto frame, img.AddFrame());
     90  frame.RandomFill(777);
     91  JXL_TEST_ASSIGN_OR_DIE(Image3F rgb0, GetColorImage(img.ppf()));
     92  JXL_TEST_ASSIGN_OR_DIE(Image3F rgb1,
     93                         Image3F::Create(memory_manager, xsize, ysize));
     94  ASSERT_TRUE(CopyImageTo(rgb0, &rgb1));
     95  AddUniformNoise(&rgb1, 0.02f, 7777);
     96  AddEdge(&rgb1, 0.1f, xsize / 2, xsize / 2);
     97  ButteraugliParams butteraugli_params;
     98  ImageF diffmap;
     99  double diffval;
    100  EXPECT_TRUE(
    101      ButteraugliInterface(rgb0, rgb1, butteraugli_params, diffmap, diffval));
    102  double distp = ComputeDistanceP(diffmap, butteraugli_params, 3.0);
    103  EXPECT_NEAR(diffval, 4.0, 0.5);
    104  EXPECT_NEAR(distp, 1.5, 0.5);
    105  ImageF diffmap2;
    106  double diffval2;
    107  EXPECT_TRUE(ButteraugliInterfaceInPlace(std::move(rgb0), std::move(rgb1),
    108                                          butteraugli_params, diffmap2,
    109                                          diffval2));
    110  double distp2 = ComputeDistanceP(diffmap2, butteraugli_params, 3.0);
    111  EXPECT_NEAR(diffval, diffval2, 5e-7);
    112  EXPECT_NEAR(distp, distp2, 1e-7);
    113 }
    114 
    115 }  // namespace
    116 }  // namespace jxl