buffer_validation_unittest.cc 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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 "media/gpu/buffer_validation.h"
  5. #include <fcntl.h>
  6. #include "base/bind.h"
  7. #include "base/files/scoped_file.h"
  8. #include "media/base/video_frame.h"
  9. #include "media/base/video_types.h"
  10. #include "media/video/fake_gpu_memory_buffer.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. #include "ui/gfx/buffer_types.h"
  13. #include "ui/gfx/gpu_memory_buffer.h"
  14. #include "ui/gfx/native_pixmap_handle.h"
  15. namespace media {
  16. namespace {
  17. base::ScopedFD GetDummyFD() {
  18. base::ScopedFD fd(open("/dev/zero", O_RDWR));
  19. DCHECK(fd.is_valid());
  20. return fd;
  21. }
  22. size_t FileSizeForTesting(size_t size) {
  23. return size;
  24. }
  25. TEST(BufferValidationTest, VerifyGmbHandlePasses) {
  26. gfx::GpuMemoryBufferHandle gmb_handle;
  27. gmb_handle.type = gfx::NATIVE_PIXMAP;
  28. gmb_handle.native_pixmap_handle.planes.emplace_back(
  29. /*stride=*/50, /*offset=*/0, /*size=*/2500, GetDummyFD());
  30. gmb_handle.native_pixmap_handle.planes.emplace_back(
  31. /*stride=*/25, /*offset=*/2500, /*size=*/625, GetDummyFD());
  32. gmb_handle.native_pixmap_handle.planes.emplace_back(
  33. /*stride=*/25, /*offset=*/3125, /*size=*/625, GetDummyFD());
  34. constexpr size_t buffer_size = 2500 + 2 * 625;
  35. const gfx::Size size(50, 50);
  36. EXPECT_TRUE(VerifyGpuMemoryBufferHandle(
  37. PIXEL_FORMAT_I420, size, gmb_handle,
  38. base::BindRepeating(FileSizeForTesting, buffer_size)));
  39. }
  40. TEST(BufferValidationTest, VerifyGmbHandleInvalidType) {
  41. gfx::GpuMemoryBufferHandle gmb_handle;
  42. gmb_handle.type = gfx::EMPTY_BUFFER;
  43. const gfx::Size size(50, 50);
  44. EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
  45. PIXEL_FORMAT_I420, size, gmb_handle,
  46. base::BindRepeating(FileSizeForTesting, size.GetArea() * 2)));
  47. }
  48. TEST(BufferValidationTest, VerifyGmbHandlePlanesCountMatches) {
  49. gfx::GpuMemoryBufferHandle gmb_handle;
  50. gmb_handle.type = gfx::NATIVE_PIXMAP;
  51. gmb_handle.native_pixmap_handle.planes.emplace_back(
  52. /*stride=*/50, /*offset=*/0, /*size=*/2500, GetDummyFD());
  53. gmb_handle.native_pixmap_handle.planes.emplace_back(
  54. /*stride=*/25, /*offset=*/2500, /*size=*/625, GetDummyFD());
  55. gmb_handle.native_pixmap_handle.planes.emplace_back(
  56. /*stride=*/25, /*offset=*/3125, /*size=*/625, GetDummyFD());
  57. constexpr size_t buffer_size = 2500 + 2 * 625;
  58. const gfx::Size size(50, 50);
  59. // PIXEL_FORMAT_UYVY has only 1 plane
  60. // (https://source.chromium.org/chromium/chromium/src/+/main:media/base/video_frame_layout.cc;l=46;drc=eb5094ebb2c2a4128d36d27806b286d288965746)
  61. // The gmb handle will have only 3 planes by default.
  62. EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
  63. PIXEL_FORMAT_UYVY, size, gmb_handle,
  64. base::BindRepeating(FileSizeForTesting, buffer_size)));
  65. }
  66. TEST(BufferValidationTest, VerifyGmbHandleStridesMonotonicallyDecrease) {
  67. gfx::GpuMemoryBufferHandle gmb_handle;
  68. gmb_handle.type = gfx::NATIVE_PIXMAP;
  69. // Make strides increase. Normal expectation is that they monotonically
  70. // decrease.
  71. gmb_handle.native_pixmap_handle.planes.emplace_back(
  72. /*stride=*/50, /*offset=*/0, /*size=*/2500, GetDummyFD());
  73. gmb_handle.native_pixmap_handle.planes.emplace_back(
  74. /*stride=*/60, /*offset=*/2500, /*size=*/1500, GetDummyFD());
  75. gmb_handle.native_pixmap_handle.planes.emplace_back(
  76. /*stride=*/70, /*offset=*/4000, /*size=*/1750, GetDummyFD());
  77. constexpr size_t buffer_size = 2500 + 1500 + 1750;
  78. const gfx::Size size(50, 50);
  79. EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
  80. PIXEL_FORMAT_I420, size, gmb_handle,
  81. base::BindRepeating(FileSizeForTesting, buffer_size)));
  82. }
  83. TEST(BufferValidationTest, VerifyGmbHandleInvalidPlaneHeight) {
  84. gfx::GpuMemoryBufferHandle gmb_handle;
  85. gmb_handle.type = gfx::NATIVE_PIXMAP;
  86. gmb_handle.native_pixmap_handle.planes.emplace_back(
  87. /*stride=*/50, /*offset=*/0, /*size=*/2500, GetDummyFD());
  88. gmb_handle.native_pixmap_handle.planes.emplace_back(
  89. /*stride=*/25, /*offset=*/2500, /*size=*/625, GetDummyFD());
  90. gmb_handle.native_pixmap_handle.planes.emplace_back(
  91. /*stride=*/25, /*offset=*/3125, /*size=*/625, GetDummyFD());
  92. constexpr size_t buffer_size = 2500 + 2 * 625;
  93. // Make the height greater than the planes'.
  94. const gfx::Size size(50, 100);
  95. EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
  96. PIXEL_FORMAT_I420, size, gmb_handle,
  97. base::BindRepeating(FileSizeForTesting, buffer_size)));
  98. }
  99. TEST(BufferValidationTest, VerifyGmbHandleInvalidPlaneWidth) {
  100. gfx::GpuMemoryBufferHandle gmb_handle;
  101. gmb_handle.type = gfx::NATIVE_PIXMAP;
  102. gmb_handle.native_pixmap_handle.planes.emplace_back(
  103. /*stride=*/50, /*offset=*/0, /*size=*/2500, GetDummyFD());
  104. gmb_handle.native_pixmap_handle.planes.emplace_back(
  105. /*stride=*/25, /*offset=*/2500, /*size=*/625, GetDummyFD());
  106. gmb_handle.native_pixmap_handle.planes.emplace_back(
  107. /*stride=*/25, /*offset=*/3125, /*size=*/625, GetDummyFD());
  108. constexpr size_t buffer_size = 2500 + 2 * 625;
  109. // Make the width greater than the planes'.
  110. const gfx::Size size(100, 50);
  111. EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
  112. PIXEL_FORMAT_I420, size, gmb_handle,
  113. base::BindRepeating(FileSizeForTesting, buffer_size)));
  114. }
  115. TEST(BufferValidationTest, VerifyGmbHandleOffsetValid) {
  116. gfx::GpuMemoryBufferHandle gmb_handle;
  117. gmb_handle.type = gfx::NATIVE_PIXMAP;
  118. gmb_handle.native_pixmap_handle.planes.emplace_back(
  119. /*stride=*/50, /*offset=*/0, /*size=*/2500, GetDummyFD());
  120. gmb_handle.native_pixmap_handle.planes.emplace_back(
  121. /*stride=*/25, /*offset=*/2500, /*size=*/625, GetDummyFD());
  122. gmb_handle.native_pixmap_handle.planes.emplace_back(
  123. /*stride=*/25, /*offset=*/3125, /*size=*/625, GetDummyFD());
  124. const gfx::Size size(50, 50);
  125. // Make the file size less than the plane size.
  126. EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
  127. PIXEL_FORMAT_I420, size, gmb_handle,
  128. base::BindRepeating(FileSizeForTesting, 2499)));
  129. }
  130. } // namespace
  131. } // namespace media