/*
 * libjingle
 * Copyright 2014 Google Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *  3. The name of the author may not be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include <string>

#include "libyuv/convert.h"
#include "libyuv/convert_from.h"
#include "libyuv/convert_from_argb.h"
#include "libyuv/format_conversion.h"
#include "libyuv/mjpeg_decoder.h"
#include "libyuv/planar_functions.h"
#include "talk/media/base/testutils.h"
#include "talk/media/base/videocommon.h"
#include "webrtc/base/flags.h"
#include "webrtc/base/gunit.h"
#include "webrtc/base/scoped_ptr.h"

// Undefine macros for the windows build.
#undef max
#undef min

using cricket::DumpPlanarYuvTestImage;

DEFINE_bool(planarfunctions_dump, false,
    "whether to write out scaled images for inspection");
DEFINE_int(planarfunctions_repeat, 1,
    "how many times to perform each scaling operation (for perf testing)");

namespace cricket {

// Number of testing colors in each color channel.
static const int kTestingColorChannelResolution = 6;

// The total number of testing colors
// kTestingColorNum = kTestingColorChannelResolution^3;
static const int kTestingColorNum = kTestingColorChannelResolution *
    kTestingColorChannelResolution * kTestingColorChannelResolution;

static const int kWidth = 1280;
static const int kHeight = 720;
static const int kAlignment = 16;

class PlanarFunctionsTest : public testing::TestWithParam<int> {
 protected:
  PlanarFunctionsTest() : dump_(false), repeat_(1) {
    InitializeColorBand();
  }

  virtual void SetUp() {
    dump_ = FLAG_planarfunctions_dump;
    repeat_ = FLAG_planarfunctions_repeat;
  }

  // Initialize the color band for testing.
  void InitializeColorBand() {
    testing_color_y_.reset(new uint8[kTestingColorNum]);
    testing_color_u_.reset(new uint8[kTestingColorNum]);
    testing_color_v_.reset(new uint8[kTestingColorNum]);
    testing_color_r_.reset(new uint8[kTestingColorNum]);
    testing_color_g_.reset(new uint8[kTestingColorNum]);
    testing_color_b_.reset(new uint8[kTestingColorNum]);
    int color_counter = 0;
    for (int i = 0; i < kTestingColorChannelResolution; ++i) {
      uint8 color_r = static_cast<uint8>(
          i * 255 / (kTestingColorChannelResolution - 1));
      for (int j = 0; j < kTestingColorChannelResolution; ++j) {
        uint8 color_g = static_cast<uint8>(
            j * 255 / (kTestingColorChannelResolution - 1));
        for (int k = 0; k < kTestingColorChannelResolution; ++k) {
          uint8 color_b = static_cast<uint8>(
              k * 255 / (kTestingColorChannelResolution - 1));
          testing_color_r_[color_counter] = color_r;
          testing_color_g_[color_counter] = color_g;
          testing_color_b_[color_counter] = color_b;
           // Converting the testing RGB colors to YUV colors.
          ConvertRgbPixel(color_r, color_g, color_b,
                          &(testing_color_y_[color_counter]),
                          &(testing_color_u_[color_counter]),
                          &(testing_color_v_[color_counter]));
          ++color_counter;
        }
      }
    }
  }
  // Simple and slow RGB->YUV conversion. From NTSC standard, c/o Wikipedia.
  // (from lmivideoframe_unittest.cc)
  void ConvertRgbPixel(uint8 r, uint8 g, uint8 b,
                       uint8* y, uint8* u, uint8* v) {
    *y = ClampUint8(.257 * r + .504 * g + .098 * b + 16);
    *u = ClampUint8(-.148 * r - .291 * g + .439 * b + 128);
    *v = ClampUint8(.439 * r - .368 * g - .071 * b + 128);
  }

  uint8 ClampUint8(double value) {
    value = std::max(0., std::min(255., value));
    uint8 uint8_value = static_cast<uint8>(value);
    return uint8_value;
  }

  // Generate a Red-Green-Blue inter-weaving chessboard-like
  // YUV testing image (I420/I422/I444).
  // The pattern looks like c0 c1 c2 c3 ...
  //                        c1 c2 c3 c4 ...
  //                        c2 c3 c4 c5 ...
  //                        ...............
  // The size of each chrome block is (block_size) x (block_size).
  uint8* CreateFakeYuvTestingImage(int height, int width, int block_size,
                                   libyuv::JpegSubsamplingType subsample_type,
                                   uint8* &y_pointer,
                                   uint8* &u_pointer,
                                   uint8* &v_pointer) {
    if (height <= 0 || width <= 0 || block_size <= 0) { return NULL; }
    int y_size = height * width;
    int u_size, v_size;
    int vertical_sample_ratio = 1, horizontal_sample_ratio = 1;
    switch (subsample_type) {
      case libyuv::kJpegYuv420:
        u_size = ((height + 1) >> 1) * ((width + 1) >> 1);
        v_size = u_size;
        vertical_sample_ratio = 2, horizontal_sample_ratio = 2;
        break;
      case libyuv::kJpegYuv422:
        u_size = height * ((width + 1) >> 1);
        v_size = u_size;
        vertical_sample_ratio = 1, horizontal_sample_ratio = 2;
        break;
      case libyuv::kJpegYuv444:
        v_size = u_size = y_size;
        vertical_sample_ratio = 1, horizontal_sample_ratio = 1;
        break;
      case libyuv::kJpegUnknown:
      default:
        return NULL;
        break;
    }
    uint8* image_pointer = new uint8[y_size + u_size + v_size + kAlignment];
    y_pointer = ALIGNP(image_pointer, kAlignment);
    u_pointer = ALIGNP(&image_pointer[y_size], kAlignment);
    v_pointer = ALIGNP(&image_pointer[y_size + u_size], kAlignment);
    uint8* current_y_pointer = y_pointer;
    uint8* current_u_pointer = u_pointer;
    uint8* current_v_pointer = v_pointer;
    for (int j = 0; j < height; ++j) {
      for (int i = 0; i < width; ++i) {
        int color = ((i / block_size) + (j / block_size)) % kTestingColorNum;
        *(current_y_pointer++) = testing_color_y_[color];
        if (i % horizontal_sample_ratio == 0 &&
            j % vertical_sample_ratio == 0) {
          *(current_u_pointer++) = testing_color_u_[color];
          *(current_v_pointer++) = testing_color_v_[color];
        }
      }
    }
    return image_pointer;
  }

  // Generate a Red-Green-Blue inter-weaving chessboard-like
  // YUY2/UYVY testing image.
  // The pattern looks like c0 c1 c2 c3 ...
  //                        c1 c2 c3 c4 ...
  //                        c2 c3 c4 c5 ...
  //                        ...............
  // The size of each chrome block is (block_size) x (block_size).
  uint8* CreateFakeInterleaveYuvTestingImage(
      int height, int width, int block_size,
      uint8* &yuv_pointer, FourCC fourcc_type) {
    if (height <= 0 || width <= 0 || block_size <= 0) { return NULL; }
    if (fourcc_type != FOURCC_YUY2 && fourcc_type != FOURCC_UYVY) {
      LOG(LS_ERROR) << "Format " << static_cast<int>(fourcc_type)
                    << " is not supported.";
      return NULL;
    }
    // Regularize the width of the output to be even.
    int awidth = (width + 1) & ~1;

    uint8* image_pointer = new uint8[2 * height * awidth + kAlignment];
    yuv_pointer = ALIGNP(image_pointer, kAlignment);
    uint8* current_yuv_pointer = yuv_pointer;
    switch (fourcc_type) {
      case FOURCC_YUY2: {
        for (int j = 0; j < height; ++j) {
          for (int i = 0; i < awidth; i += 2, current_yuv_pointer += 4) {
            int color1 = ((i / block_size) + (j / block_size)) %
                kTestingColorNum;
            int color2 = (((i + 1) / block_size) + (j / block_size)) %
                kTestingColorNum;
            current_yuv_pointer[0] = testing_color_y_[color1];
            if (i < width) {
              current_yuv_pointer[1] = static_cast<uint8>(
                  (static_cast<uint32>(testing_color_u_[color1]) +
                  static_cast<uint32>(testing_color_u_[color2])) / 2);
              current_yuv_pointer[2] = testing_color_y_[color2];
              current_yuv_pointer[3] = static_cast<uint8>(
                  (static_cast<uint32>(testing_color_v_[color1]) +
                  static_cast<uint32>(testing_color_v_[color2])) / 2);
            } else {
              current_yuv_pointer[1] = testing_color_u_[color1];
              current_yuv_pointer[2] = 0;
              current_yuv_pointer[3] = testing_color_v_[color1];
            }
          }
        }
        break;
      }
      case FOURCC_UYVY: {
        for (int j = 0; j < height; ++j) {
          for (int i = 0; i < awidth; i += 2, current_yuv_pointer += 4) {
            int color1 = ((i / block_size) + (j / block_size)) %
                kTestingColorNum;
            int color2 = (((i + 1) / block_size) + (j / block_size)) %
                kTestingColorNum;
            if (i < width) {
              current_yuv_pointer[0] = static_cast<uint8>(
                  (static_cast<uint32>(testing_color_u_[color1]) +
                  static_cast<uint32>(testing_color_u_[color2])) / 2);
              current_yuv_pointer[1] = testing_color_y_[color1];
              current_yuv_pointer[2] = static_cast<uint8>(
                  (static_cast<uint32>(testing_color_v_[color1]) +
                  static_cast<uint32>(testing_color_v_[color2])) / 2);
              current_yuv_pointer[3] = testing_color_y_[color2];
            } else {
              current_yuv_pointer[0] = testing_color_u_[color1];
              current_yuv_pointer[1] = testing_color_y_[color1];
              current_yuv_pointer[2] = testing_color_v_[color1];
              current_yuv_pointer[3] = 0;
            }
          }
        }
        break;
      }
    }
    return image_pointer;
  }
  // Generate a Red-Green-Blue inter-weaving chessboard-like
  // Q420 testing image.
  // The pattern looks like c0 c1 c2 c3 ...
  //                        c1 c2 c3 c4 ...
  //                        c2 c3 c4 c5 ...
  //                        ...............
  // The size of each chrome block is (block_size) x (block_size).
  uint8* CreateFakeQ420TestingImage(int height, int width, int block_size,
      uint8* &y_pointer, uint8* &yuy2_pointer) {
    if (height <= 0 || width <= 0 || block_size <= 0) { return NULL; }
    // Regularize the width of the output to be even.
    int awidth = (width + 1) & ~1;

    uint8* image_pointer = new uint8[(height / 2) * awidth * 2 +
        ((height + 1) / 2) * width + kAlignment];
    y_pointer = ALIGNP(image_pointer, kAlignment);
    yuy2_pointer = y_pointer + ((height + 1) / 2) * width;
    uint8* current_yuy2_pointer = yuy2_pointer;
    uint8* current_y_pointer = y_pointer;
    for (int j = 0; j < height; ++j) {
      if (j % 2 == 0) {
        for (int i = 0; i < width; ++i) {
          int color = ((i / block_size) + (j / block_size)) %
              kTestingColorNum;
          *(current_y_pointer++) = testing_color_y_[color];
        }
      } else {
        for (int i = 0; i < awidth; i += 2, current_yuy2_pointer += 4) {
          int color1 = ((i / block_size) + (j / block_size)) %
              kTestingColorNum;
          int color2 = (((i + 1) / block_size) + (j / block_size)) %
              kTestingColorNum;
          current_yuy2_pointer[0] = testing_color_y_[color1];
          if (i < width) {
            current_yuy2_pointer[1] = static_cast<uint8>(
                (static_cast<uint32>(testing_color_u_[color1]) +
                static_cast<uint32>(testing_color_u_[color2])) / 2);
            current_yuy2_pointer[2] = testing_color_y_[color2];
            current_yuy2_pointer[3] = static_cast<uint8>(
                (static_cast<uint32>(testing_color_v_[color1]) +
                static_cast<uint32>(testing_color_v_[color2])) / 2);
          } else {
            current_yuy2_pointer[1] = testing_color_u_[color1];
            current_yuy2_pointer[2] = 0;
            current_yuy2_pointer[3] = testing_color_v_[color1];
          }
        }
      }
    }
    return image_pointer;
  }

  // Generate a Red-Green-Blue inter-weaving chessboard-like
  // NV12 testing image.
  // (Note: No interpolation is used.)
  // The pattern looks like c0 c1 c2 c3 ...
  //                        c1 c2 c3 c4 ...
  //                        c2 c3 c4 c5 ...
  //                        ...............
  // The size of each chrome block is (block_size) x (block_size).
  uint8* CreateFakeNV12TestingImage(int height, int width, int block_size,
      uint8* &y_pointer, uint8* &uv_pointer) {
    if (height <= 0 || width <= 0 || block_size <= 0) { return NULL; }

    uint8* image_pointer = new uint8[height * width +
        ((height + 1) / 2) * ((width + 1) / 2) * 2 + kAlignment];
    y_pointer = ALIGNP(image_pointer, kAlignment);
    uv_pointer = y_pointer + height * width;
    uint8* current_uv_pointer = uv_pointer;
    uint8* current_y_pointer = y_pointer;
    for (int j = 0; j < height; ++j) {
      for (int i = 0; i < width; ++i) {
        int color = ((i / block_size) + (j / block_size)) %
            kTestingColorNum;
        *(current_y_pointer++) = testing_color_y_[color];
      }
      if (j % 2 == 0) {
        for (int i = 0; i < width; i += 2, current_uv_pointer += 2) {
          int color = ((i / block_size) + (j / block_size)) %
              kTestingColorNum;
          current_uv_pointer[0] = testing_color_u_[color];
          current_uv_pointer[1] = testing_color_v_[color];
        }
      }
    }
    return image_pointer;
  }

  // Generate a Red-Green-Blue inter-weaving chessboard-like
  // M420 testing image.
  // (Note: No interpolation is used.)
  // The pattern looks like c0 c1 c2 c3 ...
  //                        c1 c2 c3 c4 ...
  //                        c2 c3 c4 c5 ...
  //                        ...............
  // The size of each chrome block is (block_size) x (block_size).
  uint8* CreateFakeM420TestingImage(
      int height, int width, int block_size, uint8* &m420_pointer) {
    if (height <= 0 || width <= 0 || block_size <= 0) { return NULL; }

    uint8* image_pointer = new uint8[height * width +
        ((height + 1) / 2) * ((width + 1) / 2) * 2 + kAlignment];
    m420_pointer = ALIGNP(image_pointer, kAlignment);
    uint8* current_m420_pointer = m420_pointer;
    for (int j = 0; j < height; ++j) {
      for (int i = 0; i < width; ++i) {
        int color = ((i / block_size) + (j / block_size)) %
            kTestingColorNum;
        *(current_m420_pointer++) = testing_color_y_[color];
      }
      if (j % 2 == 1) {
        for (int i = 0; i < width; i += 2, current_m420_pointer += 2) {
          int color = ((i / block_size) + ((j - 1) / block_size)) %
              kTestingColorNum;
          current_m420_pointer[0] = testing_color_u_[color];
          current_m420_pointer[1] = testing_color_v_[color];
        }
      }
    }
    return image_pointer;
  }

  // Generate a Red-Green-Blue inter-weaving chessboard-like
  // ARGB/ABGR/RAW/BG24 testing image.
  // The pattern looks like c0 c1 c2 c3 ...
  //                        c1 c2 c3 c4 ...
  //                        c2 c3 c4 c5 ...
  //                        ...............
  // The size of each chrome block is (block_size) x (block_size).
  uint8* CreateFakeArgbTestingImage(int height, int width, int block_size,
                                    uint8* &argb_pointer, FourCC fourcc_type) {
    if (height <= 0 || width <= 0 || block_size <= 0) { return NULL; }
    uint8* image_pointer = NULL;
    if (fourcc_type == FOURCC_ABGR || fourcc_type == FOURCC_BGRA ||
        fourcc_type == FOURCC_ARGB) {
      image_pointer = new uint8[height * width * 4 + kAlignment];
    } else if (fourcc_type == FOURCC_RAW || fourcc_type == FOURCC_24BG) {
      image_pointer = new uint8[height * width * 3 + kAlignment];
    } else {
      LOG(LS_ERROR) << "Format " << static_cast<int>(fourcc_type)
                    << " is not supported.";
      return NULL;
    }
    argb_pointer = ALIGNP(image_pointer, kAlignment);
    uint8* current_pointer = argb_pointer;
    switch (fourcc_type) {
      case FOURCC_ARGB: {
        for (int j = 0; j < height; ++j) {
          for (int i = 0; i < width; ++i) {
            int color = ((i / block_size) + (j / block_size)) %
                kTestingColorNum;
            *(current_pointer++) = testing_color_b_[color];
            *(current_pointer++) = testing_color_g_[color];
            *(current_pointer++) = testing_color_r_[color];
            *(current_pointer++) = 255;
          }
        }
        break;
      }
      case FOURCC_ABGR: {
        for (int j = 0; j < height; ++j) {
          for (int i = 0; i < width; ++i) {
            int color = ((i / block_size) + (j / block_size)) %
                kTestingColorNum;
            *(current_pointer++) = testing_color_r_[color];
            *(current_pointer++) = testing_color_g_[color];
            *(current_pointer++) = testing_color_b_[color];
            *(current_pointer++) = 255;
          }
        }
        break;
      }
      case FOURCC_BGRA: {
        for (int j = 0; j < height; ++j) {
          for (int i = 0; i < width; ++i) {
            int color = ((i / block_size) + (j / block_size)) %
                kTestingColorNum;
            *(current_pointer++) = 255;
            *(current_pointer++) = testing_color_r_[color];
            *(current_pointer++) = testing_color_g_[color];
            *(current_pointer++) = testing_color_b_[color];
           }
        }
        break;
      }
      case FOURCC_24BG: {
        for (int j = 0; j < height; ++j) {
          for (int i = 0; i < width; ++i) {
            int color = ((i / block_size) + (j / block_size)) %
                kTestingColorNum;
            *(current_pointer++) = testing_color_b_[color];
            *(current_pointer++) = testing_color_g_[color];
            *(current_pointer++) = testing_color_r_[color];
          }
        }
        break;
      }
      case FOURCC_RAW: {
        for (int j = 0; j < height; ++j) {
          for (int i = 0; i < width; ++i) {
            int color = ((i / block_size) + (j / block_size)) %
                kTestingColorNum;
            *(current_pointer++) = testing_color_r_[color];
            *(current_pointer++) = testing_color_g_[color];
            *(current_pointer++) = testing_color_b_[color];
          }
        }
        break;
      }
      default: {
        LOG(LS_ERROR) << "Format " << static_cast<int>(fourcc_type)
                      << " is not supported.";
      }
    }
    return image_pointer;
  }

  // Check if two memory chunks are equal.
  // (tolerate MSE errors within a threshold).
  static bool IsMemoryEqual(const uint8* ibuf, const uint8* obuf,
                            int osize, double average_error) {
    double sse = cricket::ComputeSumSquareError(ibuf, obuf, osize);
    double error = sse / osize;  // Mean Squared Error.
    double PSNR = cricket::ComputePSNR(sse, osize);
    LOG(LS_INFO) << "Image MSE: "  << error << " Image PSNR: " << PSNR
                 << " First Diff Byte: " << FindDiff(ibuf, obuf, osize);
    return (error < average_error);
  }

  // Returns the index of the first differing byte. Easier to debug than memcmp.
  static int FindDiff(const uint8* buf1, const uint8* buf2, int len) {
    int i = 0;
    while (i < len && buf1[i] == buf2[i]) {
      i++;
    }
    return (i < len) ? i : -1;
  }

  // Dump the result image (ARGB format).
  void DumpArgbImage(const uint8* obuf, int width, int height) {
    DumpPlanarArgbTestImage(GetTestName(), obuf, width, height);
  }

  // Dump the result image (YUV420 format).
  void DumpYuvImage(const uint8* obuf, int width, int height) {
    DumpPlanarYuvTestImage(GetTestName(), obuf, width, height);
  }

  std::string GetTestName() {
    const testing::TestInfo* const test_info =
        testing::UnitTest::GetInstance()->current_test_info();
    std::string test_name(test_info->name());
    return test_name;
  }

  bool dump_;
  int repeat_;

  // Y, U, V and R, G, B channels of testing colors.
  rtc::scoped_ptr<uint8[]> testing_color_y_;
  rtc::scoped_ptr<uint8[]> testing_color_u_;
  rtc::scoped_ptr<uint8[]> testing_color_v_;
  rtc::scoped_ptr<uint8[]> testing_color_r_;
  rtc::scoped_ptr<uint8[]> testing_color_g_;
  rtc::scoped_ptr<uint8[]> testing_color_b_;
};

TEST_F(PlanarFunctionsTest, I420Copy) {
  uint8 *y_pointer = NULL, *u_pointer = NULL, *v_pointer = NULL;
  int y_pitch = kWidth;
  int u_pitch = (kWidth + 1) >> 1;
  int v_pitch = (kWidth + 1) >> 1;
  int y_size = kHeight * kWidth;
  int uv_size = ((kHeight + 1) >> 1) * ((kWidth + 1) >> 1);
  int block_size = 3;
  // Generate a fake input image.
  rtc::scoped_ptr<uint8[]> yuv_input(
      CreateFakeYuvTestingImage(kHeight, kWidth, block_size,
                                libyuv::kJpegYuv420,
                                y_pointer, u_pointer, v_pointer));
  // Allocate space for the output image.
  rtc::scoped_ptr<uint8[]> yuv_output(
      new uint8[I420_SIZE(kHeight, kWidth) + kAlignment]);
  uint8 *y_output_pointer = ALIGNP(yuv_output.get(), kAlignment);
  uint8 *u_output_pointer = y_output_pointer + y_size;
  uint8 *v_output_pointer = u_output_pointer + uv_size;

  for (int i = 0; i < repeat_; ++i) {
  libyuv::I420Copy(y_pointer, y_pitch,
                   u_pointer, u_pitch,
                   v_pointer, v_pitch,
                   y_output_pointer, y_pitch,
                   u_output_pointer, u_pitch,
                   v_output_pointer, v_pitch,
                   kWidth, kHeight);
  }

  // Expect the copied frame to be exactly the same.
  EXPECT_TRUE(IsMemoryEqual(y_output_pointer, y_pointer,
      I420_SIZE(kHeight, kWidth), 1.e-6));

  if (dump_) { DumpYuvImage(y_output_pointer, kWidth, kHeight); }
}

TEST_F(PlanarFunctionsTest, I422ToI420) {
  uint8 *y_pointer = NULL, *u_pointer = NULL, *v_pointer = NULL;
  int y_pitch = kWidth;
  int u_pitch = (kWidth + 1) >> 1;
  int v_pitch = (kWidth + 1) >> 1;
  int y_size = kHeight * kWidth;
  int uv_size = ((kHeight + 1) >> 1) * ((kWidth + 1) >> 1);
  int block_size = 2;
  // Generate a fake input image.
  rtc::scoped_ptr<uint8[]> yuv_input(
      CreateFakeYuvTestingImage(kHeight, kWidth, block_size,
                                libyuv::kJpegYuv422,
                                y_pointer, u_pointer, v_pointer));
  // Allocate space for the output image.
  rtc::scoped_ptr<uint8[]> yuv_output(
      new uint8[I420_SIZE(kHeight, kWidth) + kAlignment]);
  uint8 *y_output_pointer = ALIGNP(yuv_output.get(), kAlignment);
  uint8 *u_output_pointer = y_output_pointer + y_size;
  uint8 *v_output_pointer = u_output_pointer + uv_size;
  // Generate the expected output.
  uint8 *y_expected_pointer = NULL, *u_expected_pointer = NULL,
        *v_expected_pointer = NULL;
  rtc::scoped_ptr<uint8[]> yuv_output_expected(
      CreateFakeYuvTestingImage(kHeight, kWidth, block_size,
          libyuv::kJpegYuv420,
          y_expected_pointer, u_expected_pointer, v_expected_pointer));

  for (int i = 0; i < repeat_; ++i) {
  libyuv::I422ToI420(y_pointer, y_pitch,
                     u_pointer, u_pitch,
                     v_pointer, v_pitch,
                     y_output_pointer, y_pitch,
                     u_output_pointer, u_pitch,
                     v_output_pointer, v_pitch,
                     kWidth, kHeight);
  }

  // Compare the output frame with what is expected; expect exactly the same.
  // Note: MSE should be set to a larger threshold if an odd block width
  // is used, since the conversion will be lossy.
  EXPECT_TRUE(IsMemoryEqual(y_output_pointer, y_expected_pointer,
      I420_SIZE(kHeight, kWidth), 1.e-6));

  if (dump_) { DumpYuvImage(y_output_pointer, kWidth, kHeight); }
}

TEST_P(PlanarFunctionsTest, Q420ToI420) {
  // Get the unalignment offset
  int unalignment = GetParam();
  uint8 *y_pointer = NULL, *yuy2_pointer = NULL;
  int y_pitch = kWidth;
  int yuy2_pitch = 2 * ((kWidth + 1) & ~1);
  int u_pitch = (kWidth + 1) >> 1;
  int v_pitch = (kWidth + 1) >> 1;
  int y_size = kHeight * kWidth;
  int uv_size = ((kHeight + 1) >> 1) * ((kWidth + 1) >> 1);
  int block_size = 2;
  // Generate a fake input image.
  rtc::scoped_ptr<uint8[]> yuv_input(
      CreateFakeQ420TestingImage(kHeight, kWidth, block_size,
                                 y_pointer, yuy2_pointer));
  // Allocate space for the output image.
  rtc::scoped_ptr<uint8[]> yuv_output(
      new uint8[I420_SIZE(kHeight, kWidth) + kAlignment + unalignment]);
  uint8 *y_output_pointer = ALIGNP(yuv_output.get(), kAlignment) +
      unalignment;
  uint8 *u_output_pointer = y_output_pointer + y_size;
  uint8 *v_output_pointer = u_output_pointer + uv_size;
  // Generate the expected output.
  uint8 *y_expected_pointer = NULL, *u_expected_pointer = NULL,
        *v_expected_pointer = NULL;
  rtc::scoped_ptr<uint8[]> yuv_output_expected(
      CreateFakeYuvTestingImage(kHeight, kWidth, block_size,
          libyuv::kJpegYuv420,
          y_expected_pointer, u_expected_pointer, v_expected_pointer));

  for (int i = 0; i < repeat_; ++i) {
  libyuv::Q420ToI420(y_pointer, y_pitch,
                     yuy2_pointer, yuy2_pitch,
                     y_output_pointer, y_pitch,
                     u_output_pointer, u_pitch,
                     v_output_pointer, v_pitch,
                     kWidth, kHeight);
  }
  // Compare the output frame with what is expected; expect exactly the same.
  // Note: MSE should be set to a larger threshold if an odd block width
  // is used, since the conversion will be lossy.
  EXPECT_TRUE(IsMemoryEqual(y_output_pointer, y_expected_pointer,
      I420_SIZE(kHeight, kWidth), 1.e-6));

  if (dump_) { DumpYuvImage(y_output_pointer, kWidth, kHeight); }
}

TEST_P(PlanarFunctionsTest, M420ToI420) {
  // Get the unalignment offset
  int unalignment = GetParam();
  uint8 *m420_pointer = NULL;
  int y_pitch = kWidth;
  int m420_pitch = kWidth;
  int u_pitch = (kWidth + 1) >> 1;
  int v_pitch = (kWidth + 1) >> 1;
  int y_size = kHeight * kWidth;
  int uv_size = ((kHeight + 1) >> 1) * ((kWidth + 1) >> 1);
  int block_size = 2;
  // Generate a fake input image.
  rtc::scoped_ptr<uint8[]> yuv_input(
      CreateFakeM420TestingImage(kHeight, kWidth, block_size, m420_pointer));
  // Allocate space for the output image.
  rtc::scoped_ptr<uint8[]> yuv_output(
      new uint8[I420_SIZE(kHeight, kWidth) + kAlignment + unalignment]);
  uint8 *y_output_pointer = ALIGNP(yuv_output.get(), kAlignment) + unalignment;
  uint8 *u_output_pointer = y_output_pointer + y_size;
  uint8 *v_output_pointer = u_output_pointer + uv_size;
  // Generate the expected output.
  uint8 *y_expected_pointer = NULL, *u_expected_pointer = NULL,
        *v_expected_pointer = NULL;
  rtc::scoped_ptr<uint8[]> yuv_output_expected(
      CreateFakeYuvTestingImage(kHeight, kWidth, block_size,
          libyuv::kJpegYuv420,
          y_expected_pointer, u_expected_pointer, v_expected_pointer));

  for (int i = 0; i < repeat_; ++i) {
  libyuv::M420ToI420(m420_pointer, m420_pitch,
                     y_output_pointer, y_pitch,
                     u_output_pointer, u_pitch,
                     v_output_pointer, v_pitch,
                     kWidth, kHeight);
  }
  // Compare the output frame with what is expected; expect exactly the same.
  // Note: MSE should be set to a larger threshold if an odd block width
  // is used, since the conversion will be lossy.
  EXPECT_TRUE(IsMemoryEqual(y_output_pointer, y_expected_pointer,
      I420_SIZE(kHeight, kWidth), 1.e-6));

  if (dump_) { DumpYuvImage(y_output_pointer, kWidth, kHeight); }
}

TEST_P(PlanarFunctionsTest, NV12ToI420) {
  // Get the unalignment offset
  int unalignment = GetParam();
  uint8 *y_pointer = NULL, *uv_pointer = NULL;
  int y_pitch = kWidth;
  int uv_pitch = 2 * ((kWidth + 1) >> 1);
  int u_pitch = (kWidth + 1) >> 1;
  int v_pitch = (kWidth + 1) >> 1;
  int y_size = kHeight * kWidth;
  int uv_size = ((kHeight + 1) >> 1) * ((kWidth + 1) >> 1);
  int block_size = 2;
  // Generate a fake input image.
  rtc::scoped_ptr<uint8[]> yuv_input(
      CreateFakeNV12TestingImage(kHeight, kWidth, block_size,
                                 y_pointer, uv_pointer));
  // Allocate space for the output image.
  rtc::scoped_ptr<uint8[]> yuv_output(
      new uint8[I420_SIZE(kHeight, kWidth) + kAlignment + unalignment]);
  uint8 *y_output_pointer = ALIGNP(yuv_output.get(), kAlignment) + unalignment;
  uint8 *u_output_pointer = y_output_pointer + y_size;
  uint8 *v_output_pointer = u_output_pointer + uv_size;
  // Generate the expected output.
  uint8 *y_expected_pointer = NULL, *u_expected_pointer = NULL,
        *v_expected_pointer = NULL;
  rtc::scoped_ptr<uint8[]> yuv_output_expected(
      CreateFakeYuvTestingImage(kHeight, kWidth, block_size,
          libyuv::kJpegYuv420,
          y_expected_pointer, u_expected_pointer, v_expected_pointer));

  for (int i = 0; i < repeat_; ++i) {
  libyuv::NV12ToI420(y_pointer, y_pitch,
                     uv_pointer, uv_pitch,
                     y_output_pointer, y_pitch,
                     u_output_pointer, u_pitch,
                     v_output_pointer, v_pitch,
                     kWidth, kHeight);
  }
  // Compare the output frame with what is expected; expect exactly the same.
  // Note: MSE should be set to a larger threshold if an odd block width
  // is used, since the conversion will be lossy.
  EXPECT_TRUE(IsMemoryEqual(y_output_pointer, y_expected_pointer,
      I420_SIZE(kHeight, kWidth), 1.e-6));

  if (dump_) { DumpYuvImage(y_output_pointer, kWidth, kHeight); }
}

// A common macro for testing converting YUY2/UYVY to I420.
#define TEST_YUVTOI420(SRC_NAME, MSE, BLOCK_SIZE) \
TEST_P(PlanarFunctionsTest, SRC_NAME##ToI420) { \
  /* Get the unalignment offset.*/ \
  int unalignment = GetParam(); \
  uint8 *yuv_pointer = NULL; \
  int yuv_pitch = 2 * ((kWidth + 1) & ~1); \
  int y_pitch = kWidth; \
  int u_pitch = (kWidth + 1) >> 1; \
  int v_pitch = (kWidth + 1) >> 1; \
  int y_size = kHeight * kWidth; \
  int uv_size = ((kHeight + 1) >> 1) * ((kWidth + 1) >> 1); \
  int block_size = 2; \
  /* Generate a fake input image.*/ \
  rtc::scoped_ptr<uint8[]> yuv_input( \
      CreateFakeInterleaveYuvTestingImage(kHeight, kWidth, BLOCK_SIZE, \
          yuv_pointer, FOURCC_##SRC_NAME)); \
  /* Allocate space for the output image.*/ \
  rtc::scoped_ptr<uint8[]> yuv_output( \
      new uint8[I420_SIZE(kHeight, kWidth) + kAlignment + unalignment]); \
  uint8 *y_output_pointer = ALIGNP(yuv_output.get(), kAlignment) + \
      unalignment; \
  uint8 *u_output_pointer = y_output_pointer + y_size; \
  uint8 *v_output_pointer = u_output_pointer + uv_size; \
  /* Generate the expected output.*/ \
  uint8 *y_expected_pointer = NULL, *u_expected_pointer = NULL, \
        *v_expected_pointer = NULL; \
  rtc::scoped_ptr<uint8[]> yuv_output_expected( \
      CreateFakeYuvTestingImage(kHeight, kWidth, block_size, \
          libyuv::kJpegYuv420, \
          y_expected_pointer, u_expected_pointer, v_expected_pointer)); \
  for (int i = 0; i < repeat_; ++i) { \
    libyuv::SRC_NAME##ToI420(yuv_pointer, yuv_pitch, \
                             y_output_pointer, y_pitch, \
                             u_output_pointer, u_pitch, \
                             v_output_pointer, v_pitch, \
                             kWidth, kHeight); \
  } \
  /* Compare the output frame with what is expected.*/ \
  /* Note: MSE should be set to a larger threshold if an odd block width*/ \
  /* is used, since the conversion will be lossy.*/ \
  EXPECT_TRUE(IsMemoryEqual(y_output_pointer, y_expected_pointer, \
      I420_SIZE(kHeight, kWidth), MSE)); \
  if (dump_) { DumpYuvImage(y_output_pointer, kWidth, kHeight); } \
} \

// TEST_P(PlanarFunctionsTest, YUV2ToI420)
TEST_YUVTOI420(YUY2, 1.e-6, 2);
// TEST_P(PlanarFunctionsTest, UYVYToI420)
TEST_YUVTOI420(UYVY, 1.e-6, 2);

// A common macro for testing converting I420 to ARGB, BGRA and ABGR.
#define TEST_YUVTORGB(SRC_NAME, DST_NAME, JPG_TYPE, MSE, BLOCK_SIZE) \
TEST_F(PlanarFunctionsTest, SRC_NAME##To##DST_NAME) { \
  uint8 *y_pointer = NULL, *u_pointer = NULL, *v_pointer = NULL; \
  uint8 *argb_expected_pointer = NULL; \
  int y_pitch = kWidth; \
  int u_pitch = (kWidth + 1) >> 1; \
  int v_pitch = (kWidth + 1) >> 1; \
  /* Generate a fake input image.*/ \
  rtc::scoped_ptr<uint8[]> yuv_input( \
      CreateFakeYuvTestingImage(kHeight, kWidth, BLOCK_SIZE, JPG_TYPE, \
                                y_pointer, u_pointer, v_pointer)); \
  /* Generate the expected output.*/ \
  rtc::scoped_ptr<uint8[]> argb_expected( \
      CreateFakeArgbTestingImage(kHeight, kWidth, BLOCK_SIZE, \
                                 argb_expected_pointer, FOURCC_##DST_NAME)); \
  /* Allocate space for the output.*/ \
  rtc::scoped_ptr<uint8[]> argb_output( \
    new uint8[kHeight * kWidth * 4 + kAlignment]); \
  uint8 *argb_pointer = ALIGNP(argb_expected.get(), kAlignment); \
  for (int i = 0; i < repeat_; ++i) { \
    libyuv::SRC_NAME##To##DST_NAME(y_pointer, y_pitch, \
                                   u_pointer, u_pitch, \
                                   v_pointer, v_pitch, \
                                   argb_pointer, \
                                   kWidth * 4, \
                                   kWidth, kHeight); \
  } \
  EXPECT_TRUE(IsMemoryEqual(argb_expected_pointer, argb_pointer, \
                            kHeight * kWidth * 4, MSE)); \
  if (dump_) { DumpArgbImage(argb_pointer, kWidth, kHeight); } \
}

// TEST_F(PlanarFunctionsTest, I420ToARGB)
TEST_YUVTORGB(I420, ARGB, libyuv::kJpegYuv420, 3., 2);
// TEST_F(PlanarFunctionsTest, I420ToABGR)
TEST_YUVTORGB(I420, ABGR, libyuv::kJpegYuv420, 3., 2);
// TEST_F(PlanarFunctionsTest, I420ToBGRA)
TEST_YUVTORGB(I420, BGRA, libyuv::kJpegYuv420, 3., 2);
// TEST_F(PlanarFunctionsTest, I422ToARGB)
TEST_YUVTORGB(I422, ARGB, libyuv::kJpegYuv422, 3., 2);
// TEST_F(PlanarFunctionsTest, I444ToARGB)
TEST_YUVTORGB(I444, ARGB, libyuv::kJpegYuv444, 3., 3);
// Note: an empirical MSE tolerance 3.0 is used here for the probable
// error from float-to-uint8 type conversion.

TEST_F(PlanarFunctionsTest, I400ToARGB_Reference) {
  uint8 *y_pointer = NULL, *u_pointer = NULL, *v_pointer = NULL;
  int y_pitch = kWidth;
  int u_pitch = (kWidth + 1) >> 1;
  int v_pitch = (kWidth + 1) >> 1;
  int block_size = 3;
  // Generate a fake input image.
  rtc::scoped_ptr<uint8[]> yuv_input(
      CreateFakeYuvTestingImage(kHeight, kWidth, block_size,
                                libyuv::kJpegYuv420,
                                y_pointer, u_pointer, v_pointer));
  // As the comparison standard, we convert a grayscale image (by setting both
  // U and V channels to be 128) using an I420 converter.
  int uv_size = ((kHeight + 1) >> 1) * ((kWidth + 1) >> 1);

  rtc::scoped_ptr<uint8[]> uv(new uint8[uv_size + kAlignment]);
  u_pointer = v_pointer = ALIGNP(uv.get(), kAlignment);
  memset(u_pointer, 128, uv_size);

  // Allocate space for the output image and generate the expected output.
  rtc::scoped_ptr<uint8[]> argb_expected(
      new uint8[kHeight * kWidth * 4 + kAlignment]);
  rtc::scoped_ptr<uint8[]> argb_output(
      new uint8[kHeight * kWidth * 4 + kAlignment]);
  uint8 *argb_expected_pointer = ALIGNP(argb_expected.get(), kAlignment);
  uint8 *argb_pointer = ALIGNP(argb_output.get(), kAlignment);

  libyuv::I420ToARGB(y_pointer, y_pitch,
                     u_pointer, u_pitch,
                     v_pointer, v_pitch,
                     argb_expected_pointer, kWidth * 4,
                     kWidth, kHeight);
  for (int i = 0; i < repeat_; ++i) {
    libyuv::I400ToARGB_Reference(y_pointer, y_pitch,
                                 argb_pointer, kWidth * 4,
                                 kWidth, kHeight);
  }

  // Note: I420ToARGB and I400ToARGB_Reference should produce identical results.
  EXPECT_TRUE(IsMemoryEqual(argb_expected_pointer, argb_pointer,
                            kHeight * kWidth * 4, 2.));
  if (dump_) { DumpArgbImage(argb_pointer, kWidth, kHeight); }
}

TEST_P(PlanarFunctionsTest, I400ToARGB) {
  // Get the unalignment offset
  int unalignment = GetParam();
  uint8 *y_pointer = NULL, *u_pointer = NULL, *v_pointer = NULL;
  int y_pitch = kWidth;
  int u_pitch = (kWidth + 1) >> 1;
  int v_pitch = (kWidth + 1) >> 1;
  int block_size = 3;
  // Generate a fake input image.
  rtc::scoped_ptr<uint8[]> yuv_input(
      CreateFakeYuvTestingImage(kHeight, kWidth, block_size,
                                libyuv::kJpegYuv420,
                                y_pointer, u_pointer, v_pointer));
  // As the comparison standard, we convert a grayscale image (by setting both
  // U and V channels to be 128) using an I420 converter.
  int uv_size = ((kHeight + 1) >> 1) * ((kWidth + 1) >> 1);

  // 1 byte extra if in the unaligned mode.
  rtc::scoped_ptr<uint8[]> uv(new uint8[uv_size * 2 + kAlignment]);
  u_pointer = ALIGNP(uv.get(), kAlignment);
  v_pointer = u_pointer + uv_size;
  memset(u_pointer, 128, uv_size);
  memset(v_pointer, 128, uv_size);

  // Allocate space for the output image and generate the expected output.
  rtc::scoped_ptr<uint8[]> argb_expected(
      new uint8[kHeight * kWidth * 4 + kAlignment]);
  // 1 byte extra if in the misalinged mode.
  rtc::scoped_ptr<uint8[]> argb_output(
      new uint8[kHeight * kWidth * 4 + kAlignment + unalignment]);
  uint8 *argb_expected_pointer = ALIGNP(argb_expected.get(), kAlignment);
  uint8 *argb_pointer = ALIGNP(argb_output.get(), kAlignment) + unalignment;

  libyuv::I420ToARGB(y_pointer, y_pitch,
                     u_pointer, u_pitch,
                     v_pointer, v_pitch,
                     argb_expected_pointer, kWidth * 4,
                     kWidth, kHeight);
  for (int i = 0; i < repeat_; ++i) {
    libyuv::I400ToARGB(y_pointer, y_pitch,
                       argb_pointer, kWidth * 4,
                       kWidth, kHeight);
  }

  // Note: current I400ToARGB uses an approximate method,
  // so the error tolerance is larger here.
  EXPECT_TRUE(IsMemoryEqual(argb_expected_pointer, argb_pointer,
                            kHeight * kWidth * 4, 64.0));
  if (dump_) { DumpArgbImage(argb_pointer, kWidth, kHeight); }
}

TEST_P(PlanarFunctionsTest, ARGBToI400) {
  // Get the unalignment offset
  int unalignment = GetParam();
  // Create a fake ARGB input image.
  uint8 *y_pointer = NULL, *u_pointer = NULL, *v_pointer = NULL;
  uint8 *argb_pointer = NULL;
  int block_size = 3;
  // Generate a fake input image.
  rtc::scoped_ptr<uint8[]> argb_input(
      CreateFakeArgbTestingImage(kHeight, kWidth, block_size,
                                 argb_pointer, FOURCC_ARGB));
  // Generate the expected output. Only Y channel is used
  rtc::scoped_ptr<uint8[]> yuv_expected(
      CreateFakeYuvTestingImage(kHeight, kWidth, block_size,
                                libyuv::kJpegYuv420,
                                y_pointer, u_pointer, v_pointer));
  // Allocate space for the Y output.
  rtc::scoped_ptr<uint8[]> y_output(
    new uint8[kHeight * kWidth + kAlignment + unalignment]);
  uint8 *y_output_pointer = ALIGNP(y_output.get(), kAlignment) + unalignment;

  for (int i = 0; i < repeat_; ++i) {
    libyuv::ARGBToI400(argb_pointer, kWidth * 4, y_output_pointer, kWidth,
                       kWidth, kHeight);
  }
  // Check if the output matches the input Y channel.
  // Note: an empirical MSE tolerance 2.0 is used here for the probable
  // error from float-to-uint8 type conversion.
  EXPECT_TRUE(IsMemoryEqual(y_output_pointer, y_pointer,
                            kHeight * kWidth, 2.));
  if (dump_) { DumpArgbImage(argb_pointer, kWidth, kHeight); }
}

// A common macro for testing converting RAW, BG24, BGRA, and ABGR
// to ARGB.
#define TEST_ARGB(SRC_NAME, FC_ID, BPP, BLOCK_SIZE) \
TEST_P(PlanarFunctionsTest, SRC_NAME##ToARGB) { \
  int unalignment = GetParam();  /* Get the unalignment offset.*/ \
  uint8 *argb_expected_pointer = NULL, *src_pointer = NULL; \
  /* Generate a fake input image.*/ \
  rtc::scoped_ptr<uint8[]> src_input(  \
      CreateFakeArgbTestingImage(kHeight, kWidth, BLOCK_SIZE, \
                                 src_pointer, FOURCC_##FC_ID)); \
  /* Generate the expected output.*/ \
  rtc::scoped_ptr<uint8[]> argb_expected( \
      CreateFakeArgbTestingImage(kHeight, kWidth, BLOCK_SIZE, \
                                 argb_expected_pointer, FOURCC_ARGB)); \
  /* Allocate space for the output; 1 byte extra if in the unaligned mode.*/ \
  rtc::scoped_ptr<uint8[]> argb_output( \
      new uint8[kHeight * kWidth * 4 + kAlignment + unalignment]); \
  uint8 *argb_pointer = ALIGNP(argb_output.get(), kAlignment) + unalignment; \
  for (int i = 0; i < repeat_; ++i) { \
    libyuv:: SRC_NAME##ToARGB(src_pointer, kWidth * (BPP), argb_pointer, \
                              kWidth * 4, kWidth, kHeight); \
  } \
  /* Compare the result; expect identical.*/ \
  EXPECT_TRUE(IsMemoryEqual(argb_expected_pointer, argb_pointer, \
                            kHeight * kWidth * 4, 1.e-6)); \
  if (dump_) { DumpArgbImage(argb_pointer, kWidth, kHeight); } \
}

TEST_ARGB(RAW, RAW, 3, 3);    // TEST_P(PlanarFunctionsTest, RAWToARGB)
TEST_ARGB(BG24, 24BG, 3, 3);  // TEST_P(PlanarFunctionsTest, BG24ToARGB)
TEST_ARGB(ABGR, ABGR, 4, 3);  // TEST_P(PlanarFunctionsTest, ABGRToARGB)
TEST_ARGB(BGRA, BGRA, 4, 3);  // TEST_P(PlanarFunctionsTest, BGRAToARGB)

// Parameter Test: The parameter is the unalignment offset.
// Aligned data for testing assembly versions.
INSTANTIATE_TEST_CASE_P(PlanarFunctionsAligned, PlanarFunctionsTest,
    ::testing::Values(0));

// Purposely unalign the output argb pointer to test slow path (C version).
INSTANTIATE_TEST_CASE_P(PlanarFunctionsMisaligned, PlanarFunctionsTest,
    ::testing::Values(1));

}  // namespace cricket
