#include "media/gpu/buffer_validation.h"
#include <fcntl.h>
#include "base/files/scoped_file.h"
#include "base/functional/bind.h"
#include "media/base/video_frame.h"
#include "media/base/video_types.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/gpu_memory_buffer_handle.h"
#include "ui/gfx/native_pixmap_handle.h"
namespace media {
namespace {
base::ScopedFD GetDummyFD() {
base::ScopedFD fd(open("/dev/zero", O_RDWR));
DCHECK(fd.is_valid());
return fd;
}
size_t FileSizeForTesting(size_t size) {
return size;
}
TEST(BufferValidationTest, VerifyGmbHandlePasses) {
gfx::NativePixmapHandle native_pixmap_handle;
native_pixmap_handle.planes.emplace_back(
50, 0, 2500, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
25, 2500, 625, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
25, 3125, 625, GetDummyFD());
constexpr size_t buffer_size = 2500 + 2 * 625;
const gfx::Size size(50, 50);
gfx::GpuMemoryBufferHandle gmb_handle(std::move(native_pixmap_handle));
EXPECT_TRUE(VerifyGpuMemoryBufferHandle(
PIXEL_FORMAT_I420, size, gmb_handle,
base::BindRepeating(FileSizeForTesting, buffer_size)));
}
TEST(BufferValidationTest, VerifyGmbHandleInvalidType) {
gfx::GpuMemoryBufferHandle gmb_handle;
gmb_handle.type = gfx::EMPTY_BUFFER;
const gfx::Size size(50, 50);
EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
PIXEL_FORMAT_I420, size, gmb_handle,
base::BindRepeating(FileSizeForTesting, size.GetArea() * 2)));
}
TEST(BufferValidationTest, VerifyGmbHandlePlanesCountMatches) {
gfx::NativePixmapHandle native_pixmap_handle;
native_pixmap_handle.planes.emplace_back(
50, 0, 2500, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
25, 2500, 625, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
25, 3125, 625, GetDummyFD());
constexpr size_t buffer_size = 2500 + 2 * 625;
const gfx::Size size(50, 50);
gfx::GpuMemoryBufferHandle gmb_handle(std::move(native_pixmap_handle));
EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
PIXEL_FORMAT_UYVY, size, gmb_handle,
base::BindRepeating(FileSizeForTesting, buffer_size)));
}
TEST(BufferValidationTest, VerifyGmbHandleStridesMonotonicallyDecrease) {
gfx::NativePixmapHandle native_pixmap_handle;
native_pixmap_handle.planes.emplace_back(
50, 0, 2500, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
60, 2500, 1500, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
70, 4000, 1750, GetDummyFD());
constexpr size_t buffer_size = 2500 + 1500 + 1750;
const gfx::Size size(50, 50);
gfx::GpuMemoryBufferHandle gmb_handle(std::move(native_pixmap_handle));
EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
PIXEL_FORMAT_I420, size, gmb_handle,
base::BindRepeating(FileSizeForTesting, buffer_size)));
}
TEST(BufferValidationTest, VerifyGmbHandleInvalidPlaneHeight) {
gfx::NativePixmapHandle native_pixmap_handle;
native_pixmap_handle.planes.emplace_back(
50, 0, 2500, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
25, 2500, 625, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
25, 3125, 625, GetDummyFD());
constexpr size_t buffer_size = 2500 + 2 * 625;
const gfx::Size size(50, 100);
gfx::GpuMemoryBufferHandle gmb_handle(std::move(native_pixmap_handle));
EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
PIXEL_FORMAT_I420, size, gmb_handle,
base::BindRepeating(FileSizeForTesting, buffer_size)));
}
TEST(BufferValidationTest, VerifyGmbHandleInvalidPlaneWidth) {
gfx::NativePixmapHandle native_pixmap_handle;
native_pixmap_handle.planes.emplace_back(
50, 0, 2500, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
25, 2500, 625, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
25, 3125, 625, GetDummyFD());
constexpr size_t buffer_size = 2500 + 2 * 625;
const gfx::Size size(100, 50);
gfx::GpuMemoryBufferHandle gmb_handle(std::move(native_pixmap_handle));
EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
PIXEL_FORMAT_I420, size, gmb_handle,
base::BindRepeating(FileSizeForTesting, buffer_size)));
}
TEST(BufferValidationTest, VerifyGmbHandleOffsetValid) {
gfx::NativePixmapHandle native_pixmap_handle;
native_pixmap_handle.planes.emplace_back(
50, 0, 2500, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
25, 2500, 625, GetDummyFD());
native_pixmap_handle.planes.emplace_back(
25, 3125, 625, GetDummyFD());
const gfx::Size size(50, 50);
gfx::GpuMemoryBufferHandle gmb_handle(std::move(native_pixmap_handle));
EXPECT_FALSE(VerifyGpuMemoryBufferHandle(
PIXEL_FORMAT_I420, size, gmb_handle,
base::BindRepeating(FileSizeForTesting, 2499)));
}
}
}