OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/memory/shared_memory.h" | |
5 #include "base/message_loop/message_loop.h" | 6 #include "base/message_loop/message_loop.h" |
6 #include "content/child/child_process.h" | 7 #include "content/child/child_process.h" |
7 #include "content/common/media/video_capture_messages.h" | 8 #include "content/common/media/video_capture_messages.h" |
8 #include "content/renderer/media/video_capture_impl.h" | 9 #include "content/renderer/media/video_capture_impl.h" |
9 #include "media/base/bind_to_current_loop.h" | 10 #include "media/base/bind_to_current_loop.h" |
10 #include "testing/gmock/include/gmock/gmock.h" | 11 #include "testing/gmock/include/gmock/gmock.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
12 | 13 |
13 using ::testing::_; | 14 using ::testing::_; |
14 using ::testing::AtLeast; | 15 using ::testing::AtLeast; |
(...skipping 16 matching lines...) Expand all Loading... | |
31 private: | 32 private: |
32 DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureMessageFilter); | 33 DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureMessageFilter); |
33 }; | 34 }; |
34 | 35 |
35 class VideoCaptureImplTest : public ::testing::Test { | 36 class VideoCaptureImplTest : public ::testing::Test { |
36 public: | 37 public: |
37 class MockVideoCaptureImpl : public VideoCaptureImpl { | 38 class MockVideoCaptureImpl : public VideoCaptureImpl { |
38 public: | 39 public: |
39 MockVideoCaptureImpl(const media::VideoCaptureSessionId id, | 40 MockVideoCaptureImpl(const media::VideoCaptureSessionId id, |
40 VideoCaptureMessageFilter* filter) | 41 VideoCaptureMessageFilter* filter) |
41 : VideoCaptureImpl(id, filter) { | 42 : VideoCaptureImpl(id, filter), buffers_received_(0) { |
42 } | 43 } |
43 ~MockVideoCaptureImpl() override {} | 44 ~MockVideoCaptureImpl() override {} |
44 | 45 |
45 // Override Send() to mimic device to send events. | 46 // Override Send() to mimic device to send events. |
46 void Send(IPC::Message* message) override { | 47 void Send(IPC::Message* message) override { |
47 CHECK(message); | 48 CHECK(message); |
48 | 49 |
49 // In this method, messages are sent to the according handlers as if | 50 // In this method, messages are sent to the according handlers as if |
50 // we are the device. | 51 // we are the device. |
51 bool handled = true; | 52 bool handled = true; |
(...skipping 22 matching lines...) Expand all Loading... | |
74 | 75 |
75 void DevicePauseCapture(int device_id) {} | 76 void DevicePauseCapture(int device_id) {} |
76 | 77 |
77 void DeviceStopCapture(int device_id) { | 78 void DeviceStopCapture(int device_id) { |
78 OnStateChanged(VIDEO_CAPTURE_STATE_STOPPED); | 79 OnStateChanged(VIDEO_CAPTURE_STATE_STOPPED); |
79 } | 80 } |
80 | 81 |
81 void DeviceReceiveEmptyBuffer(int device_id, | 82 void DeviceReceiveEmptyBuffer(int device_id, |
82 int buffer_id, | 83 int buffer_id, |
83 uint32 sync_point, | 84 uint32 sync_point, |
84 double consumer_resource_utilization) {} | 85 double consumer_resource_utilization) { |
86 buffers_received_++; | |
87 } | |
85 | 88 |
86 void DeviceGetSupportedFormats(int device_id, | 89 void DeviceGetSupportedFormats(int device_id, |
87 media::VideoCaptureSessionId session_id) { | 90 media::VideoCaptureSessionId session_id) { |
88 // When the mock message filter receives a request for the device | 91 // When the mock message filter receives a request for the device |
89 // supported formats, replies immediately with an empty format list. | 92 // supported formats, replies immediately with an empty format list. |
90 OnDeviceSupportedFormatsEnumerated( | 93 OnDeviceSupportedFormatsEnumerated( |
91 media::VideoCaptureFormats()); | 94 media::VideoCaptureFormats()); |
92 } | 95 } |
93 | 96 |
94 void DeviceGetFormatsInUse(int device_id, | 97 void DeviceGetFormatsInUse(int device_id, |
95 media::VideoCaptureSessionId session_id) { | 98 media::VideoCaptureSessionId session_id) { |
96 OnDeviceFormatsInUseReceived(media::VideoCaptureFormats()); | 99 OnDeviceFormatsInUseReceived(media::VideoCaptureFormats()); |
97 } | 100 } |
98 | 101 |
99 void ReceiveStateChangeMessage(VideoCaptureState state) { | 102 void ReceiveStateChangeMessage(VideoCaptureState state) { |
100 OnStateChanged(state); | 103 OnStateChanged(state); |
101 } | 104 } |
102 | 105 |
103 const media::VideoCaptureParams& capture_params() const { | 106 const media::VideoCaptureParams& capture_params() const { |
104 return capture_params_; | 107 return capture_params_; |
105 } | 108 } |
106 | 109 |
110 const int GetReceivedBufferCounts() { | |
mcasas
2015/08/25 16:43:45
Fits in one line, and it's the method that should
msu.koo
2015/08/26 06:52:48
Done.
| |
111 return buffers_received_; | |
112 } | |
113 | |
107 private: | 114 private: |
108 media::VideoCaptureParams capture_params_; | 115 media::VideoCaptureParams capture_params_; |
116 int buffers_received_; | |
mcasas
2015/08/25 16:43:45
s/int/size_t/ ?
msu.koo
2015/08/26 06:52:48
Done.
| |
109 }; | 117 }; |
110 | 118 |
111 VideoCaptureImplTest() { | 119 VideoCaptureImplTest() { |
112 params_small_.requested_format = media::VideoCaptureFormat( | 120 params_small_.requested_format = media::VideoCaptureFormat( |
113 gfx::Size(176, 144), 30, media::VIDEO_CAPTURE_PIXEL_FORMAT_I420); | 121 gfx::Size(176, 144), 30, media::VIDEO_CAPTURE_PIXEL_FORMAT_I420); |
114 | 122 |
115 params_large_.requested_format = media::VideoCaptureFormat( | 123 params_large_.requested_format = media::VideoCaptureFormat( |
116 gfx::Size(320, 240), 30, media::VIDEO_CAPTURE_PIXEL_FORMAT_I420); | 124 gfx::Size(320, 240), 30, media::VIDEO_CAPTURE_PIXEL_FORMAT_I420); |
117 | 125 |
118 child_process_.reset(new ChildProcess()); | 126 child_process_.reset(new ChildProcess()); |
(...skipping 27 matching lines...) Expand all Loading... | |
146 void StartCapture(int client_id, | 154 void StartCapture(int client_id, |
147 const media::VideoCaptureParams& params) { | 155 const media::VideoCaptureParams& params) { |
148 video_capture_impl_->StartCapture( | 156 video_capture_impl_->StartCapture( |
149 client_id, params, | 157 client_id, params, |
150 base::Bind(&VideoCaptureImplTest::OnStateUpdate, | 158 base::Bind(&VideoCaptureImplTest::OnStateUpdate, |
151 base::Unretained(this)), | 159 base::Unretained(this)), |
152 base::Bind(&VideoCaptureImplTest::OnFrameReady, | 160 base::Bind(&VideoCaptureImplTest::OnFrameReady, |
153 base::Unretained(this))); | 161 base::Unretained(this))); |
154 } | 162 } |
155 | 163 |
164 void NewBuffer(int buffer_id, const base::SharedMemory& shm) { | |
165 video_capture_impl_->OnBufferCreated( | |
166 base::SharedMemory::DuplicateHandle(shm.handle()), | |
167 shm.mapped_size(), buffer_id); | |
168 } | |
169 | |
170 void BufferReceived(int buffer_id, const gfx::Size& size, | |
171 media::VideoPixelFormat pixel_format, | |
172 const gpu::MailboxHolder& mailbox_holder) { | |
173 video_capture_impl_->OnBufferReceived( | |
174 buffer_id, base::TimeTicks::Now(), base::DictionaryValue(), | |
175 pixel_format, media::VideoFrame::STORAGE_SHMEM, size, | |
176 gfx::Rect(size.width(), size.height()), mailbox_holder); | |
mcasas
2015/08/25 16:43:46
gfx::Rect(size) [1]
[1] https://code.google.com/p
msu.koo
2015/08/26 06:52:48
Done.
| |
177 } | |
178 | |
179 void BufferDestroyed(int buffer_id) { | |
180 video_capture_impl_->OnBufferDestroyed(buffer_id); | |
181 } | |
182 | |
156 void StopCapture(int client_id) { | 183 void StopCapture(int client_id) { |
157 video_capture_impl_->StopCapture(client_id); | 184 video_capture_impl_->StopCapture(client_id); |
158 } | 185 } |
159 | 186 |
160 void DeInit() { | 187 void DeInit() { |
161 video_capture_impl_->DeInit(); | 188 video_capture_impl_->DeInit(); |
162 } | 189 } |
163 | 190 |
164 void GetDeviceSupportedFormats() { | 191 void GetDeviceSupportedFormats() { |
165 const base::Callback<void(const media::VideoCaptureFormats&)> | 192 const base::Callback<void(const media::VideoCaptureFormats&)> |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
275 StartCapture(0, params_small_); | 302 StartCapture(0, params_small_); |
276 StartCapture(1, params_large_); | 303 StartCapture(1, params_large_); |
277 StopCapture(0); | 304 StopCapture(0); |
278 StopCapture(1); | 305 StopCapture(1); |
279 DeInit(); | 306 DeInit(); |
280 DCHECK(video_capture_impl_->capture_params().requested_format | 307 DCHECK(video_capture_impl_->capture_params().requested_format |
281 .frame_size == | 308 .frame_size == |
282 params_small_.requested_format.frame_size); | 309 params_small_.requested_format.frame_size); |
283 } | 310 } |
284 | 311 |
312 TEST_F(VideoCaptureImplTest, I420BufferReceived) { | |
313 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)).Times(1); | |
314 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STOPPED)).Times(1); | |
315 EXPECT_CALL(*this, OnFrameReady(_, _)).Times(1); | |
316 | |
317 // Create a fake shared memory for buffer. | |
318 base::SharedMemory shm; | |
319 size_t i420_frame_size = media::VideoFrame::AllocationSize( | |
320 media::PIXEL_FORMAT_I420, params_large_.requested_format.frame_size); | |
321 ASSERT_TRUE(shm.CreateAndMapAnonymous(i420_frame_size)); | |
322 | |
323 Init(); | |
324 StartCapture(0, params_large_); | |
325 NewBuffer(0, shm); | |
326 BufferReceived(0, params_large_.requested_format.frame_size, | |
327 media::PIXEL_FORMAT_I420, gpu::MailboxHolder()); | |
328 StopCapture(0); | |
329 BufferDestroyed(0); | |
330 DeInit(); | |
331 } | |
332 | |
333 TEST_F(VideoCaptureImplTest, ARGBBufferReceived) { | |
mcasas
2015/08/25 16:43:45
Consider making this test and the previous one par
msu.koo
2015/08/26 06:52:48
Done.
| |
334 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)).Times(1); | |
335 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STOPPED)).Times(1); | |
336 EXPECT_CALL(*this, OnFrameReady(_, _)).Times(1); | |
337 | |
338 // Create a fake shared memory for buffer. | |
339 base::SharedMemory shm; | |
340 size_t i420_frame_size = media::VideoFrame::AllocationSize( | |
mcasas
2015/08/25 16:43:45
s/i420_frame_size/argb_frame_size/
nit: make it co
msu.koo
2015/08/26 06:52:48
Done.
| |
341 media::PIXEL_FORMAT_ARGB, params_large_.requested_format.frame_size); | |
342 ASSERT_TRUE(shm.CreateAndMapAnonymous(i420_frame_size)); | |
343 | |
344 Init(); | |
345 StartCapture(0, params_large_); | |
346 NewBuffer(0, shm); | |
347 BufferReceived(0, params_large_.requested_format.frame_size, | |
348 media::PIXEL_FORMAT_ARGB, | |
349 gpu::MailboxHolder(gpu::Mailbox::Generate(), 0, 0)); | |
350 StopCapture(0); | |
351 BufferDestroyed(0); | |
352 DeInit(); | |
353 } | |
354 | |
355 TEST_F(VideoCaptureImplTest, BufferReceivedAfterStop) { | |
356 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)).Times(1); | |
357 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STOPPED)).Times(1); | |
358 EXPECT_CALL(*this, OnFrameReady(_, _)).Times(0); | |
359 | |
360 // Create a fake shared memory for buffer. | |
361 base::SharedMemory shm; | |
362 size_t i420_frame_size = media::VideoFrame::AllocationSize( | |
363 media::PIXEL_FORMAT_I420, params_large_.requested_format.frame_size); | |
364 ASSERT_TRUE(shm.CreateAndMapAnonymous(i420_frame_size)); | |
365 | |
366 Init(); | |
367 StartCapture(0, params_large_); | |
368 NewBuffer(0, shm); | |
369 StopCapture(0); | |
370 BufferReceived(0, params_large_.requested_format.frame_size, | |
371 media::PIXEL_FORMAT_I420, gpu::MailboxHolder()); | |
372 BufferDestroyed(0); | |
373 DeInit(); | |
374 | |
375 EXPECT_EQ(this->video_capture_impl_->GetReceivedBufferCounts(), 1); | |
376 } | |
377 | |
285 TEST_F(VideoCaptureImplTest, EndedBeforeStop) { | 378 TEST_F(VideoCaptureImplTest, EndedBeforeStop) { |
286 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)); | 379 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)); |
287 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STOPPED)); | 380 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STOPPED)); |
288 | 381 |
289 Init(); | 382 Init(); |
290 StartCapture(0, params_small_); | 383 StartCapture(0, params_small_); |
291 | 384 |
292 // Receive state change message from browser. | 385 // Receive state change message from browser. |
293 video_capture_impl_->ReceiveStateChangeMessage(VIDEO_CAPTURE_STATE_ENDED); | 386 video_capture_impl_->ReceiveStateChangeMessage(VIDEO_CAPTURE_STATE_ENDED); |
294 | 387 |
295 StopCapture(0); | 388 StopCapture(0); |
296 DeInit(); | 389 DeInit(); |
297 } | 390 } |
298 | 391 |
299 TEST_F(VideoCaptureImplTest, ErrorBeforeStop) { | 392 TEST_F(VideoCaptureImplTest, ErrorBeforeStop) { |
300 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)); | 393 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)); |
301 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_ERROR)); | 394 EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_ERROR)); |
302 | 395 |
303 Init(); | 396 Init(); |
304 StartCapture(0, params_small_); | 397 StartCapture(0, params_small_); |
305 | 398 |
306 // Receive state change message from browser. | 399 // Receive state change message from browser. |
307 video_capture_impl_->ReceiveStateChangeMessage(VIDEO_CAPTURE_STATE_ERROR); | 400 video_capture_impl_->ReceiveStateChangeMessage(VIDEO_CAPTURE_STATE_ERROR); |
308 | 401 |
309 StopCapture(0); | 402 StopCapture(0); |
310 DeInit(); | 403 DeInit(); |
311 } | 404 } |
312 | 405 |
313 } // namespace content | 406 } // namespace content |
OLD | NEW |