| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdint.h> | 5 #include <stdint.h> |
| 6 #include <memory> | 6 #include <memory> |
| 7 | 7 |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/test/test_simple_task_runner.h" | 9 #include "base/test/test_simple_task_runner.h" |
| 10 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 size.width() / 2, // u_stride | 115 size.width() / 2, // u_stride |
| 116 size.width() / 2, // v_stride | 116 size.width() / 2, // v_stride |
| 117 y_data, // y_data | 117 y_data, // y_data |
| 118 u_data, // u_data | 118 u_data, // u_data |
| 119 v_data, // v_data | 119 v_data, // v_data |
| 120 base::TimeDelta()); // timestamp | 120 base::TimeDelta()); // timestamp |
| 121 EXPECT_TRUE(video_frame); | 121 EXPECT_TRUE(video_frame); |
| 122 return video_frame; | 122 return video_frame; |
| 123 } | 123 } |
| 124 | 124 |
| 125 static scoped_refptr<media::VideoFrame> CreateTestY16VideoFrame( |
| 126 int dimension) { |
| 127 const int kDimension = 10; |
| 128 static uint8_t data[kDimension * kDimension * 2] = {0}; |
| 129 |
| 130 DCHECK_LE(dimension, kDimension); |
| 131 gfx::Size size(dimension, dimension); |
| 132 |
| 133 scoped_refptr<VideoFrame> video_frame = |
| 134 media::VideoFrame::WrapExternalData(media::PIXEL_FORMAT_Y16, // format |
| 135 size, // coded_size |
| 136 gfx::Rect(size), // visible_rect |
| 137 size, // natural_size |
| 138 data, // data |
| 139 sizeof(data), // byte size |
| 140 base::TimeDelta()); // timestamp |
| 141 EXPECT_TRUE(video_frame); |
| 142 return video_frame; |
| 143 } |
| 144 |
| 125 protected: | 145 protected: |
| 126 std::unique_ptr<MockGpuVideoAcceleratorFactories> mock_gpu_factories_; | 146 std::unique_ptr<MockGpuVideoAcceleratorFactories> mock_gpu_factories_; |
| 127 std::unique_ptr<GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_; | 147 std::unique_ptr<GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_; |
| 128 scoped_refptr<base::TestSimpleTaskRunner> media_task_runner_; | 148 scoped_refptr<base::TestSimpleTaskRunner> media_task_runner_; |
| 129 scoped_refptr<base::TestSimpleTaskRunner> copy_task_runner_; | 149 scoped_refptr<base::TestSimpleTaskRunner> copy_task_runner_; |
| 130 // GpuMemoryBufferVideoFramePool uses BindToCurrentLoop(), which requires | 150 // GpuMemoryBufferVideoFramePool uses BindToCurrentLoop(), which requires |
| 131 // ThreadTaskRunnerHandle initialization. | 151 // ThreadTaskRunnerHandle initialization. |
| 132 std::unique_ptr<base::ThreadTaskRunnerHandle> media_task_runner_handle_; | 152 std::unique_ptr<base::ThreadTaskRunnerHandle> media_task_runner_handle_; |
| 133 std::unique_ptr<TestGLES2Interface> gles2_; | 153 std::unique_ptr<TestGLES2Interface> gles2_; |
| 134 }; | 154 }; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( | 211 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( |
| 192 software_frame, base::Bind(MaybeCreateHardwareFrameCallback, &frame)); | 212 software_frame, base::Bind(MaybeCreateHardwareFrameCallback, &frame)); |
| 193 RunUntilIdle(); | 213 RunUntilIdle(); |
| 194 | 214 |
| 195 EXPECT_NE(software_frame.get(), frame.get()); | 215 EXPECT_NE(software_frame.get(), frame.get()); |
| 196 EXPECT_EQ(6u, gles2_->gen_textures); | 216 EXPECT_EQ(6u, gles2_->gen_textures); |
| 197 EXPECT_EQ(frame->mailbox_holder(0).mailbox, mailbox); | 217 EXPECT_EQ(frame->mailbox_holder(0).mailbox, mailbox); |
| 198 EXPECT_NE(frame->mailbox_holder(0).sync_token, sync_token); | 218 EXPECT_NE(frame->mailbox_holder(0).sync_token, sync_token); |
| 199 } | 219 } |
| 200 | 220 |
| 201 TEST_F(GpuMemoryBufferVideoFramePoolTest, DropResourceWhenSizeIsDifferent) { | 221 TEST_F(GpuMemoryBufferVideoFramePoolTest, |
| 222 DropResourceWhenSizeOrFormatAreDifferent) { |
| 202 scoped_refptr<VideoFrame> frame; | 223 scoped_refptr<VideoFrame> frame; |
| 203 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( | 224 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( |
| 204 CreateTestYUVVideoFrame(10), | 225 CreateTestYUVVideoFrame(10), |
| 205 base::Bind(MaybeCreateHardwareFrameCallback, &frame)); | 226 base::Bind(MaybeCreateHardwareFrameCallback, &frame)); |
| 206 RunUntilIdle(); | 227 RunUntilIdle(); |
| 207 | 228 |
| 208 EXPECT_EQ(3u, gles2_->gen_textures); | 229 EXPECT_EQ(3u, gles2_->gen_textures); |
| 209 | 230 |
| 210 frame = nullptr; | 231 frame = nullptr; |
| 211 RunUntilIdle(); | 232 RunUntilIdle(); |
| 212 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( | 233 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( |
| 213 CreateTestYUVVideoFrame(4), | 234 CreateTestYUVVideoFrame(4), |
| 214 base::Bind(MaybeCreateHardwareFrameCallback, &frame)); | 235 base::Bind(MaybeCreateHardwareFrameCallback, &frame)); |
| 215 RunUntilIdle(); | 236 RunUntilIdle(); |
| 216 EXPECT_EQ(6u, gles2_->gen_textures); | 237 EXPECT_EQ(6u, gles2_->gen_textures); |
| 238 |
| 239 frame = nullptr; |
| 240 RunUntilIdle(); |
| 241 mock_gpu_factories_->SetVideoFrameOutputFormat( |
| 242 media::GpuVideoAcceleratorFactories::OutputFormat::Y16); |
| 243 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( |
| 244 CreateTestY16VideoFrame(4), |
| 245 base::Bind(MaybeCreateHardwareFrameCallback, &frame)); |
| 246 RunUntilIdle(); |
| 247 EXPECT_EQ(7u, gles2_->gen_textures); |
| 217 } | 248 } |
| 218 | 249 |
| 219 TEST_F(GpuMemoryBufferVideoFramePoolTest, CreateOneHardwareUYUVFrame) { | 250 TEST_F(GpuMemoryBufferVideoFramePoolTest, CreateOneHardwareUYUVFrame) { |
| 220 scoped_refptr<VideoFrame> software_frame = CreateTestYUVVideoFrame(10); | 251 scoped_refptr<VideoFrame> software_frame = CreateTestYUVVideoFrame(10); |
| 221 scoped_refptr<VideoFrame> frame; | 252 scoped_refptr<VideoFrame> frame; |
| 222 mock_gpu_factories_->SetVideoFrameOutputFormat( | 253 mock_gpu_factories_->SetVideoFrameOutputFormat( |
| 223 media::GpuVideoAcceleratorFactories::OutputFormat::UYVY); | 254 media::GpuVideoAcceleratorFactories::OutputFormat::UYVY); |
| 224 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( | 255 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( |
| 225 software_frame, base::Bind(MaybeCreateHardwareFrameCallback, &frame)); | 256 software_frame, base::Bind(MaybeCreateHardwareFrameCallback, &frame)); |
| 226 | 257 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 257 software_frame, base::Bind(MaybeCreateHardwareFrameCallback, &frame)); | 288 software_frame, base::Bind(MaybeCreateHardwareFrameCallback, &frame)); |
| 258 | 289 |
| 259 RunUntilIdle(); | 290 RunUntilIdle(); |
| 260 | 291 |
| 261 EXPECT_NE(software_frame.get(), frame.get()); | 292 EXPECT_NE(software_frame.get(), frame.get()); |
| 262 EXPECT_EQ(2u, gles2_->gen_textures); | 293 EXPECT_EQ(2u, gles2_->gen_textures); |
| 263 EXPECT_TRUE(frame->metadata()->IsTrue( | 294 EXPECT_TRUE(frame->metadata()->IsTrue( |
| 264 media::VideoFrameMetadata::READ_LOCK_FENCES_ENABLED)); | 295 media::VideoFrameMetadata::READ_LOCK_FENCES_ENABLED)); |
| 265 } | 296 } |
| 266 | 297 |
| 298 TEST_F(GpuMemoryBufferVideoFramePoolTest, CreateOneHardwareY16Frame) { |
| 299 scoped_refptr<VideoFrame> software_frame = CreateTestY16VideoFrame(10); |
| 300 scoped_refptr<VideoFrame> frame; |
| 301 mock_gpu_factories_->SetVideoFrameOutputFormat( |
| 302 media::GpuVideoAcceleratorFactories::OutputFormat::Y16); |
| 303 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( |
| 304 software_frame, base::Bind(MaybeCreateHardwareFrameCallback, &frame)); |
| 305 |
| 306 RunUntilIdle(); |
| 307 |
| 308 EXPECT_NE(software_frame.get(), frame.get()); |
| 309 EXPECT_EQ(1u, gles2_->gen_textures); |
| 310 EXPECT_TRUE(frame->metadata()->IsTrue( |
| 311 media::VideoFrameMetadata::READ_LOCK_FENCES_ENABLED)); |
| 312 } |
| 313 |
| 267 // AllocateGpuMemoryBuffer can return null (e.g: when the GPU process is down). | 314 // AllocateGpuMemoryBuffer can return null (e.g: when the GPU process is down). |
| 268 // This test checks that in that case we don't crash and still create the | 315 // This test checks that in that case we don't crash and still create the |
| 269 // textures. | 316 // textures. |
| 270 TEST_F(GpuMemoryBufferVideoFramePoolTest, AllocateGpuMemoryBufferFail) { | 317 TEST_F(GpuMemoryBufferVideoFramePoolTest, AllocateGpuMemoryBufferFail) { |
| 271 scoped_refptr<VideoFrame> software_frame = CreateTestYUVVideoFrame(10); | 318 scoped_refptr<VideoFrame> software_frame = CreateTestYUVVideoFrame(10); |
| 272 scoped_refptr<VideoFrame> frame; | 319 scoped_refptr<VideoFrame> frame; |
| 273 mock_gpu_factories_->SetFailToAllocateGpuMemoryBufferForTesting(true); | 320 mock_gpu_factories_->SetFailToAllocateGpuMemoryBufferForTesting(true); |
| 274 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( | 321 gpu_memory_buffer_pool_->MaybeCreateHardwareFrame( |
| 275 software_frame, base::Bind(MaybeCreateHardwareFrameCallback, &frame)); | 322 software_frame, base::Bind(MaybeCreateHardwareFrameCallback, &frame)); |
| 276 | 323 |
| 277 RunUntilIdle(); | 324 RunUntilIdle(); |
| 278 | 325 |
| 279 EXPECT_NE(software_frame.get(), frame.get()); | 326 EXPECT_NE(software_frame.get(), frame.get()); |
| 280 EXPECT_EQ(3u, gles2_->gen_textures); | 327 EXPECT_EQ(3u, gles2_->gen_textures); |
| 281 } | 328 } |
| 282 | 329 |
| 283 } // namespace media | 330 } // namespace media |
| OLD | NEW |