// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cobalt/media/base/video_util.h"

#include <memory>

#include "base/basictypes.h"
#include "cobalt/media/base/video_frame.h"
#include "starboard/memory.h"
#include "starboard/types.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {

// Initialize a plane's visible rect with value circularly from 0 to 255.
void FillPlaneWithPattern(uint8_t* data, int stride,
                          const math::Size& visible_size) {
  DCHECK(data && visible_size.width() <= stride);

  uint32_t val = 0;
  uint8_t* src = data;
  for (int i = 0; i < visible_size.height(); ++i, src += stride) {
    for (int j = 0; j < visible_size.width(); ++j, ++val) src[j] = val & 0xff;
  }
}

// Create a VideoFrame and initialize the visible rect using
// |FillPlaneWithPattern()|. For testing purpose, the VideoFrame should be
// filled with varying values, which is different from
// |VideoFrame::CreateColorFrame()| where the entrire VideoFrame is filled
// with a given color.
scoped_refptr<media::VideoFrame> CreateFrameWithPatternFilled(
    media::VideoPixelFormat format, const math::Size& coded_size,
    const math::Rect& visible_rect, const math::Size& natural_size,
    base::TimeDelta timestamp) {
  scoped_refptr<media::VideoFrame> frame(media::VideoFrame::CreateFrame(
      format, coded_size, visible_rect, natural_size, timestamp));

  FillPlaneWithPattern(frame->data(media::VideoFrame::kYPlane),
                       frame->stride(media::VideoFrame::kYPlane),
                       frame->visible_rect().size());
  FillPlaneWithPattern(
      frame->data(media::VideoFrame::kUPlane),
      frame->stride(media::VideoFrame::kUPlane),
      media::VideoFrame::PlaneSize(format, media::VideoFrame::kUPlane,
                                   frame->visible_rect().size()));
  FillPlaneWithPattern(
      frame->data(media::VideoFrame::kVPlane),
      frame->stride(media::VideoFrame::kVPlane),
      media::VideoFrame::PlaneSize(format, media::VideoFrame::kVPlane,
                                   frame->visible_rect().size()));
  return frame;
}

// Helper function used to verify the data in the coded region after copying the
// visible region and padding the remaining area.
bool VerifyPlanCopyWithPadding(const uint8_t* src, size_t src_stride,
                               // Size of visible region.
                               const math::Size& src_size, const uint8_t* dst,
                               size_t dst_stride,
                               // Coded size of |dst|.
                               const math::Size& dst_size) {
  if (!src || !dst) return false;

  const size_t src_width = src_size.width();
  const size_t src_height = src_size.height();
  const size_t dst_width = dst_size.width();
  const size_t dst_height = dst_size.height();
  if (src_width > dst_width || src_width > src_stride ||
      src_height > dst_height || src_size.IsEmpty() || dst_size.IsEmpty())
    return false;

  const uint8_t *src_ptr = src, *dst_ptr = dst;
  for (size_t i = 0; i < src_height;
       ++i, src_ptr += src_stride, dst_ptr += dst_stride) {
    if (SbMemoryCompare(src_ptr, dst_ptr, src_width)) return false;
    for (size_t j = src_width; j < dst_width; ++j) {
      if (src_ptr[src_width - 1] != dst_ptr[j]) return false;
    }
  }
  if (src_height < dst_height) {
    src_ptr = dst + (src_height - 1) * dst_stride;
    if (SbMemoryCompare(src_ptr, dst_ptr, dst_width)) return false;
  }
  return true;
}

bool VerifyCopyWithPadding(const media::VideoFrame& src_frame,
                           const media::VideoFrame& dst_frame) {
  if (!src_frame.IsMappable() || !dst_frame.IsMappable() ||
      src_frame.visible_rect().size() != dst_frame.visible_rect().size())
    return false;

  if (!VerifyPlanCopyWithPadding(
          src_frame.visible_data(media::VideoFrame::kYPlane),
          src_frame.stride(media::VideoFrame::kYPlane),
          src_frame.visible_rect().size(),
          dst_frame.data(media::VideoFrame::kYPlane),
          dst_frame.stride(media::VideoFrame::kYPlane), dst_frame.coded_size()))
    return false;
  if (!VerifyPlanCopyWithPadding(
          src_frame.visible_data(media::VideoFrame::kUPlane),
          src_frame.stride(media::VideoFrame::kUPlane),
          media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
                                       media::VideoFrame::kUPlane,
                                       src_frame.visible_rect().size()),
          dst_frame.data(media::VideoFrame::kUPlane),
          dst_frame.stride(media::VideoFrame::kUPlane),
          media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
                                       media::VideoFrame::kUPlane,
                                       dst_frame.coded_size())))
    return false;
  if (!VerifyPlanCopyWithPadding(
          src_frame.visible_data(media::VideoFrame::kVPlane),
          src_frame.stride(media::VideoFrame::kVPlane),
          media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
                                       media::VideoFrame::kVPlane,
                                       src_frame.visible_rect().size()),
          dst_frame.data(media::VideoFrame::kVPlane),
          dst_frame.stride(media::VideoFrame::kVPlane),
          media::VideoFrame::PlaneSize(media::PIXEL_FORMAT_I420,
                                       media::VideoFrame::kVPlane,
                                       dst_frame.coded_size())))
    return false;

  return true;
}

}  // namespace

namespace cobalt {
namespace media {

class VideoUtilTest : public testing::Test {
 public:
  VideoUtilTest() : height_(0), y_stride_(0), u_stride_(0), v_stride_(0) {}

  ~VideoUtilTest() override {}

  void CreateSourceFrame(int width, int height, int y_stride, int u_stride,
                         int v_stride) {
    EXPECT_GE(y_stride, width);
    EXPECT_GE(u_stride, width / 2);
    EXPECT_GE(v_stride, width / 2);

    height_ = height;
    y_stride_ = y_stride;
    u_stride_ = u_stride;
    v_stride_ = v_stride;

    y_plane_.reset(new uint8_t[y_stride * height]);
    u_plane_.reset(new uint8_t[u_stride * height / 2]);
    v_plane_.reset(new uint8_t[v_stride * height / 2]);
  }

  void CreateDestinationFrame(int width, int height) {
    math::Size size(width, height);
    destination_frame_ = VideoFrame::CreateFrame(
        PIXEL_FORMAT_YV12, size, math::Rect(size), size, base::TimeDelta());
  }

 private:
  std::unique_ptr<uint8_t[]> y_plane_;
  std::unique_ptr<uint8_t[]> u_plane_;
  std::unique_ptr<uint8_t[]> v_plane_;

  int height_;
  int y_stride_;
  int u_stride_;
  int v_stride_;

  scoped_refptr<VideoFrame> destination_frame_;

  DISALLOW_COPY_AND_ASSIGN(VideoUtilTest);
};

TEST_F(VideoUtilTest, GetNaturalSize) {
  math::Size visible_size(320, 240);

  // Test 0 sizes.
  EXPECT_EQ(math::Size(0, 0), GetNaturalSize(math::Size(0, 0), 1, 1));
  EXPECT_EQ(math::Size(0, 1), GetNaturalSize(math::Size(0, 1), 1, 1));
  EXPECT_EQ(math::Size(1, 0), GetNaturalSize(math::Size(1, 0), 1, 1));

  // Test abnormal ratios.
  EXPECT_EQ(math::Size(0, 0), GetNaturalSize(visible_size, 0, 0));
  EXPECT_EQ(math::Size(0, 0), GetNaturalSize(visible_size, 1, 0));
  EXPECT_EQ(math::Size(0, 0), GetNaturalSize(visible_size, 1, -1));
  EXPECT_EQ(math::Size(0, 0), GetNaturalSize(visible_size, -1, 1));

  // Test normal sizes and ratios.
  EXPECT_EQ(math::Size(0, 240), GetNaturalSize(visible_size, 0, 1));
  EXPECT_EQ(math::Size(320, 240), GetNaturalSize(visible_size, 1, 1));
  EXPECT_EQ(math::Size(640, 240), GetNaturalSize(visible_size, 2, 1));
  EXPECT_EQ(math::Size(160, 240), GetNaturalSize(visible_size, 1, 2));
  EXPECT_EQ(math::Size(427, 240), GetNaturalSize(visible_size, 4, 3));
  EXPECT_EQ(math::Size(240, 240), GetNaturalSize(visible_size, 3, 4));
  EXPECT_EQ(math::Size(569, 240), GetNaturalSize(visible_size, 16, 9));
  EXPECT_EQ(math::Size(180, 240), GetNaturalSize(visible_size, 9, 16));

  // Test some random ratios.
  EXPECT_EQ(math::Size(495, 240), GetNaturalSize(visible_size, 17, 11));
  EXPECT_EQ(math::Size(207, 240), GetNaturalSize(visible_size, 11, 17));
}

namespace {

uint8_t src6x4[] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11,
                    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23};

// Target images, name pattern target_rotation_flipV_flipH.
uint8_t* target6x4_0_n_n = src6x4;

uint8_t target6x4_0_n_y[] = {5,  4,  3,  2,  1,  0,  11, 10, 9,  8,  7,  6,
                             17, 16, 15, 14, 13, 12, 23, 22, 21, 20, 19, 18};

uint8_t target6x4_0_y_n[] = {18, 19, 20, 21, 22, 23, 12, 13, 14, 15, 16, 17,
                             6,  7,  8,  9,  10, 11, 0,  1,  2,  3,  4,  5};

uint8_t target6x4_0_y_y[] = {23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12,
                             11, 10, 9,  8,  7,  6,  5,  4,  3,  2,  1,  0};

uint8_t target6x4_90_n_n[] = {255, 19, 13, 7, 1, 255, 255, 20, 14, 8,  2, 255,
                              255, 21, 15, 9, 3, 255, 255, 22, 16, 10, 4, 255};

uint8_t target6x4_90_n_y[] = {255, 1, 7, 13, 19, 255, 255, 2, 8,  14, 20, 255,
                              255, 3, 9, 15, 21, 255, 255, 4, 10, 16, 22, 255};

uint8_t target6x4_90_y_n[] = {255, 22, 16, 10, 4, 255, 255, 21, 15, 9, 3, 255,
                              255, 20, 14, 8,  2, 255, 255, 19, 13, 7, 1, 255};

uint8_t target6x4_90_y_y[] = {255, 4, 10, 16, 22, 255, 255, 3, 9, 15, 21, 255,
                              255, 2, 8,  14, 20, 255, 255, 1, 7, 13, 19, 255};

uint8_t* target6x4_180_n_n = target6x4_0_y_y;
uint8_t* target6x4_180_n_y = target6x4_0_y_n;
uint8_t* target6x4_180_y_n = target6x4_0_n_y;
uint8_t* target6x4_180_y_y = target6x4_0_n_n;

uint8_t* target6x4_270_n_n = target6x4_90_y_y;
uint8_t* target6x4_270_n_y = target6x4_90_y_n;
uint8_t* target6x4_270_y_n = target6x4_90_n_y;
uint8_t* target6x4_270_y_y = target6x4_90_n_n;

uint8_t src4x6[] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11,
                    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23};

uint8_t* target4x6_0_n_n = src4x6;

uint8_t target4x6_0_n_y[] = {3,  2,  1,  0,  7,  6,  5,  4,  11, 10, 9,  8,
                             15, 14, 13, 12, 19, 18, 17, 16, 23, 22, 21, 20};

uint8_t target4x6_0_y_n[] = {20, 21, 22, 23, 16, 17, 18, 19, 12, 13, 14, 15,
                             8,  9,  10, 11, 4,  5,  6,  7,  0,  1,  2,  3};

uint8_t target4x6_0_y_y[] = {23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12,
                             11, 10, 9,  8,  7,  6,  5,  4,  3,  2,  1,  0};

uint8_t target4x6_90_n_n[] = {255, 255, 255, 255, 16,  12,  8,   4,
                              17,  13,  9,   5,   18,  14,  10,  6,
                              19,  15,  11,  7,   255, 255, 255, 255};

uint8_t target4x6_90_n_y[] = {255, 255, 255, 255, 4,   8,   12,  16,
                              5,   9,   13,  17,  6,   10,  14,  18,
                              7,   11,  15,  19,  255, 255, 255, 255};

uint8_t target4x6_90_y_n[] = {255, 255, 255, 255, 19,  15,  11,  7,
                              18,  14,  10,  6,   17,  13,  9,   5,
                              16,  12,  8,   4,   255, 255, 255, 255};

uint8_t target4x6_90_y_y[] = {255, 255, 255, 255, 7,   11,  15,  19,
                              6,   10,  14,  18,  5,   9,   13,  17,
                              4,   8,   12,  16,  255, 255, 255, 255};

uint8_t* target4x6_180_n_n = target4x6_0_y_y;
uint8_t* target4x6_180_n_y = target4x6_0_y_n;
uint8_t* target4x6_180_y_n = target4x6_0_n_y;
uint8_t* target4x6_180_y_y = target4x6_0_n_n;

uint8_t* target4x6_270_n_n = target4x6_90_y_y;
uint8_t* target4x6_270_n_y = target4x6_90_y_n;
uint8_t* target4x6_270_y_n = target4x6_90_n_y;
uint8_t* target4x6_270_y_y = target4x6_90_n_n;

struct VideoRotationTestData {
  uint8_t* src;
  uint8_t* target;
  int width;
  int height;
  int rotation;
  bool flip_vert;
  bool flip_horiz;
};

const VideoRotationTestData kVideoRotationTestData[] = {
    {src6x4, target6x4_0_n_n, 6, 4, 0, false, false},
    {src6x4, target6x4_0_n_y, 6, 4, 0, false, true},
    {src6x4, target6x4_0_y_n, 6, 4, 0, true, false},
    {src6x4, target6x4_0_y_y, 6, 4, 0, true, true},

    {src6x4, target6x4_90_n_n, 6, 4, 90, false, false},
    {src6x4, target6x4_90_n_y, 6, 4, 90, false, true},
    {src6x4, target6x4_90_y_n, 6, 4, 90, true, false},
    {src6x4, target6x4_90_y_y, 6, 4, 90, true, true},

    {src6x4, target6x4_180_n_n, 6, 4, 180, false, false},
    {src6x4, target6x4_180_n_y, 6, 4, 180, false, true},
    {src6x4, target6x4_180_y_n, 6, 4, 180, true, false},
    {src6x4, target6x4_180_y_y, 6, 4, 180, true, true},

    {src6x4, target6x4_270_n_n, 6, 4, 270, false, false},
    {src6x4, target6x4_270_n_y, 6, 4, 270, false, true},
    {src6x4, target6x4_270_y_n, 6, 4, 270, true, false},
    {src6x4, target6x4_270_y_y, 6, 4, 270, true, true},

    {src4x6, target4x6_0_n_n, 4, 6, 0, false, false},
    {src4x6, target4x6_0_n_y, 4, 6, 0, false, true},
    {src4x6, target4x6_0_y_n, 4, 6, 0, true, false},
    {src4x6, target4x6_0_y_y, 4, 6, 0, true, true},

    {src4x6, target4x6_90_n_n, 4, 6, 90, false, false},
    {src4x6, target4x6_90_n_y, 4, 6, 90, false, true},
    {src4x6, target4x6_90_y_n, 4, 6, 90, true, false},
    {src4x6, target4x6_90_y_y, 4, 6, 90, true, true},

    {src4x6, target4x6_180_n_n, 4, 6, 180, false, false},
    {src4x6, target4x6_180_n_y, 4, 6, 180, false, true},
    {src4x6, target4x6_180_y_n, 4, 6, 180, true, false},
    {src4x6, target4x6_180_y_y, 4, 6, 180, true, true},

    {src4x6, target4x6_270_n_n, 4, 6, 270, false, false},
    {src4x6, target4x6_270_n_y, 4, 6, 270, false, true},
    {src4x6, target4x6_270_y_n, 4, 6, 270, true, false},
    {src4x6, target4x6_270_y_y, 4, 6, 270, true, true}};

}  // namespace

class VideoUtilRotationTest
    : public testing::TestWithParam<VideoRotationTestData> {
 public:
  VideoUtilRotationTest() {
    dest_.reset(new uint8_t[GetParam().width * GetParam().height]);
  }

  virtual ~VideoUtilRotationTest() {}

  uint8_t* dest_plane() { return dest_.get(); }

 private:
  std::unique_ptr<uint8_t[]> dest_;

  DISALLOW_COPY_AND_ASSIGN(VideoUtilRotationTest);
};

TEST_P(VideoUtilRotationTest, Rotate) {
  int rotation = GetParam().rotation;
  EXPECT_TRUE((rotation >= 0) && (rotation < 360) && (rotation % 90 == 0));

  int size = GetParam().width * GetParam().height;
  uint8_t* dest = dest_plane();
  SbMemorySet(dest, 255, size);

  RotatePlaneByPixels(GetParam().src, dest, GetParam().width, GetParam().height,
                      rotation, GetParam().flip_vert, GetParam().flip_horiz);

  EXPECT_EQ(SbMemoryCompare(dest, GetParam().target, size), 0);
}

INSTANTIATE_TEST_CASE_P(, VideoUtilRotationTest,
                        testing::ValuesIn(kVideoRotationTestData));

// Tests the ComputeLetterboxRegion function.  Also, because of shared code
// internally, this also tests ScaleSizeToFitWithinTarget().
TEST_F(VideoUtilTest, ComputeLetterboxRegion) {
  EXPECT_EQ(math::Rect(166, 0, 667, 500),
            ComputeLetterboxRegion(math::Rect(0, 0, 1000, 500),
                                   math::Size(640, 480)));
  EXPECT_EQ(math::Rect(0, 312, 500, 375),
            ComputeLetterboxRegion(math::Rect(0, 0, 500, 1000),
                                   math::Size(640, 480)));
  EXPECT_EQ(math::Rect(55, 0, 889, 500),
            ComputeLetterboxRegion(math::Rect(0, 0, 1000, 500),
                                   math::Size(1920, 1080)));
  EXPECT_EQ(
      math::Rect(0, 12, 100, 75),
      ComputeLetterboxRegion(math::Rect(0, 0, 100, 100), math::Size(400, 300)));
  EXPECT_EQ(math::Rect(0, 250000000, 2000000000, 1500000000),
            ComputeLetterboxRegion(math::Rect(0, 0, 2000000000, 2000000000),
                                   math::Size(40000, 30000)));
  EXPECT_TRUE(ComputeLetterboxRegion(math::Rect(0, 0, 2000000000, 2000000000),
                                     math::Size(0, 0))
                  .IsEmpty());
}

TEST_F(VideoUtilTest, ScaleSizeToEncompassTarget) {
  EXPECT_EQ(
      math::Size(1000, 750),
      ScaleSizeToEncompassTarget(math::Size(640, 480), math::Size(1000, 500)));
  EXPECT_EQ(
      math::Size(1333, 1000),
      ScaleSizeToEncompassTarget(math::Size(640, 480), math::Size(500, 1000)));
  EXPECT_EQ(math::Size(1000, 563),
            ScaleSizeToEncompassTarget(math::Size(1920, 1080),
                                       math::Size(1000, 500)));
  EXPECT_EQ(
      math::Size(133, 100),
      ScaleSizeToEncompassTarget(math::Size(400, 300), math::Size(100, 100)));
  EXPECT_EQ(math::Size(266666667, 200000000),
            ScaleSizeToEncompassTarget(math::Size(40000, 30000),
                                       math::Size(200000000, 200000000)));
  EXPECT_TRUE(ScaleSizeToEncompassTarget(math::Size(0, 0),
                                         math::Size(2000000000, 2000000000))
                  .IsEmpty());
}

TEST_F(VideoUtilTest, PadToMatchAspectRatio) {
  EXPECT_EQ(math::Size(640, 480),
            PadToMatchAspectRatio(math::Size(640, 480), math::Size(640, 480)));
  EXPECT_EQ(math::Size(640, 480),
            PadToMatchAspectRatio(math::Size(640, 480), math::Size(4, 3)));
  EXPECT_EQ(math::Size(960, 480),
            PadToMatchAspectRatio(math::Size(640, 480), math::Size(1000, 500)));
  EXPECT_EQ(math::Size(640, 1280),
            PadToMatchAspectRatio(math::Size(640, 480), math::Size(500, 1000)));
  EXPECT_EQ(
      math::Size(2160, 1080),
      PadToMatchAspectRatio(math::Size(1920, 1080), math::Size(1000, 500)));
  EXPECT_EQ(math::Size(400, 400),
            PadToMatchAspectRatio(math::Size(400, 300), math::Size(100, 100)));
  EXPECT_EQ(math::Size(400, 400),
            PadToMatchAspectRatio(math::Size(300, 400), math::Size(100, 100)));
  EXPECT_EQ(math::Size(40000, 40000),
            PadToMatchAspectRatio(math::Size(40000, 30000),
                                  math::Size(2000000000, 2000000000)));
  EXPECT_TRUE(PadToMatchAspectRatio(math::Size(40000, 30000), math::Size(0, 0))
                  .IsEmpty());
}

TEST_F(VideoUtilTest, LetterboxYUV) {
  int width = 40;
  int height = 30;
  math::Size size(width, height);
  scoped_refptr<VideoFrame> frame(VideoFrame::CreateFrame(
      PIXEL_FORMAT_YV12, size, math::Rect(size), size, base::TimeDelta()));

  for (int left_margin = 0; left_margin <= 10; left_margin += 10) {
    for (int right_margin = 0; right_margin <= 10; right_margin += 10) {
      for (int top_margin = 0; top_margin <= 10; top_margin += 10) {
        for (int bottom_margin = 0; bottom_margin <= 10; bottom_margin += 10) {
          math::Rect view_area(left_margin, top_margin,
                               width - left_margin - right_margin,
                               height - top_margin - bottom_margin);
          FillYUV(frame.get(), 0x1, 0x2, 0x3);
          LetterboxYUV(frame.get(), view_area);
          for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
              bool inside =
                  x >= view_area.x() && x < view_area.x() + view_area.width() &&
                  y >= view_area.y() && y < view_area.y() + view_area.height();
              EXPECT_EQ(frame->data(VideoFrame::kYPlane)
                            [y * frame->stride(VideoFrame::kYPlane) + x],
                        inside ? 0x01 : 0x00);
              EXPECT_EQ(
                  frame->data(VideoFrame::kUPlane)
                      [(y / 2) * frame->stride(VideoFrame::kUPlane) + (x / 2)],
                  inside ? 0x02 : 0x80);
              EXPECT_EQ(
                  frame->data(VideoFrame::kVPlane)
                      [(y / 2) * frame->stride(VideoFrame::kVPlane) + (x / 2)],
                  inside ? 0x03 : 0x80);
            }
          }
        }
      }
    }
  }
}

TEST_F(VideoUtilTest, I420CopyWithPadding) {
  math::Size visible_size(40, 30);
  scoped_refptr<VideoFrame> src_frame = CreateFrameWithPatternFilled(
      PIXEL_FORMAT_I420, visible_size, math::Rect(visible_size), visible_size,
      base::TimeDelta());
  // Expect to return false when copying to an empty buffer.
  EXPECT_FALSE(I420CopyWithPadding(*src_frame, NULL));

  scoped_refptr<VideoFrame> dst_frame = CreateFrameWithPatternFilled(
      PIXEL_FORMAT_I420, visible_size, math::Rect(visible_size), visible_size,
      base::TimeDelta());
  EXPECT_TRUE(I420CopyWithPadding(*src_frame, dst_frame.get()));
  EXPECT_TRUE(VerifyCopyWithPadding(*src_frame, *dst_frame));

  math::Size coded_size(60, 40);
  dst_frame = CreateFrameWithPatternFilled(PIXEL_FORMAT_I420, coded_size,
                                           math::Rect(visible_size), coded_size,
                                           base::TimeDelta());
  EXPECT_TRUE(I420CopyWithPadding(*src_frame, dst_frame.get()));
  EXPECT_TRUE(VerifyCopyWithPadding(*src_frame, *dst_frame));

  math::Size odd_size(39, 31);
  src_frame = CreateFrameWithPatternFilled(PIXEL_FORMAT_I420, odd_size,
                                           math::Rect(odd_size), odd_size,
                                           base::TimeDelta());
  dst_frame = CreateFrameWithPatternFilled(PIXEL_FORMAT_I420, coded_size,
                                           math::Rect(odd_size), coded_size,
                                           base::TimeDelta());
  EXPECT_TRUE(I420CopyWithPadding(*src_frame, dst_frame.get()));
  EXPECT_TRUE(VerifyCopyWithPadding(*src_frame, *dst_frame));
}

}  // namespace media
}  // namespace cobalt
