/*
 * Copyright (c) 2018, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 */

#include <stdbool.h>
#include <memory>
#include <tuple>
#include "aom_mem/aom_mem.h"
#include "av1/encoder/rdopt.h"
#include "test/util.h"
#include "third_party/googletest/src/googletest/include/gtest/gtest.h"

namespace {

using std::get;
using std::tuple;

static int get_pix(uint8_t *buf, int i, bool high_bd) {
  if (high_bd) {
    return *CONVERT_TO_SHORTPTR(buf + i);
  } else {
    return buf[i];
  }
}

/** Get the (i, j) value from the input; if i or j is outside of the width
 * or height, the nearest pixel value is returned.
 */
static int get_nearest_pix(const int *buf, int w, int h, int i, int j) {
  int offset = AOMMAX(AOMMIN(i, w - 1), 0) + w * AOMMAX(AOMMIN(j, h - 1), 0);
  return buf[offset];
}

/** Given the image data, creates a new image with padded values, so an
 * 8-tap filter can be convolved. The padded value is the same as the closest
 * value in the image. Returns a pointer to the start of the image in the
 * padded data. Must be freed with free_pad_8tap. The output will be either
 * 8-bit or 16-bit, depending on the high bit-depth (high_bd) field.
 */
static uint8_t *pad_8tap_convolve(const int *data, int w, int h, bool high_bd) {
  // SIMD optimizations require the width to be a multiple of 8 and the height
  // to be multiples of 4.
  assert(w % 8 == 0);
  assert(h % 4 == 0);
  // For an 8-tap filter, we need to pad with 3 lines on top and on the left,
  // and 4 lines on the right and bottom, for 7 extra lines.
  const int pad_w = w + 7;
  const int pad_h = h + 7;

  uint8_t *dst;
  if (high_bd) {
    dst =
        CONVERT_TO_BYTEPTR(aom_memalign(32, sizeof(uint16_t) * pad_w * pad_h));
  } else {
    dst = (uint8_t *)aom_memalign(32, sizeof(uint8_t) * pad_w * pad_h);
  }
  if (dst == nullptr) {
    EXPECT_NE(dst, nullptr);
    return nullptr;
  }

  for (int j = 0; j < pad_h; ++j) {
    for (int i = 0; i < pad_w; ++i) {
      const int v = get_nearest_pix(data, w, h, i - 3, j - 3);
      if (high_bd) {
        *CONVERT_TO_SHORTPTR(dst + i + j * pad_w) = v;
      } else {
        dst[i + j * pad_w] = v;
      }
    }
  }
  return dst + (w + 7) * 3 + 3;
}

static int stride_8tap(int width) { return width + 7; }

static void free_pad_8tap(uint8_t *padded, int width, bool high_bd) {
  if (high_bd) {
    aom_free(CONVERT_TO_SHORTPTR(padded - (width + 7) * 3 - 3));
  } else {
    aom_free(padded - (width + 7) * 3 - 3);
  }
}

struct Pad8TapConvolveDeleter {
  Pad8TapConvolveDeleter(const int width, const bool high_bd)
      : width(width), high_bd(high_bd) {}
  void operator()(uint8_t *p) {
    if (p != nullptr) {
      free_pad_8tap(p, width, high_bd);
    }
  }
  const int width;
  const bool high_bd;
};

static uint8_t *malloc_bd(int num_entries, bool high_bd) {
  const int bytes_per_entry = high_bd ? sizeof(uint16_t) : sizeof(uint8_t);

  uint8_t *buf = (uint8_t *)aom_memalign(32, bytes_per_entry * num_entries);
  if (high_bd) {
    return CONVERT_TO_BYTEPTR(buf);
  } else {
    return buf;
  }
}

static void free_bd(uint8_t *p, bool high_bd) {
  if (high_bd) {
    aom_free(CONVERT_TO_SHORTPTR(p));
  } else {
    aom_free(p);
  }
}

struct MallocBdDeleter {
  explicit MallocBdDeleter(const bool high_bd) : high_bd(high_bd) {}
  void operator()(uint8_t *p) { free_bd(p, high_bd); }
  const bool high_bd;
};

class EdgeDetectBrightnessTest :
    // Parameters are (brightness, width, height, high bit depth representation,
    // bit depth).
    public ::testing::TestWithParam<tuple<int, int, int, bool, int> > {
 protected:
  void SetUp() override {
    // Allocate a (width by height) array of luma values in orig_.
    // padded_ will be filled by the pad() call, which adds a border around
    // the orig_. The output_ array has enough space for the computation.
    const int brightness = GET_PARAM(0);
    const int width = GET_PARAM(1);
    const int height = GET_PARAM(2);
    const bool high_bd = GET_PARAM(3);

    // Create the padded image of uniform brightness.
    std::unique_ptr<int[]> orig(new int[width * height]);
    ASSERT_NE(orig, nullptr);
    for (int i = 0; i < width * height; ++i) {
      orig[i] = brightness;
    }
    input_ = pad_8tap_convolve(orig.get(), width, height, high_bd);
    ASSERT_NE(input_, nullptr);
    output_ = malloc_bd(width * height, high_bd);
    ASSERT_NE(output_, nullptr);
  }

  void TearDown() override {
    const int width = GET_PARAM(1);
    const bool high_bd = GET_PARAM(3);
    free_pad_8tap(input_, width, high_bd);
    free_bd(output_, high_bd);
  }

  // Skip the tests where brightness exceeds the bit-depth; we run into this
  // issue because of gtest's limitation on valid combinations of test
  // parameters. Also skip the tests where bit depth is greater than 8, but
  // high bit depth representation is not set.
  bool should_skip() const {
    const int brightness = GET_PARAM(0);
    const int bd = GET_PARAM(4);
    if (brightness >= (1 << bd)) {
      return true;
    }
    const bool high_bd = GET_PARAM(3);
    if (bd > 8 && !high_bd) {
      return true;
    }
    return false;
  }

  uint8_t *input_;
  uint8_t *output_;
};

TEST_P(EdgeDetectBrightnessTest, BlurUniformBrightness) {
  // Some combination of parameters are non-sensical, due to limitations
  // of the testing framework. Ignore these.
  if (should_skip()) {
    return;
  }

  // For varying levels of brightness, the algorithm should
  // produce the same output.
  const int brightness = GET_PARAM(0);
  const int width = GET_PARAM(1);
  const int height = GET_PARAM(2);
  const bool high_bd = GET_PARAM(3);
  const int bd = GET_PARAM(4);

  av1_gaussian_blur(input_, stride_8tap(width), width, height, output_, high_bd,
                    bd);
  for (int i = 0; i < width * height; ++i) {
    ASSERT_EQ(brightness, get_pix(output_, i, high_bd));
  }
}

// No edges on a uniformly bright image.
TEST_P(EdgeDetectBrightnessTest, DetectUniformBrightness) {
  if (should_skip()) {
    return;
  }
  const int width = GET_PARAM(1);
  const int height = GET_PARAM(2);
  const bool high_bd = GET_PARAM(3);
  const int bd = GET_PARAM(4);

  ASSERT_EQ(
      0, av1_edge_exists(input_, stride_8tap(width), width, height, high_bd, bd)
             .magnitude);
}

INSTANTIATE_TEST_SUITE_P(ImageBrightnessTests, EdgeDetectBrightnessTest,
                         ::testing::Combine(
                             // Brightness
                             ::testing::Values(0, 1, 2, 127, 128, 129, 254, 255,
                                               256, 511, 512, 1023, 1024, 2048,
                                               4095),
                             // Width
                             ::testing::Values(8, 16, 32),
                             // Height
                             ::testing::Values(4, 8, 12, 32),
                             // High bit depth representation
                             ::testing::Bool(),
                             // Bit depth
                             ::testing::Values(8, 10, 12)));

class EdgeDetectImageTest :
    // Parameters are (width, height, high bit depth representation, bit depth).
    public ::testing::TestWithParam<tuple<int, int, bool, int> > {
 protected:
  // Skip the tests where bit depth is greater than 8, but high bit depth
  // representation is not set (limitation of testing framework).
  bool should_skip() const {
    const bool high_bd = GET_PARAM(2);
    const int bd = GET_PARAM(3);
    return bd > 8 && !high_bd;
  }
};

// Generate images with black on one side and white on the other.
TEST_P(EdgeDetectImageTest, BlackWhite) {
  // Some combination of parameters are non-sensical, due to limitations
  // of the testing framework. Ignore these.
  if (should_skip()) {
    return;
  }

  const int width = GET_PARAM(0);
  const int height = GET_PARAM(1);
  const bool high_bd = GET_PARAM(2);
  const int bd = GET_PARAM(3);

  const int white = (1 << bd) - 1;
  std::unique_ptr<int[]> orig(new int[width * height]);
  for (int j = 0; j < height; ++j) {
    for (int i = 0; i < width; ++i) {
      if (i < width / 2) {
        orig[i + j * width] = 0;
      } else {
        orig[i + j * width] = white;
      }
    }
  }

  std::unique_ptr<uint8_t[], Pad8TapConvolveDeleter> padded(
      pad_8tap_convolve(orig.get(), width, height, high_bd),
      Pad8TapConvolveDeleter(width, high_bd));
  ASSERT_NE(padded, nullptr);
  // Value should be between 556 and 560.
  ASSERT_LE(556, av1_edge_exists(padded.get(), stride_8tap(width), width,
                                 height, high_bd, bd)
                     .magnitude);
  ASSERT_GE(560, av1_edge_exists(padded.get(), stride_8tap(width), width,
                                 height, high_bd, bd)
                     .magnitude);
}

// Hardcoded blur tests.
static const int luma[32] = { 241, 147, 7,   90,  184, 103, 28,  186,
                              2,   248, 49,  242, 114, 146, 127, 22,
                              121, 228, 167, 108, 158, 174, 41,  168,
                              214, 99,  184, 109, 114, 247, 117, 119 };
static const uint8_t expected[] = { 161, 138, 119, 118, 123, 118, 113, 122,
                                    143, 140, 134, 133, 134, 126, 116, 114,
                                    147, 149, 145, 142, 143, 138, 126, 118,
                                    164, 156, 148, 144, 148, 148, 138, 126 };

static void hardcoded_blur_test_aux(const bool high_bd) {
  const int w = 8;
  const int h = 4;
  for (int bd = 8; bd <= 12; bd += 2) {
    // Skip the tests where bit depth is greater than 8, but high bit depth
    // representation is not set.
    if (bd > 8 && !high_bd) {
      break;
    }
    std::unique_ptr<uint8_t[], MallocBdDeleter> output(
        malloc_bd(w * h, high_bd), MallocBdDeleter(high_bd));
    ASSERT_NE(output, nullptr);
    std::unique_ptr<uint8_t[], Pad8TapConvolveDeleter> padded(
        pad_8tap_convolve(luma, w, h, high_bd),
        Pad8TapConvolveDeleter(w, high_bd));
    ASSERT_NE(padded, nullptr);
    av1_gaussian_blur(padded.get(), stride_8tap(w), w, h, output.get(), high_bd,
                      bd);
    for (int i = 0; i < w * h; ++i) {
      ASSERT_EQ(expected[i], get_pix(output.get(), i, high_bd));
    }

    // If we multiply the inputs by a constant factor, the output should not
    // vary more than 0.5 * factor.
    for (int c = 2; c < (1 << (bd - 8)); ++c) {
      int scaled_luma[32];
      for (int i = 0; i < 32; ++i) {
        scaled_luma[i] = luma[i] * c;
      }
      padded.reset(pad_8tap_convolve(scaled_luma, w, h, high_bd));
      ASSERT_NE(padded, nullptr);
      av1_gaussian_blur(padded.get(), stride_8tap(w), w, h, output.get(),
                        high_bd, bd);
      for (int i = 0; i < w * h; ++i) {
        ASSERT_GE(c / 2,
                  abs(expected[i] * c - get_pix(output.get(), i, high_bd)));
      }
    }
  }
}

TEST(EdgeDetectImageTest, HardcodedBlurTest) {
  hardcoded_blur_test_aux(false);
  hardcoded_blur_test_aux(true);
}

TEST(EdgeDetectImageTest, SobelTest) {
  // Randomly generated 3x3. Compute Sobel for middle value.
  const uint8_t buf[9] = { 241, 147, 7, 90, 184, 103, 28, 186, 2 };
  const int stride = 3;
  bool high_bd = false;
  sobel_xy result = av1_sobel(buf, stride, 1, 1, high_bd);
  ASSERT_EQ(234, result.x);
  ASSERT_EQ(140, result.y);

  // Verify it works for 8-bit values in a high bit-depth buffer.
  const uint16_t buf8_16[9] = { 241, 147, 7, 90, 184, 103, 28, 186, 2 };
  high_bd = true;
  result = av1_sobel(CONVERT_TO_BYTEPTR(buf8_16), stride, 1, 1, high_bd);
  ASSERT_EQ(234, result.x);
  ASSERT_EQ(140, result.y);

  // Verify it works for high bit-depth values as well.
  const uint16_t buf16[9] = { 241, 147, 7, 90, 184, 2003, 1028, 186, 2 };
  result = av1_sobel(CONVERT_TO_BYTEPTR(buf16), stride, 1, 1, high_bd);
  ASSERT_EQ(-2566, result.x);
  ASSERT_EQ(-860, result.y);
}

INSTANTIATE_TEST_SUITE_P(EdgeDetectImages, EdgeDetectImageTest,
                         ::testing::Combine(
                             // Width
                             ::testing::Values(8, 16, 32),
                             // Height
                             ::testing::Values(4, 8, 12, 32),
                             // High bit depth representation
                             ::testing::Bool(),
                             // Bit depth
                             ::testing::Values(8, 10, 12)));
}  // namespace
