| 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 "media/capture/video/video_capture_device.h" | 5 #include "media/capture/video/video_capture_device.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 #define MAYBE_AllocateBadSize AllocateBadSize | 68 #define MAYBE_AllocateBadSize AllocateBadSize |
| 69 #define MAYBE_CaptureMjpeg CaptureMjpeg | 69 #define MAYBE_CaptureMjpeg CaptureMjpeg |
| 70 #endif | 70 #endif |
| 71 | 71 |
| 72 using ::testing::_; | 72 using ::testing::_; |
| 73 using ::testing::SaveArg; | 73 using ::testing::SaveArg; |
| 74 | 74 |
| 75 namespace media { | 75 namespace media { |
| 76 namespace { | 76 namespace { |
| 77 | 77 |
| 78 class MockClient : public VideoCaptureDevice::Client { | 78 class MockVideoCaptureClient : public VideoCaptureDevice::Client { |
| 79 public: | 79 public: |
| 80 MOCK_METHOD0(DoReserveOutputBuffer, void(void)); | 80 MOCK_METHOD0(DoReserveOutputBuffer, void(void)); |
| 81 MOCK_METHOD0(DoOnIncomingCapturedBuffer, void(void)); | 81 MOCK_METHOD0(DoOnIncomingCapturedBuffer, void(void)); |
| 82 MOCK_METHOD0(DoOnIncomingCapturedVideoFrame, void(void)); | 82 MOCK_METHOD0(DoOnIncomingCapturedVideoFrame, void(void)); |
| 83 MOCK_METHOD0(DoResurrectLastOutputBuffer, void(void)); | 83 MOCK_METHOD0(DoResurrectLastOutputBuffer, void(void)); |
| 84 MOCK_METHOD2(OnError, | 84 MOCK_METHOD2(OnError, |
| 85 void(const tracked_objects::Location& from_here, | 85 void(const tracked_objects::Location& from_here, |
| 86 const std::string& reason)); | 86 const std::string& reason)); |
| 87 MOCK_CONST_METHOD0(GetBufferPoolUtilization, double(void)); | 87 MOCK_CONST_METHOD0(GetBufferPoolUtilization, double(void)); |
| 88 | 88 |
| 89 explicit MockClient(base::Callback<void(const VideoCaptureFormat&)> frame_cb) | 89 explicit MockVideoCaptureClient( |
| 90 base::Callback<void(const VideoCaptureFormat&)> frame_cb) |
| 90 : main_thread_(base::ThreadTaskRunnerHandle::Get()), | 91 : main_thread_(base::ThreadTaskRunnerHandle::Get()), |
| 91 frame_cb_(frame_cb) {} | 92 frame_cb_(frame_cb) {} |
| 92 | 93 |
| 93 void OnIncomingCapturedData(const uint8_t* data, | 94 void OnIncomingCapturedData(const uint8_t* data, |
| 94 int length, | 95 int length, |
| 95 const VideoCaptureFormat& format, | 96 const VideoCaptureFormat& format, |
| 96 int rotation, | 97 int rotation, |
| 97 base::TimeTicks reference_time, | 98 base::TimeTicks reference_time, |
| 98 base::TimeDelta timestamp) override { | 99 base::TimeDelta timestamp) override { |
| 99 ASSERT_GT(length, 0); | 100 ASSERT_GT(length, 0); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 }; | 153 }; |
| 153 | 154 |
| 154 } // namespace | 155 } // namespace |
| 155 | 156 |
| 156 class VideoCaptureDeviceTest : public testing::TestWithParam<gfx::Size> { | 157 class VideoCaptureDeviceTest : public testing::TestWithParam<gfx::Size> { |
| 157 protected: | 158 protected: |
| 158 typedef VideoCaptureDevice::Client Client; | 159 typedef VideoCaptureDevice::Client Client; |
| 159 | 160 |
| 160 VideoCaptureDeviceTest() | 161 VideoCaptureDeviceTest() |
| 161 : loop_(new base::MessageLoop()), | 162 : loop_(new base::MessageLoop()), |
| 162 client_( | 163 video_capture_client_(new MockVideoCaptureClient( |
| 163 new MockClient(base::Bind(&VideoCaptureDeviceTest::OnFrameCaptured, | 164 base::Bind(&VideoCaptureDeviceTest::OnFrameCaptured, |
| 164 base::Unretained(this)))), | 165 base::Unretained(this)))), |
| 165 video_capture_device_factory_(VideoCaptureDeviceFactory::CreateFactory( | 166 video_capture_device_factory_(VideoCaptureDeviceFactory::CreateFactory( |
| 166 base::ThreadTaskRunnerHandle::Get())) { | 167 base::ThreadTaskRunnerHandle::Get())) { |
| 167 device_enumeration_listener_ = new DeviceEnumerationListener(); | 168 device_enumeration_listener_ = new DeviceEnumerationListener(); |
| 168 } | 169 } |
| 169 | 170 |
| 170 void SetUp() override { | 171 void SetUp() override { |
| 171 #if defined(OS_ANDROID) | 172 #if defined(OS_ANDROID) |
| 172 VideoCaptureDeviceAndroid::RegisterVideoCaptureDevice( | 173 VideoCaptureDeviceAndroid::RegisterVideoCaptureDevice( |
| 173 base::android::AttachCurrentThread()); | 174 base::android::AttachCurrentThread()); |
| 174 #endif | 175 #endif |
| 175 #if defined(OS_MACOSX) | 176 #if defined(OS_MACOSX) |
| 176 AVFoundationGlue::InitializeAVFoundation(); | 177 AVFoundationGlue::InitializeAVFoundation(); |
| 177 #endif | 178 #endif |
| 178 EXPECT_CALL(*client_, DoReserveOutputBuffer()).Times(0); | 179 EXPECT_CALL(*video_capture_client_, DoReserveOutputBuffer()).Times(0); |
| 179 EXPECT_CALL(*client_, DoOnIncomingCapturedBuffer()).Times(0); | 180 EXPECT_CALL(*video_capture_client_, DoOnIncomingCapturedBuffer()).Times(0); |
| 180 EXPECT_CALL(*client_, DoOnIncomingCapturedVideoFrame()).Times(0); | 181 EXPECT_CALL(*video_capture_client_, DoOnIncomingCapturedVideoFrame()) |
| 182 .Times(0); |
| 181 } | 183 } |
| 182 | 184 |
| 183 void ResetWithNewClient() { | 185 void ResetWithNewClient() { |
| 184 client_.reset(new MockClient(base::Bind( | 186 video_capture_client_.reset(new MockVideoCaptureClient(base::Bind( |
| 185 &VideoCaptureDeviceTest::OnFrameCaptured, base::Unretained(this)))); | 187 &VideoCaptureDeviceTest::OnFrameCaptured, base::Unretained(this)))); |
| 186 } | 188 } |
| 187 | 189 |
| 188 void OnFrameCaptured(const VideoCaptureFormat& format) { | 190 void OnFrameCaptured(const VideoCaptureFormat& format) { |
| 189 last_format_ = format; | 191 last_format_ = format; |
| 190 run_loop_->QuitClosure().Run(); | 192 run_loop_->QuitClosure().Run(); |
| 191 } | 193 } |
| 192 | 194 |
| 193 void WaitForCapturedFrame() { | 195 void WaitForCapturedFrame() { |
| 194 run_loop_.reset(new base::RunLoop()); | 196 run_loop_.reset(new base::RunLoop()); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 } | 250 } |
| 249 return true; | 251 return true; |
| 250 } | 252 } |
| 251 | 253 |
| 252 #if defined(OS_WIN) | 254 #if defined(OS_WIN) |
| 253 base::win::ScopedCOMInitializer initialize_com_; | 255 base::win::ScopedCOMInitializer initialize_com_; |
| 254 #endif | 256 #endif |
| 255 std::unique_ptr<VideoCaptureDevice::Names> names_; | 257 std::unique_ptr<VideoCaptureDevice::Names> names_; |
| 256 std::unique_ptr<base::MessageLoop> loop_; | 258 std::unique_ptr<base::MessageLoop> loop_; |
| 257 std::unique_ptr<base::RunLoop> run_loop_; | 259 std::unique_ptr<base::RunLoop> run_loop_; |
| 258 std::unique_ptr<MockClient> client_; | 260 std::unique_ptr<MockVideoCaptureClient> video_capture_client_; |
| 259 scoped_refptr<DeviceEnumerationListener> device_enumeration_listener_; | 261 scoped_refptr<DeviceEnumerationListener> device_enumeration_listener_; |
| 260 VideoCaptureFormat last_format_; | 262 VideoCaptureFormat last_format_; |
| 261 std::unique_ptr<VideoCaptureDeviceFactory> video_capture_device_factory_; | 263 std::unique_ptr<VideoCaptureDeviceFactory> video_capture_device_factory_; |
| 262 }; | 264 }; |
| 263 | 265 |
| 264 // Cause hangs on Windows Debug. http://crbug.com/417824 | 266 // Cause hangs on Windows Debug. http://crbug.com/417824 |
| 265 #if defined(OS_WIN) && !defined(NDEBUG) | 267 #if defined(OS_WIN) && !defined(NDEBUG) |
| 266 #define MAYBE_OpenInvalidDevice DISABLED_OpenInvalidDevice | 268 #define MAYBE_OpenInvalidDevice DISABLED_OpenInvalidDevice |
| 267 #else | 269 #else |
| 268 #define MAYBE_OpenInvalidDevice OpenInvalidDevice | 270 #define MAYBE_OpenInvalidDevice OpenInvalidDevice |
| (...skipping 13 matching lines...) Expand all Loading... |
| 282 VideoCaptureDevice::Name device_name("jibberish", "jibberish"); | 284 VideoCaptureDevice::Name device_name("jibberish", "jibberish"); |
| 283 #endif | 285 #endif |
| 284 std::unique_ptr<VideoCaptureDevice> device = | 286 std::unique_ptr<VideoCaptureDevice> device = |
| 285 video_capture_device_factory_->Create(device_name); | 287 video_capture_device_factory_->Create(device_name); |
| 286 | 288 |
| 287 #if !defined(OS_MACOSX) | 289 #if !defined(OS_MACOSX) |
| 288 EXPECT_TRUE(device == NULL); | 290 EXPECT_TRUE(device == NULL); |
| 289 #else | 291 #else |
| 290 // The presence of the actual device is only checked on AllocateAndStart() | 292 // The presence of the actual device is only checked on AllocateAndStart() |
| 291 // and not on creation. | 293 // and not on creation. |
| 292 EXPECT_CALL(*client_, OnError(_, _)).Times(1); | 294 EXPECT_CALL(*video_capture_client_, OnError(_, _)).Times(1); |
| 293 | 295 |
| 294 VideoCaptureParams capture_params; | 296 VideoCaptureParams capture_params; |
| 295 capture_params.requested_format.frame_size.SetSize(640, 480); | 297 capture_params.requested_format.frame_size.SetSize(640, 480); |
| 296 capture_params.requested_format.frame_rate = 30; | 298 capture_params.requested_format.frame_rate = 30; |
| 297 capture_params.requested_format.pixel_format = PIXEL_FORMAT_I420; | 299 capture_params.requested_format.pixel_format = PIXEL_FORMAT_I420; |
| 298 device->AllocateAndStart(capture_params, std::move(client_)); | 300 device->AllocateAndStart(capture_params, std::move(video_capture_client_)); |
| 299 device->StopAndDeAllocate(); | 301 device->StopAndDeAllocate(); |
| 300 #endif | 302 #endif |
| 301 } | 303 } |
| 302 | 304 |
| 303 TEST_P(VideoCaptureDeviceTest, CaptureWithSize) { | 305 TEST_P(VideoCaptureDeviceTest, CaptureWithSize) { |
| 304 names_ = EnumerateDevices(); | 306 names_ = EnumerateDevices(); |
| 305 if (names_->empty()) { | 307 if (names_->empty()) { |
| 306 VLOG(1) << "No camera available. Exiting test."; | 308 VLOG(1) << "No camera available. Exiting test."; |
| 307 return; | 309 return; |
| 308 } | 310 } |
| 309 | 311 |
| 310 const gfx::Size& size = GetParam(); | 312 const gfx::Size& size = GetParam(); |
| 311 if (!IsCaptureSizeSupported(names_->front(), size)) | 313 if (!IsCaptureSizeSupported(names_->front(), size)) |
| 312 return; | 314 return; |
| 313 const int width = size.width(); | 315 const int width = size.width(); |
| 314 const int height = size.height(); | 316 const int height = size.height(); |
| 315 | 317 |
| 316 std::unique_ptr<VideoCaptureDevice> device( | 318 std::unique_ptr<VideoCaptureDevice> device( |
| 317 video_capture_device_factory_->Create(names_->front())); | 319 video_capture_device_factory_->Create(names_->front())); |
| 318 ASSERT_TRUE(device); | 320 ASSERT_TRUE(device); |
| 319 DVLOG(1) << names_->front().id(); | 321 DVLOG(1) << names_->front().id(); |
| 320 | 322 |
| 321 EXPECT_CALL(*client_, OnError(_, _)).Times(0); | 323 EXPECT_CALL(*video_capture_client_, OnError(_, _)).Times(0); |
| 322 | 324 |
| 323 VideoCaptureParams capture_params; | 325 VideoCaptureParams capture_params; |
| 324 capture_params.requested_format.frame_size.SetSize(width, height); | 326 capture_params.requested_format.frame_size.SetSize(width, height); |
| 325 capture_params.requested_format.frame_rate = 30.0f; | 327 capture_params.requested_format.frame_rate = 30.0f; |
| 326 capture_params.requested_format.pixel_format = | 328 capture_params.requested_format.pixel_format = |
| 327 PIXEL_FORMAT_I420; | 329 PIXEL_FORMAT_I420; |
| 328 device->AllocateAndStart(capture_params, std::move(client_)); | 330 device->AllocateAndStart(capture_params, std::move(video_capture_client_)); |
| 329 // Get captured video frames. | 331 // Get captured video frames. |
| 330 WaitForCapturedFrame(); | 332 WaitForCapturedFrame(); |
| 331 EXPECT_EQ(last_format().frame_size.width(), width); | 333 EXPECT_EQ(last_format().frame_size.width(), width); |
| 332 EXPECT_EQ(last_format().frame_size.height(), height); | 334 EXPECT_EQ(last_format().frame_size.height(), height); |
| 333 if (last_format().pixel_format != PIXEL_FORMAT_MJPEG) | 335 if (last_format().pixel_format != PIXEL_FORMAT_MJPEG) |
| 334 EXPECT_EQ(size.GetArea(), last_format().frame_size.GetArea()); | 336 EXPECT_EQ(size.GetArea(), last_format().frame_size.GetArea()); |
| 335 device->StopAndDeAllocate(); | 337 device->StopAndDeAllocate(); |
| 336 } | 338 } |
| 337 | 339 |
| 338 #if !defined(OS_ANDROID) | 340 #if !defined(OS_ANDROID) |
| 339 const gfx::Size kCaptureSizes[] = {gfx::Size(640, 480), gfx::Size(1280, 720)}; | 341 const gfx::Size kCaptureSizes[] = {gfx::Size(640, 480), gfx::Size(1280, 720)}; |
| 340 | 342 |
| 341 INSTANTIATE_TEST_CASE_P(VideoCaptureDeviceTests, | 343 INSTANTIATE_TEST_CASE_P(VideoCaptureDeviceTests, |
| 342 VideoCaptureDeviceTest, | 344 VideoCaptureDeviceTest, |
| 343 testing::ValuesIn(kCaptureSizes)); | 345 testing::ValuesIn(kCaptureSizes)); |
| 344 #endif | 346 #endif |
| 345 | 347 |
| 346 TEST_F(VideoCaptureDeviceTest, MAYBE_AllocateBadSize) { | 348 TEST_F(VideoCaptureDeviceTest, MAYBE_AllocateBadSize) { |
| 347 names_ = EnumerateDevices(); | 349 names_ = EnumerateDevices(); |
| 348 if (names_->empty()) { | 350 if (names_->empty()) { |
| 349 VLOG(1) << "No camera available. Exiting test."; | 351 VLOG(1) << "No camera available. Exiting test."; |
| 350 return; | 352 return; |
| 351 } | 353 } |
| 352 std::unique_ptr<VideoCaptureDevice> device( | 354 std::unique_ptr<VideoCaptureDevice> device( |
| 353 video_capture_device_factory_->Create(names_->front())); | 355 video_capture_device_factory_->Create(names_->front())); |
| 354 ASSERT_TRUE(device); | 356 ASSERT_TRUE(device); |
| 355 | 357 |
| 356 EXPECT_CALL(*client_, OnError(_, _)).Times(0); | 358 EXPECT_CALL(*video_capture_client_, OnError(_, _)).Times(0); |
| 357 | 359 |
| 358 const gfx::Size input_size(640, 480); | 360 const gfx::Size input_size(640, 480); |
| 359 VideoCaptureParams capture_params; | 361 VideoCaptureParams capture_params; |
| 360 capture_params.requested_format.frame_size.SetSize(637, 472); | 362 capture_params.requested_format.frame_size.SetSize(637, 472); |
| 361 capture_params.requested_format.frame_rate = 35; | 363 capture_params.requested_format.frame_rate = 35; |
| 362 capture_params.requested_format.pixel_format = | 364 capture_params.requested_format.pixel_format = |
| 363 PIXEL_FORMAT_I420; | 365 PIXEL_FORMAT_I420; |
| 364 device->AllocateAndStart(capture_params, std::move(client_)); | 366 device->AllocateAndStart(capture_params, std::move(video_capture_client_)); |
| 365 WaitForCapturedFrame(); | 367 WaitForCapturedFrame(); |
| 366 device->StopAndDeAllocate(); | 368 device->StopAndDeAllocate(); |
| 367 EXPECT_EQ(last_format().frame_size.width(), input_size.width()); | 369 EXPECT_EQ(last_format().frame_size.width(), input_size.width()); |
| 368 EXPECT_EQ(last_format().frame_size.height(), input_size.height()); | 370 EXPECT_EQ(last_format().frame_size.height(), input_size.height()); |
| 369 if (last_format().pixel_format != PIXEL_FORMAT_MJPEG) | 371 if (last_format().pixel_format != PIXEL_FORMAT_MJPEG) |
| 370 EXPECT_EQ(input_size.GetArea(), last_format().frame_size.GetArea()); | 372 EXPECT_EQ(input_size.GetArea(), last_format().frame_size.GetArea()); |
| 371 } | 373 } |
| 372 | 374 |
| 373 // Cause hangs on Windows, Linux. Fails Android. http://crbug.com/417824 | 375 // Cause hangs on Windows, Linux. Fails Android. http://crbug.com/417824 |
| 374 TEST_F(VideoCaptureDeviceTest, DISABLED_ReAllocateCamera) { | 376 TEST_F(VideoCaptureDeviceTest, DISABLED_ReAllocateCamera) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 386 gfx::Size resolution; | 388 gfx::Size resolution; |
| 387 if (i % 2) { | 389 if (i % 2) { |
| 388 resolution = gfx::Size(640, 480); | 390 resolution = gfx::Size(640, 480); |
| 389 } else { | 391 } else { |
| 390 resolution = gfx::Size(1280, 1024); | 392 resolution = gfx::Size(1280, 1024); |
| 391 } | 393 } |
| 392 VideoCaptureParams capture_params; | 394 VideoCaptureParams capture_params; |
| 393 capture_params.requested_format.frame_size = resolution; | 395 capture_params.requested_format.frame_size = resolution; |
| 394 capture_params.requested_format.frame_rate = 30; | 396 capture_params.requested_format.frame_rate = 30; |
| 395 capture_params.requested_format.pixel_format = PIXEL_FORMAT_I420; | 397 capture_params.requested_format.pixel_format = PIXEL_FORMAT_I420; |
| 396 device->AllocateAndStart(capture_params, std::move(client_)); | 398 device->AllocateAndStart(capture_params, std::move(video_capture_client_)); |
| 397 device->StopAndDeAllocate(); | 399 device->StopAndDeAllocate(); |
| 398 } | 400 } |
| 399 | 401 |
| 400 // Finally, do a device start and wait for it to finish. | 402 // Finally, do a device start and wait for it to finish. |
| 401 VideoCaptureParams capture_params; | 403 VideoCaptureParams capture_params; |
| 402 capture_params.requested_format.frame_size.SetSize(320, 240); | 404 capture_params.requested_format.frame_size.SetSize(320, 240); |
| 403 capture_params.requested_format.frame_rate = 30; | 405 capture_params.requested_format.frame_rate = 30; |
| 404 capture_params.requested_format.pixel_format = PIXEL_FORMAT_I420; | 406 capture_params.requested_format.pixel_format = PIXEL_FORMAT_I420; |
| 405 | 407 |
| 406 ResetWithNewClient(); | 408 ResetWithNewClient(); |
| 407 std::unique_ptr<VideoCaptureDevice> device( | 409 std::unique_ptr<VideoCaptureDevice> device( |
| 408 video_capture_device_factory_->Create(names_->front())); | 410 video_capture_device_factory_->Create(names_->front())); |
| 409 | 411 |
| 410 device->AllocateAndStart(capture_params, std::move(client_)); | 412 device->AllocateAndStart(capture_params, std::move(video_capture_client_)); |
| 411 WaitForCapturedFrame(); | 413 WaitForCapturedFrame(); |
| 412 device->StopAndDeAllocate(); | 414 device->StopAndDeAllocate(); |
| 413 device.reset(); | 415 device.reset(); |
| 414 EXPECT_EQ(last_format().frame_size.width(), 320); | 416 EXPECT_EQ(last_format().frame_size.width(), 320); |
| 415 EXPECT_EQ(last_format().frame_size.height(), 240); | 417 EXPECT_EQ(last_format().frame_size.height(), 240); |
| 416 } | 418 } |
| 417 | 419 |
| 418 TEST_F(VideoCaptureDeviceTest, DeAllocateCameraWhileRunning) { | 420 TEST_F(VideoCaptureDeviceTest, DeAllocateCameraWhileRunning) { |
| 419 names_ = EnumerateDevices(); | 421 names_ = EnumerateDevices(); |
| 420 if (names_->empty()) { | 422 if (names_->empty()) { |
| 421 VLOG(1) << "No camera available. Exiting test."; | 423 VLOG(1) << "No camera available. Exiting test."; |
| 422 return; | 424 return; |
| 423 } | 425 } |
| 424 std::unique_ptr<VideoCaptureDevice> device( | 426 std::unique_ptr<VideoCaptureDevice> device( |
| 425 video_capture_device_factory_->Create(names_->front())); | 427 video_capture_device_factory_->Create(names_->front())); |
| 426 ASSERT_TRUE(device); | 428 ASSERT_TRUE(device); |
| 427 | 429 |
| 428 EXPECT_CALL(*client_, OnError(_, _)).Times(0); | 430 EXPECT_CALL(*video_capture_client_, OnError(_, _)).Times(0); |
| 429 | 431 |
| 430 VideoCaptureParams capture_params; | 432 VideoCaptureParams capture_params; |
| 431 capture_params.requested_format.frame_size.SetSize(640, 480); | 433 capture_params.requested_format.frame_size.SetSize(640, 480); |
| 432 capture_params.requested_format.frame_rate = 30; | 434 capture_params.requested_format.frame_rate = 30; |
| 433 capture_params.requested_format.pixel_format = PIXEL_FORMAT_I420; | 435 capture_params.requested_format.pixel_format = PIXEL_FORMAT_I420; |
| 434 device->AllocateAndStart(capture_params, std::move(client_)); | 436 device->AllocateAndStart(capture_params, std::move(video_capture_client_)); |
| 435 // Get captured video frames. | 437 // Get captured video frames. |
| 436 WaitForCapturedFrame(); | 438 WaitForCapturedFrame(); |
| 437 EXPECT_EQ(last_format().frame_size.width(), 640); | 439 EXPECT_EQ(last_format().frame_size.width(), 640); |
| 438 EXPECT_EQ(last_format().frame_size.height(), 480); | 440 EXPECT_EQ(last_format().frame_size.height(), 480); |
| 439 EXPECT_EQ(last_format().frame_rate, 30); | 441 EXPECT_EQ(last_format().frame_rate, 30); |
| 440 device->StopAndDeAllocate(); | 442 device->StopAndDeAllocate(); |
| 441 } | 443 } |
| 442 | 444 |
| 443 // Start the camera in 720p to capture MJPEG instead of a raw format. | 445 // Start the camera in 720p to capture MJPEG instead of a raw format. |
| 444 TEST_F(VideoCaptureDeviceTest, MAYBE_CaptureMjpeg) { | 446 TEST_F(VideoCaptureDeviceTest, MAYBE_CaptureMjpeg) { |
| 445 std::unique_ptr<VideoCaptureDevice::Name> name = | 447 std::unique_ptr<VideoCaptureDevice::Name> name = |
| 446 GetFirstDeviceNameSupportingPixelFormat(PIXEL_FORMAT_MJPEG); | 448 GetFirstDeviceNameSupportingPixelFormat(PIXEL_FORMAT_MJPEG); |
| 447 if (!name) { | 449 if (!name) { |
| 448 VLOG(1) << "No camera supports MJPEG format. Exiting test."; | 450 VLOG(1) << "No camera supports MJPEG format. Exiting test."; |
| 449 return; | 451 return; |
| 450 } | 452 } |
| 451 #if defined(OS_WIN) | 453 #if defined(OS_WIN) |
| 452 base::win::Version version = base::win::GetVersion(); | 454 base::win::Version version = base::win::GetVersion(); |
| 453 VLOG(1) << "Windows version: " << (int)version; | 455 VLOG(1) << "Windows version: " << (int)version; |
| 454 if (version >= base::win::VERSION_WIN10) { | 456 if (version >= base::win::VERSION_WIN10) { |
| 455 VLOG(1) << "Skipped on Win10: http://crbug.com/570604."; | 457 VLOG(1) << "Skipped on Win10: http://crbug.com/570604."; |
| 456 return; | 458 return; |
| 457 } | 459 } |
| 458 #endif | 460 #endif |
| 459 std::unique_ptr<VideoCaptureDevice> device( | 461 std::unique_ptr<VideoCaptureDevice> device( |
| 460 video_capture_device_factory_->Create(*name)); | 462 video_capture_device_factory_->Create(*name)); |
| 461 ASSERT_TRUE(device); | 463 ASSERT_TRUE(device); |
| 462 | 464 |
| 463 EXPECT_CALL(*client_, OnError(_, _)).Times(0); | 465 EXPECT_CALL(*video_capture_client_, OnError(_, _)).Times(0); |
| 464 | 466 |
| 465 VideoCaptureParams capture_params; | 467 VideoCaptureParams capture_params; |
| 466 capture_params.requested_format.frame_size.SetSize(1280, 720); | 468 capture_params.requested_format.frame_size.SetSize(1280, 720); |
| 467 capture_params.requested_format.frame_rate = 30; | 469 capture_params.requested_format.frame_rate = 30; |
| 468 capture_params.requested_format.pixel_format = PIXEL_FORMAT_MJPEG; | 470 capture_params.requested_format.pixel_format = PIXEL_FORMAT_MJPEG; |
| 469 device->AllocateAndStart(capture_params, std::move(client_)); | 471 device->AllocateAndStart(capture_params, std::move(video_capture_client_)); |
| 470 // Get captured video frames. | 472 // Get captured video frames. |
| 471 WaitForCapturedFrame(); | 473 WaitForCapturedFrame(); |
| 472 // Verify we get MJPEG from the device. Not all devices can capture 1280x720 | 474 // Verify we get MJPEG from the device. Not all devices can capture 1280x720 |
| 473 // @ 30 fps, so we don't care about the exact resolution we get. | 475 // @ 30 fps, so we don't care about the exact resolution we get. |
| 474 EXPECT_EQ(last_format().pixel_format, PIXEL_FORMAT_MJPEG); | 476 EXPECT_EQ(last_format().pixel_format, PIXEL_FORMAT_MJPEG); |
| 475 EXPECT_GE(static_cast<size_t>(1280 * 720), | 477 EXPECT_GE(static_cast<size_t>(1280 * 720), |
| 476 last_format().ImageAllocationSize()); | 478 last_format().ImageAllocationSize()); |
| 477 device->StopAndDeAllocate(); | 479 device->StopAndDeAllocate(); |
| 478 } | 480 } |
| 479 | 481 |
| 480 TEST_F(VideoCaptureDeviceTest, GetDeviceSupportedFormats) { | 482 TEST_F(VideoCaptureDeviceTest, GetDeviceSupportedFormats) { |
| 481 // Use PIXEL_FORMAT_MAX to iterate all device names for testing | 483 // Use PIXEL_FORMAT_MAX to iterate all device names for testing |
| 482 // GetDeviceSupportedFormats(). | 484 // GetDeviceSupportedFormats(). |
| 483 std::unique_ptr<VideoCaptureDevice::Name> name = | 485 std::unique_ptr<VideoCaptureDevice::Name> name = |
| 484 GetFirstDeviceNameSupportingPixelFormat(PIXEL_FORMAT_MAX); | 486 GetFirstDeviceNameSupportingPixelFormat(PIXEL_FORMAT_MAX); |
| 485 // Verify no camera returned for PIXEL_FORMAT_MAX. Nothing else | 487 // Verify no camera returned for PIXEL_FORMAT_MAX. Nothing else |
| 486 // to test here | 488 // to test here |
| 487 // since we cannot forecast the hardware capabilities. | 489 // since we cannot forecast the hardware capabilities. |
| 488 ASSERT_FALSE(name); | 490 ASSERT_FALSE(name); |
| 489 } | 491 } |
| 490 | 492 |
| 491 }; // namespace media | 493 }; // namespace media |
| OLD | NEW |