Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Unified Diff: media/video/gpu_memory_buffer_video_frame_pool_unittest.cc

Issue 1133563010: Add a GpuMemoryBuffer pool that creates hardware backed VideoFrames. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address reveman@'s nits. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/video/gpu_memory_buffer_video_frame_pool.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
diff --git a/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0ca4e529c5aec4a311b248efb38ea8f914b453f7
--- /dev/null
+++ b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
@@ -0,0 +1,180 @@
+// Copyright 2015 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 "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "gpu/command_buffer/client/gles2_interface_stub.h"
+#include "media/base/video_frame.h"
+#include "media/renderers/gpu_video_accelerator_factories.h"
+#include "media/renderers/mock_gpu_video_accelerator_factories.h"
+#include "media/video/gpu_memory_buffer_video_frame_pool.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace media {
+
+namespace {
+class TestGLES2Interface : public gpu::gles2::GLES2InterfaceStub {
+ public:
+ unsigned gen_textures = 0u;
+ void GenTextures(GLsizei n, GLuint* textures) override {
+ DCHECK_EQ(1, n);
+ *textures = ++gen_textures;
+ }
+
+ GLuint InsertSyncPointCHROMIUM() override { return ++sync_point; }
+
+ void GenMailboxCHROMIUM(GLbyte* mailbox) override {
+ *reinterpret_cast<unsigned*>(mailbox) = ++this->mailbox;
+ }
+
+ private:
+ unsigned sync_point = 0u;
+ unsigned mailbox = 0u;
+};
+
+} // unnamed namespace
+
+class GpuMemoryBufferVideoFramePoolTest : public ::testing::Test {
+ public:
+ GpuMemoryBufferVideoFramePoolTest() {}
+ void SetUp() override { gles2_.reset(new TestGLES2Interface); }
+
+ void TearDown() override { base::RunLoop().RunUntilIdle(); }
+
+ static scoped_refptr<media::VideoFrame> CreateTestYUVVideoFrame(
+ int dimension) {
+ const int kDimension = 10;
+ static uint8 y_data[kDimension * kDimension] = {0};
+ static uint8 u_data[kDimension * kDimension / 2] = {0};
+ static uint8 v_data[kDimension * kDimension / 2] = {0};
+
+ DCHECK_LE(dimension, kDimension);
+ gfx::Size size(dimension, dimension);
+
+ return media::VideoFrame::WrapExternalYuvData(
+ media::VideoFrame::YV12, // format
+ size, // coded_size
+ gfx::Rect(size), // visible_rect
+ size, // natural_size
+ size.width(), // y_stride
+ size.width() / 2, // u_stride
+ size.width() / 2, // v_stride
+ y_data, // y_data
+ u_data, // u_data
+ v_data, // v_data
+ base::TimeDelta(), // timestamp,
+ base::Closure()); // no_longer_needed_cb
+ }
+
+ protected:
+ base::MessageLoop media_message_loop_;
+ scoped_ptr<TestGLES2Interface> gles2_;
+};
+
+TEST_F(GpuMemoryBufferVideoFramePoolTest, NoGpuFactoryNoHardwareVideoFrame) {
+ scoped_refptr<VideoFrame> frame = CreateTestYUVVideoFrame(10);
+ scoped_ptr<GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_ =
+ make_scoped_ptr(new GpuMemoryBufferVideoFramePool(
+ media_message_loop_.task_runner(), nullptr));
+
+ scoped_refptr<VideoFrame> frame2 =
+ gpu_memory_buffer_pool_->MaybeCreateHardwareFrame(frame);
+ EXPECT_EQ(frame.get(), frame2.get());
+}
+
+TEST_F(GpuMemoryBufferVideoFramePoolTest, NoTextureRGNoHardwareVideoFrame) {
+ scoped_refptr<VideoFrame> frame = CreateTestYUVVideoFrame(10);
+ scoped_refptr<MockGpuVideoAcceleratorFactories> mock_gpu_factories(
+ new MockGpuVideoAcceleratorFactories);
+ scoped_ptr<GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_ =
+ make_scoped_ptr(new GpuMemoryBufferVideoFramePool(
+ media_message_loop_.task_runner(), mock_gpu_factories));
+
+ EXPECT_CALL(*mock_gpu_factories.get(), IsTextureRGSupported())
+ .WillRepeatedly(testing::Return(false));
+ scoped_refptr<VideoFrame> frame2 =
+ gpu_memory_buffer_pool_->MaybeCreateHardwareFrame(frame);
+ EXPECT_EQ(frame.get(), frame2.get());
+}
+
+TEST_F(GpuMemoryBufferVideoFramePoolTest, CreateOneHardwareFrame) {
+ scoped_refptr<VideoFrame> software_frame = CreateTestYUVVideoFrame(10);
+ scoped_refptr<MockGpuVideoAcceleratorFactories> mock_gpu_factories(
+ new MockGpuVideoAcceleratorFactories);
+ scoped_ptr<GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_ =
+ make_scoped_ptr(new GpuMemoryBufferVideoFramePool(
+ media_message_loop_.task_runner(), mock_gpu_factories));
+
+ EXPECT_CALL(*mock_gpu_factories.get(), GetGLES2Interface())
+ .WillRepeatedly(testing::Return(gles2_.get()));
+ EXPECT_CALL(*mock_gpu_factories.get(), IsTextureRGSupported())
+ .WillRepeatedly(testing::Return(true));
+
+ scoped_refptr<VideoFrame> frame =
+ gpu_memory_buffer_pool_->MaybeCreateHardwareFrame(software_frame);
+ EXPECT_NE(software_frame.get(), frame.get());
+ EXPECT_EQ(3u, gles2_->gen_textures);
+}
+
+TEST_F(GpuMemoryBufferVideoFramePoolTest, ReuseFirstResource) {
+ scoped_refptr<VideoFrame> software_frame = CreateTestYUVVideoFrame(10);
+ scoped_refptr<MockGpuVideoAcceleratorFactories> mock_gpu_factories(
+ new MockGpuVideoAcceleratorFactories);
+ scoped_ptr<GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_ =
+ make_scoped_ptr(new GpuMemoryBufferVideoFramePool(
+ media_message_loop_.task_runner(), mock_gpu_factories));
+
+ EXPECT_CALL(*mock_gpu_factories.get(), GetGLES2Interface())
+ .WillRepeatedly(testing::Return(gles2_.get()));
+ EXPECT_CALL(*mock_gpu_factories.get(), IsTextureRGSupported())
+ .WillRepeatedly(testing::Return(true));
+
+ scoped_refptr<VideoFrame> frame =
+ gpu_memory_buffer_pool_->MaybeCreateHardwareFrame(software_frame);
+ EXPECT_NE(software_frame.get(), frame.get());
+ gpu::Mailbox mailbox = frame->mailbox_holder(0).mailbox;
+ unsigned sync_point = frame->mailbox_holder(0).sync_point;
+ EXPECT_EQ(3u, gles2_->gen_textures);
+
+ scoped_refptr<VideoFrame> frame2 =
+ gpu_memory_buffer_pool_->MaybeCreateHardwareFrame(software_frame);
+ EXPECT_NE(software_frame.get(), frame2.get());
+ EXPECT_NE(mailbox, frame2->mailbox_holder(0).mailbox);
+ EXPECT_EQ(6u, gles2_->gen_textures);
+
+ frame = nullptr;
+ frame2 = nullptr;
+ base::RunLoop().RunUntilIdle(); // Run posted closures.
+ frame = gpu_memory_buffer_pool_->MaybeCreateHardwareFrame(software_frame);
+ EXPECT_NE(software_frame.get(), frame.get());
+ EXPECT_EQ(6u, gles2_->gen_textures);
+ EXPECT_EQ(frame->mailbox_holder(0).mailbox, mailbox);
+ EXPECT_NE(frame->mailbox_holder(0).sync_point, sync_point);
+}
+
+TEST_F(GpuMemoryBufferVideoFramePoolTest, DropResourceWhenSizeIsDifferent) {
+ scoped_refptr<MockGpuVideoAcceleratorFactories> mock_gpu_factories(
+ new MockGpuVideoAcceleratorFactories);
+ scoped_ptr<GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_ =
+ make_scoped_ptr(new GpuMemoryBufferVideoFramePool(
+ media_message_loop_.task_runner(), mock_gpu_factories));
+
+ EXPECT_CALL(*mock_gpu_factories.get(), GetGLES2Interface())
+ .WillRepeatedly(testing::Return(gles2_.get()));
+ EXPECT_CALL(*mock_gpu_factories.get(), IsTextureRGSupported())
+ .WillRepeatedly(testing::Return(true));
+
+ scoped_refptr<VideoFrame> frame =
+ gpu_memory_buffer_pool_->MaybeCreateHardwareFrame(
+ CreateTestYUVVideoFrame(10));
+ EXPECT_EQ(3u, gles2_->gen_textures);
+
+ frame = nullptr;
+ base::RunLoop().RunUntilIdle(); // Run posted closures.
+ frame = gpu_memory_buffer_pool_->MaybeCreateHardwareFrame(
+ CreateTestYUVVideoFrame(4));
+ EXPECT_EQ(6u, gles2_->gen_textures);
+}
+
+} // namespace media
« no previous file with comments | « media/video/gpu_memory_buffer_video_frame_pool.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698