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 |