webrtc_video_frame_adapter_unittest.cc 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "remoting/protocol/webrtc_video_frame_adapter.h"
  5. #include <memory>
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
  8. #include "third_party/webrtc/rtc_base/ref_counted_object.h"
  9. using webrtc::BasicDesktopFrame;
  10. using webrtc::DesktopFrame;
  11. using webrtc::DesktopRect;
  12. using webrtc::DesktopSize;
  13. using webrtc::VideoFrame;
  14. namespace {
  15. std::unique_ptr<DesktopFrame> MakeDesktopFrame(int width, int height) {
  16. return std::make_unique<BasicDesktopFrame>(DesktopSize(width, height));
  17. }
  18. } // namespace
  19. namespace remoting {
  20. namespace protocol {
  21. TEST(WebrtcVideoFrameAdapter, CreateVideoFrameWrapsDesktopFrame) {
  22. auto desktop_frame = MakeDesktopFrame(100, 200);
  23. auto frame_stats = std::make_unique<WebrtcVideoEncoder::FrameStats>();
  24. DesktopFrame* desktop_frame_ptr = desktop_frame.get();
  25. VideoFrame video_frame = WebrtcVideoFrameAdapter::CreateVideoFrame(
  26. std::move(desktop_frame), std::move(frame_stats));
  27. auto* adapter = static_cast<WebrtcVideoFrameAdapter*>(
  28. video_frame.video_frame_buffer().get());
  29. auto wrapped_desktop_frame = adapter->TakeDesktopFrame();
  30. EXPECT_EQ(wrapped_desktop_frame.get(), desktop_frame_ptr);
  31. }
  32. TEST(WebrtcVideoFrameAdapter, AdapterHasCorrectSize) {
  33. auto desktop_frame = MakeDesktopFrame(100, 200);
  34. auto frame_stats = std::make_unique<WebrtcVideoEncoder::FrameStats>();
  35. rtc::scoped_refptr<WebrtcVideoFrameAdapter> adapter(
  36. new rtc::RefCountedObject<WebrtcVideoFrameAdapter>(
  37. std::move(desktop_frame), std::move(frame_stats)));
  38. EXPECT_EQ(100, adapter->width());
  39. EXPECT_EQ(200, adapter->height());
  40. }
  41. TEST(WebrtcVideoFrameAdapter, EmptyUpdateRegionGivesFrameWithEmptyUpdateRect) {
  42. auto desktop_frame = MakeDesktopFrame(100, 200);
  43. ASSERT_TRUE(desktop_frame->updated_region().is_empty());
  44. auto frame_stats = std::make_unique<WebrtcVideoEncoder::FrameStats>();
  45. VideoFrame video_frame = WebrtcVideoFrameAdapter::CreateVideoFrame(
  46. std::move(desktop_frame), std::move(frame_stats));
  47. EXPECT_TRUE(video_frame.update_rect().IsEmpty());
  48. }
  49. TEST(WebrtcVideoFrameAdapter, VideoUpdateRectSpansDesktopUpdateRegion) {
  50. auto desktop_frame = MakeDesktopFrame(100, 200);
  51. desktop_frame->mutable_updated_region()->AddRect(
  52. DesktopRect::MakeLTRB(10, 20, 30, 40));
  53. desktop_frame->mutable_updated_region()->AddRect(
  54. DesktopRect::MakeLTRB(50, 60, 70, 80));
  55. auto frame_stats = std::make_unique<WebrtcVideoEncoder::FrameStats>();
  56. VideoFrame video_frame = WebrtcVideoFrameAdapter::CreateVideoFrame(
  57. std::move(desktop_frame), std::move(frame_stats));
  58. EXPECT_EQ(video_frame.update_rect(),
  59. (VideoFrame::UpdateRect{
  60. .offset_x = 10, .offset_y = 20, .width = 60, .height = 60}));
  61. }
  62. } // namespace protocol
  63. } // namespace remoting