diff options
author | Ilya Nikolaevskiy <ilnik@webrtc.org> | 2018-12-21 14:21:08 +0100 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2018-12-21 14:24:48 +0000 |
commit | a921660060ba1373ae0007b4984835949c2414c1 (patch) | |
tree | 4d7daa9bbe92dbf2a0f6942edd047df052473d7d /common_video/video_frame_unittest.cc | |
parent | da0222b3fcdcd2b9f9e79effc9995afa62f23693 (diff) | |
download | webrtc-a921660060ba1373ae0007b4984835949c2414c1.tar.gz |
Add ability to paste VideoFrameBuffer into the middle of I010Buffer and I420Buffer
Bug: webrtc:10152
Change-Id: I721136a3ba3604f0c685ef28637fb84fcf94778e
Reviewed-on: https://webrtc-review.googlesource.com/c/115300
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26089}
Diffstat (limited to 'common_video/video_frame_unittest.cc')
-rw-r--r-- | common_video/video_frame_unittest.cc | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/common_video/video_frame_unittest.cc b/common_video/video_frame_unittest.cc index a4b110b6b9..9d01339146 100644 --- a/common_video/video_frame_unittest.cc +++ b/common_video/video_frame_unittest.cc @@ -226,6 +226,47 @@ void CheckRotate(int width, } } +int GetU(rtc::scoped_refptr<PlanarYuvBuffer> buf, int col, int row) { + if (buf->type() == VideoFrameBuffer::Type::kI420) { + return buf->GetI420() + ->DataU()[row / 2 * buf->GetI420()->StrideU() + col / 2]; + } else { + return buf->GetI010() + ->DataU()[row / 2 * buf->GetI010()->StrideU() + col / 2]; + } +} + +int GetV(rtc::scoped_refptr<PlanarYuvBuffer> buf, int col, int row) { + if (buf->type() == VideoFrameBuffer::Type::kI420) { + return buf->GetI420() + ->DataV()[row / 2 * buf->GetI420()->StrideV() + col / 2]; + } else { + return buf->GetI010() + ->DataV()[row / 2 * buf->GetI010()->StrideV() + col / 2]; + } +} + +int GetY(rtc::scoped_refptr<PlanarYuvBuffer> buf, int col, int row) { + if (buf->type() == VideoFrameBuffer::Type::kI420) { + return buf->GetI420()->DataY()[row * buf->GetI420()->StrideY() + col]; + } else { + return buf->GetI010()->DataY()[row * buf->GetI010()->StrideY() + col]; + } +} + +void PasteFromBuffer(PlanarYuvBuffer* canvas, + const PlanarYuvBuffer& picture, + int offset_col, + int offset_row) { + if (canvas->type() == VideoFrameBuffer::Type::kI420) { + I420Buffer* buf = static_cast<I420Buffer*>(canvas); + buf->PasteFrom(*picture.GetI420(), offset_col, offset_row); + } else { + I010Buffer* buf = static_cast<I010Buffer*>(canvas); + buf->PasteFrom(*picture.GetI010(), offset_col, offset_row); + } +} + } // namespace TEST(TestVideoFrame, WidthHeightValues) { @@ -404,6 +445,43 @@ TEST_P(TestPlanarYuvBuffer, CropAndScale16x9) { CheckCrop(*scaled_buffer->ToI420(), 0.0, 0.125, 1.0, 0.75); } +TEST_P(TestPlanarYuvBuffer, PastesIntoBuffer) { + const int kOffsetx = 20; + const int kOffsety = 30; + const int kPicSize = 20; + const int kWidth = 160; + const int kHeight = 80; + rtc::scoped_refptr<PlanarYuvBuffer> buf = + CreateGradient(GetParam(), kWidth, kHeight); + + rtc::scoped_refptr<PlanarYuvBuffer> original = + CreateGradient(GetParam(), kWidth, kHeight); + + rtc::scoped_refptr<PlanarYuvBuffer> picture = + CreateGradient(GetParam(), kPicSize, kPicSize); + + rtc::scoped_refptr<PlanarYuvBuffer> odd_picture = + CreateGradient(GetParam(), kPicSize + 1, kPicSize - 1); + + PasteFromBuffer(buf.get(), *picture, kOffsetx, kOffsety); + + for (int i = 0; i < kWidth; ++i) { + for (int j = 0; j < kHeight; ++j) { + bool is_inside = i >= kOffsetx && i < kOffsetx + kPicSize && + j >= kOffsety && j < kOffsety + kPicSize; + if (!is_inside) { + EXPECT_EQ(GetU(original, i, j), GetU(buf, i, j)); + EXPECT_EQ(GetV(original, i, j), GetV(buf, i, j)); + EXPECT_EQ(GetY(original, i, j), GetY(buf, i, j)); + } else { + EXPECT_EQ(GetU(picture, i - kOffsetx, j - kOffsety), GetU(buf, i, j)); + EXPECT_EQ(GetV(picture, i - kOffsetx, j - kOffsety), GetV(buf, i, j)); + EXPECT_EQ(GetY(picture, i - kOffsetx, j - kOffsety), GetY(buf, i, j)); + } + } + } +} + INSTANTIATE_TEST_CASE_P(, TestPlanarYuvBuffer, ::testing::Values(VideoFrameBuffer::Type::kI420, |