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

Side by Side Diff: content/browser/renderer_host/media/video_capture_controller_unittest.cc

Issue 101843005: Convert video capture pipline to base::TimeTicks (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 9890509b Rebase, Windows compile fixes Created 6 years, 11 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 // Unit test for VideoCaptureController. 5 // Unit test for VideoCaptureController.
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 base::SharedMemoryHandle handle, 52 base::SharedMemoryHandle handle,
53 int length, int buffer_id) OVERRIDE { 53 int length, int buffer_id) OVERRIDE {
54 DoBufferCreated(id); 54 DoBufferCreated(id);
55 } 55 }
56 virtual void OnBufferDestroyed(const VideoCaptureControllerID& id, 56 virtual void OnBufferDestroyed(const VideoCaptureControllerID& id,
57 int buffer_id) OVERRIDE { 57 int buffer_id) OVERRIDE {
58 DoBufferDestroyed(id); 58 DoBufferDestroyed(id);
59 } 59 }
60 virtual void OnBufferReady(const VideoCaptureControllerID& id, 60 virtual void OnBufferReady(const VideoCaptureControllerID& id,
61 int buffer_id, 61 int buffer_id,
62 base::Time timestamp, 62 base::TimeTicks timestamp,
63 const media::VideoCaptureFormat& format) OVERRIDE { 63 const media::VideoCaptureFormat& format) OVERRIDE {
64 DoBufferReady(id); 64 DoBufferReady(id);
65 base::MessageLoop::current()->PostTask(FROM_HERE, 65 base::MessageLoop::current()->PostTask(FROM_HERE,
66 base::Bind(&VideoCaptureController::ReturnBuffer, 66 base::Bind(&VideoCaptureController::ReturnBuffer,
67 base::Unretained(controller_), id, this, buffer_id)); 67 base::Unretained(controller_), id, this, buffer_id));
68 } 68 }
69 virtual void OnEnded(const VideoCaptureControllerID& id) OVERRIDE { 69 virtual void OnEnded(const VideoCaptureControllerID& id) OVERRIDE {
70 DoEnded(id); 70 DoEnded(id);
71 // OnEnded() must respond by (eventually) unregistering the client. 71 // OnEnded() must respond by (eventually) unregistering the client.
72 base::MessageLoop::current()->PostTask(FROM_HERE, 72 base::MessageLoop::current()->PostTask(FROM_HERE,
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1)).Times(1); 272 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1)).Times(1);
273 } 273 }
274 { 274 {
275 InSequence s; 275 InSequence s;
276 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1); 276 EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1);
277 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2)).Times(1); 277 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2)).Times(1);
278 } 278 }
279 device_->OnIncomingCapturedBuffer(buffer, 279 device_->OnIncomingCapturedBuffer(buffer,
280 media::VideoFrame::I420, 280 media::VideoFrame::I420,
281 capture_resolution, 281 capture_resolution,
282 base::Time(), 282 base::TimeTicks(),
283 device_format.frame_rate); 283 device_format.frame_rate);
284 buffer = NULL; 284 buffer = NULL;
285 285
286 base::RunLoop().RunUntilIdle(); 286 base::RunLoop().RunUntilIdle();
287 Mock::VerifyAndClearExpectations(client_a_.get()); 287 Mock::VerifyAndClearExpectations(client_a_.get());
288 Mock::VerifyAndClearExpectations(client_b_.get()); 288 Mock::VerifyAndClearExpectations(client_b_.get());
289 289
290 // Second buffer which ought to use the same shared memory buffer. In this 290 // Second buffer which ought to use the same shared memory buffer. In this
291 // case pretend that the Buffer pointer is held by the device for a long 291 // case pretend that the Buffer pointer is held by the device for a long
292 // delay. This shouldn't affect anything. 292 // delay. This shouldn't affect anything.
293 buffer = 293 buffer =
294 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); 294 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution);
295 ASSERT_TRUE(buffer); 295 ASSERT_TRUE(buffer);
296 memset(buffer->data(), buffer_no++, buffer->size()); 296 memset(buffer->data(), buffer_no++, buffer->size());
297 device_->OnIncomingCapturedBuffer(buffer, 297 device_->OnIncomingCapturedBuffer(buffer,
298 media::VideoFrame::I420, 298 media::VideoFrame::I420,
299 capture_resolution, 299 capture_resolution,
300 base::Time(), 300 base::TimeTicks(),
301 device_format.frame_rate); 301 device_format.frame_rate);
302 buffer = NULL; 302 buffer = NULL;
303 303
304 // The buffer should be delivered to the clients in any order. 304 // The buffer should be delivered to the clients in any order.
305 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1)).Times(1); 305 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1)).Times(1);
306 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1)).Times(1); 306 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1)).Times(1);
307 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2)).Times(1); 307 EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2)).Times(1);
308 base::RunLoop().RunUntilIdle(); 308 base::RunLoop().RunUntilIdle();
309 Mock::VerifyAndClearExpectations(client_a_.get()); 309 Mock::VerifyAndClearExpectations(client_a_.get());
310 Mock::VerifyAndClearExpectations(client_b_.get()); 310 Mock::VerifyAndClearExpectations(client_b_.get());
311 311
312 // Add a fourth client now that some buffers have come through. 312 // Add a fourth client now that some buffers have come through.
313 controller_->AddClient(client_b_route_2, 313 controller_->AddClient(client_b_route_2,
314 client_b_.get(), 314 client_b_.get(),
315 base::kNullProcessHandle, 315 base::kNullProcessHandle,
316 1, 316 1,
317 session_1); 317 session_1);
318 Mock::VerifyAndClearExpectations(client_b_.get()); 318 Mock::VerifyAndClearExpectations(client_b_.get());
319 319
320 // Third, fourth, and fifth buffers. Pretend they all arrive at the same time. 320 // Third, fourth, and fifth buffers. Pretend they all arrive at the same time.
321 for (int i = 0; i < kPoolSize; i++) { 321 for (int i = 0; i < kPoolSize; i++) {
322 buffer = device_->ReserveOutputBuffer(media::VideoFrame::I420, 322 buffer = device_->ReserveOutputBuffer(media::VideoFrame::I420,
323 capture_resolution); 323 capture_resolution);
324 ASSERT_TRUE(buffer); 324 ASSERT_TRUE(buffer);
325 memset(buffer->data(), buffer_no++, buffer->size()); 325 memset(buffer->data(), buffer_no++, buffer->size());
326 device_->OnIncomingCapturedBuffer(buffer, 326 device_->OnIncomingCapturedBuffer(buffer,
327 media::VideoFrame::I420, 327 media::VideoFrame::I420,
328 capture_resolution, 328 capture_resolution,
329 base::Time(), 329 base::TimeTicks(),
330 device_format.frame_rate); 330 device_format.frame_rate);
331 buffer = NULL; 331 buffer = NULL;
332 } 332 }
333 // ReserveOutputBuffer ought to fail now, because the pool is depleted. 333 // ReserveOutputBuffer ought to fail now, because the pool is depleted.
334 ASSERT_FALSE(device_->ReserveOutputBuffer(media::VideoFrame::I420, 334 ASSERT_FALSE(device_->ReserveOutputBuffer(media::VideoFrame::I420,
335 capture_resolution)); 335 capture_resolution));
336 336
337 // The new client needs to be told of 3 buffers; the old clients only 2. 337 // The new client needs to be told of 3 buffers; the old clients only 2.
338 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_2)).Times(kPoolSize); 338 EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_2)).Times(kPoolSize);
339 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2)).Times(kPoolSize); 339 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2)).Times(kPoolSize);
(...skipping 17 matching lines...) Expand all
357 EXPECT_CALL(*client_b_, DoEnded(client_b_route_1)).Times(1); 357 EXPECT_CALL(*client_b_, DoEnded(client_b_route_1)).Times(1);
358 controller_->StopSession(300); 358 controller_->StopSession(300);
359 // Queue up another buffer. 359 // Queue up another buffer.
360 buffer = 360 buffer =
361 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); 361 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution);
362 ASSERT_TRUE(buffer); 362 ASSERT_TRUE(buffer);
363 memset(buffer->data(), buffer_no++, buffer->size()); 363 memset(buffer->data(), buffer_no++, buffer->size());
364 device_->OnIncomingCapturedBuffer(buffer, 364 device_->OnIncomingCapturedBuffer(buffer,
365 media::VideoFrame::I420, 365 media::VideoFrame::I420,
366 capture_resolution, 366 capture_resolution,
367 base::Time(), 367 base::TimeTicks(),
368 device_format.frame_rate); 368 device_format.frame_rate);
369 buffer = NULL; 369 buffer = NULL;
370 buffer = 370 buffer =
371 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); 371 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution);
372 { 372 {
373 // Kill A2 via session close (posts a task to disconnect, but A2 must not 373 // Kill A2 via session close (posts a task to disconnect, but A2 must not
374 // be sent either of these two buffers). 374 // be sent either of these two buffers).
375 EXPECT_CALL(*client_a_, DoEnded(client_a_route_2)).Times(1); 375 EXPECT_CALL(*client_a_, DoEnded(client_a_route_2)).Times(1);
376 controller_->StopSession(200); 376 controller_->StopSession(200);
377 } 377 }
378 ASSERT_TRUE(buffer); 378 ASSERT_TRUE(buffer);
379 memset(buffer->data(), buffer_no++, buffer->size()); 379 memset(buffer->data(), buffer_no++, buffer->size());
380 device_->OnIncomingCapturedBuffer(buffer, 380 device_->OnIncomingCapturedBuffer(buffer,
381 media::VideoFrame::I420, 381 media::VideoFrame::I420,
382 capture_resolution, 382 capture_resolution,
383 base::Time(), 383 base::TimeTicks(),
384 device_format.frame_rate); 384 device_format.frame_rate);
385 buffer = NULL; 385 buffer = NULL;
386 // B2 is the only client left, and is the only one that should 386 // B2 is the only client left, and is the only one that should
387 // get the buffer. 387 // get the buffer.
388 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2)).Times(2); 388 EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2)).Times(2);
389 base::RunLoop().RunUntilIdle(); 389 base::RunLoop().RunUntilIdle();
390 Mock::VerifyAndClearExpectations(client_a_.get()); 390 Mock::VerifyAndClearExpectations(client_a_.get());
391 Mock::VerifyAndClearExpectations(client_b_.get()); 391 Mock::VerifyAndClearExpectations(client_b_.get());
392 } 392 }
393 393
(...skipping 23 matching lines...) Expand all
417 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); 417 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1);
418 controller_->AddClient( 418 controller_->AddClient(
419 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200); 419 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200);
420 base::RunLoop().RunUntilIdle(); 420 base::RunLoop().RunUntilIdle();
421 Mock::VerifyAndClearExpectations(client_b_.get()); 421 Mock::VerifyAndClearExpectations(client_b_.get());
422 422
423 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer = 423 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer =
424 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution); 424 device_->ReserveOutputBuffer(media::VideoFrame::I420, capture_resolution);
425 ASSERT_TRUE(buffer); 425 ASSERT_TRUE(buffer);
426 426
427 device_->OnIncomingCapturedBuffer( 427 device_->OnIncomingCapturedBuffer(buffer,
428 buffer, media::VideoFrame::I420, capture_resolution, base::Time(), 30); 428 media::VideoFrame::I420,
429 capture_resolution,
430 base::TimeTicks(),
431 30);
429 buffer = NULL; 432 buffer = NULL;
430 433
431 base::RunLoop().RunUntilIdle(); 434 base::RunLoop().RunUntilIdle();
432 } 435 }
433 436
434 // Exercises the OnError() codepath of VideoCaptureController, and tests the 437 // Exercises the OnError() codepath of VideoCaptureController, and tests the
435 // behavior of various operations after the error state has been signalled. 438 // behavior of various operations after the error state has been signalled.
436 TEST_F(VideoCaptureControllerTest, ErrorAfterDeviceCreation) { 439 TEST_F(VideoCaptureControllerTest, ErrorAfterDeviceCreation) {
437 media::VideoCaptureParams session_100; 440 media::VideoCaptureParams session_100;
438 session_100.requested_format = media::VideoCaptureFormat( 441 session_100.requested_format = media::VideoCaptureFormat(
(...skipping 17 matching lines...) Expand all
456 459
457 const gfx::Size dims(320, 240); 460 const gfx::Size dims(320, 240);
458 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer = 461 scoped_refptr<media::VideoCaptureDevice::Client::Buffer> buffer =
459 device_->ReserveOutputBuffer(media::VideoFrame::I420, dims); 462 device_->ReserveOutputBuffer(media::VideoFrame::I420, dims);
460 ASSERT_TRUE(buffer); 463 ASSERT_TRUE(buffer);
461 464
462 device_->OnError(); 465 device_->OnError();
463 device_->OnIncomingCapturedBuffer(buffer, 466 device_->OnIncomingCapturedBuffer(buffer,
464 media::VideoFrame::I420, 467 media::VideoFrame::I420,
465 dims, 468 dims,
466 base::Time(), 469 base::TimeTicks(),
467 device_format.frame_rate); 470 device_format.frame_rate);
468 buffer = NULL; 471 buffer = NULL;
469 472
470 EXPECT_CALL(*client_a_, DoError(route_id)).Times(1); 473 EXPECT_CALL(*client_a_, DoError(route_id)).Times(1);
471 base::RunLoop().RunUntilIdle(); 474 base::RunLoop().RunUntilIdle();
472 Mock::VerifyAndClearExpectations(client_a_.get()); 475 Mock::VerifyAndClearExpectations(client_a_.get());
473 476
474 // Second client connects after the error state. It also should get told of 477 // Second client connects after the error state. It also should get told of
475 // the error. 478 // the error.
476 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1); 479 EXPECT_CALL(*client_b_, DoError(route_id)).Times(1);
477 controller_->AddClient( 480 controller_->AddClient(
478 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200); 481 route_id, client_b_.get(), base::kNullProcessHandle, 200, session_200);
479 Mock::VerifyAndClearExpectations(client_b_.get()); 482 Mock::VerifyAndClearExpectations(client_b_.get());
480 } 483 }
481 484
482 } // namespace content 485 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698