Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "modules/imagecapture/ImageCapture.h" | 5 #include "modules/imagecapture/ImageCapture.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/CallbackPromiseAdapter.h" | 7 #include "bindings/core/v8/CallbackPromiseAdapter.h" |
| 8 #include "bindings/core/v8/ScriptPromiseResolver.h" | 8 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 9 #include "core/dom/DOMException.h" | 9 #include "core/dom/DOMException.h" |
| 10 #include "core/dom/ExceptionCode.h" | 10 #include "core/dom/ExceptionCode.h" |
| 11 #include "core/fileapi/Blob.h" | 11 #include "core/fileapi/Blob.h" |
| 12 #include "core/frame/ImageBitmap.h" | 12 #include "core/frame/ImageBitmap.h" |
| 13 #include "modules/EventTargetModules.h" | 13 #include "modules/EventTargetModules.h" |
| 14 #include "modules/imagecapture/MediaSettingsRange.h" | 14 #include "modules/imagecapture/MediaSettingsRange.h" |
| 15 #include "modules/imagecapture/PhotoCapabilities.h" | 15 #include "modules/imagecapture/PhotoCapabilities.h" |
| 16 #include "modules/imagecapture/PhotoSettings.h" | 16 #include "modules/imagecapture/PhotoSettings.h" |
| 17 #include "modules/mediastream/MediaStreamTrack.h" | 17 #include "modules/mediastream/MediaStreamTrack.h" |
| 18 #include "modules/mediastream/MediaTrackCapabilities.h" | 18 #include "modules/mediastream/MediaTrackCapabilities.h" |
| 19 #include "modules/mediastream/MediaTrackSettings.h" | |
| 19 #include "platform/WaitableEvent.h" | 20 #include "platform/WaitableEvent.h" |
| 20 #include "platform/mojo/MojoHelper.h" | 21 #include "platform/mojo/MojoHelper.h" |
| 21 #include "public/platform/InterfaceProvider.h" | 22 #include "public/platform/InterfaceProvider.h" |
| 22 #include "public/platform/Platform.h" | 23 #include "public/platform/Platform.h" |
| 23 #include "public/platform/WebImageCaptureFrameGrabber.h" | 24 #include "public/platform/WebImageCaptureFrameGrabber.h" |
| 24 #include "public/platform/WebMediaStreamTrack.h" | 25 #include "public/platform/WebMediaStreamTrack.h" |
| 25 #include "wtf/PtrUtil.h" | 26 #include "wtf/PtrUtil.h" |
| 26 | 27 |
| 27 namespace blink { | 28 namespace blink { |
| 28 | 29 |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 379 std::move(settings), | 380 std::move(settings), |
| 380 convertToBaseCallback(WTF::bind( | 381 convertToBaseCallback(WTF::bind( |
| 381 &ImageCapture::onSetOptions, wrapPersistent(this), | 382 &ImageCapture::onSetOptions, wrapPersistent(this), |
| 382 wrapPersistent(resolver)))); | 383 wrapPersistent(resolver)))); |
| 383 } | 384 } |
| 384 | 385 |
| 385 const MediaTrackConstraintSet& ImageCapture::getMediaTrackConstraints() const { | 386 const MediaTrackConstraintSet& ImageCapture::getMediaTrackConstraints() const { |
| 386 return m_currentConstraints; | 387 return m_currentConstraints; |
| 387 } | 388 } |
| 388 | 389 |
| 390 void ImageCapture::getMediaTrackSettings(MediaTrackSettings& settings) const { | |
| 391 DVLOG(1) << __func__; | |
|
Reilly Grant (use Gerrit)
2017/03/21 01:25:17
Left over logging?
mcasas
2017/03/21 02:40:10
Done.
| |
| 392 if (m_capabilities.hasWhiteBalanceMode()) | |
| 393 settings.setWhiteBalanceMode(m_capabilities.whiteBalanceMode()[0]); | |
| 394 if (m_capabilities.hasExposureMode()) | |
| 395 settings.setExposureMode(m_capabilities.exposureMode()[0]); | |
| 396 if (m_capabilities.hasFocusMode()) | |
| 397 settings.setFocusMode(m_capabilities.focusMode()[0]); | |
| 398 | |
| 399 if (m_capabilities.hasExposureCompensation()) { | |
| 400 settings.setExposureCompensation( | |
| 401 m_capabilities.exposureCompensation()->current()); | |
| 402 } | |
| 403 if (m_capabilities.hasColorTemperature()) | |
| 404 settings.setColorTemperature(m_capabilities.colorTemperature()->current()); | |
| 405 if (m_capabilities.hasIso()) | |
| 406 settings.setIso(m_capabilities.iso()->current()); | |
| 407 | |
| 408 if (m_capabilities.hasBrightness()) | |
| 409 settings.setBrightness(m_capabilities.brightness()->current()); | |
| 410 if (m_capabilities.hasContrast()) | |
| 411 settings.setContrast(m_capabilities.contrast()->current()); | |
| 412 if (m_capabilities.hasSaturation()) | |
| 413 settings.setSaturation(m_capabilities.saturation()->current()); | |
| 414 if (m_capabilities.hasSharpness()) | |
| 415 settings.setSharpness(m_capabilities.sharpness()->current()); | |
| 416 | |
| 417 if (m_capabilities.hasZoom()) | |
| 418 settings.setZoom(m_capabilities.zoom()->current()); | |
| 419 | |
| 420 // TODO(mcasas): add |torch| when the mojom interface is updated, | |
| 421 // https://crbug.com/700607. | |
| 422 } | |
| 423 | |
| 389 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track) | 424 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track) |
| 390 : ContextLifecycleObserver(context), m_streamTrack(track) { | 425 : ContextLifecycleObserver(context), m_streamTrack(track) { |
| 391 DCHECK(m_streamTrack); | 426 DCHECK(m_streamTrack); |
| 392 DCHECK(!m_service.is_bound()); | 427 DCHECK(!m_service.is_bound()); |
| 393 | 428 |
| 394 Platform::current()->interfaceProvider()->getInterface( | 429 Platform::current()->interfaceProvider()->getInterface( |
| 395 mojo::MakeRequest(&m_service)); | 430 mojo::MakeRequest(&m_service)); |
| 396 | 431 |
| 397 m_service.set_connection_error_handler(convertToBaseCallback(WTF::bind( | 432 m_service.set_connection_error_handler(convertToBaseCallback(WTF::bind( |
| 398 &ImageCapture::onServiceConnectionError, wrapWeakPersistent(this)))); | 433 &ImageCapture::onServiceConnectionError, wrapWeakPersistent(this)))); |
| 399 | 434 |
| 400 // Launch a retrieval of the current capabilities, which arrive asynchronously | 435 // Launch a retrieval of the current capabilities, which arrive asynchronously |
| 401 // to avoid blocking the main UI thread. | 436 // to avoid blocking the main UI thread. |
| 402 m_service->GetCapabilities( | 437 m_service->GetCapabilities( |
| 403 m_streamTrack->component()->source()->id(), | 438 m_streamTrack->component()->source()->id(), |
| 404 convertToBaseCallback(WTF::bind(&ImageCapture::onCapabilitiesBootstrap, | 439 convertToBaseCallback(WTF::bind(&ImageCapture::onCapabilitiesUpdate, |
| 405 wrapPersistent(this)))); | 440 wrapPersistent(this)))); |
| 406 } | 441 } |
| 407 | 442 |
| 408 void ImageCapture::onCapabilities( | 443 void ImageCapture::onCapabilities( |
| 409 ScriptPromiseResolver* resolver, | 444 ScriptPromiseResolver* resolver, |
| 410 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { | 445 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { |
| 411 DVLOG(1) << __func__; | 446 DVLOG(1) << __func__; |
|
Reilly Grant (use Gerrit)
2017/03/21 01:25:17
Left over debug logging?
mcasas
2017/03/21 02:40:10
Removed all stray DVLOG()s
| |
| 412 if (!m_serviceRequests.contains(resolver)) | 447 if (!m_serviceRequests.contains(resolver)) |
| 413 return; | 448 return; |
| 414 if (capabilities.is_null()) { | 449 if (capabilities.is_null()) { |
| 415 resolver->reject(DOMException::create(UnknownError, "platform error")); | 450 resolver->reject(DOMException::create(UnknownError, "platform error")); |
| 416 } else { | 451 } else { |
| 452 // Update the local capabilities cache. | |
| 453 onCapabilitiesUpdate(capabilities.Clone()); | |
| 454 | |
| 417 PhotoCapabilities* caps = PhotoCapabilities::create(); | 455 PhotoCapabilities* caps = PhotoCapabilities::create(); |
| 418 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when | 456 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when |
| 419 // mojo::StructTraits supports garbage-collected mappings, | 457 // mojo::StructTraits supports garbage-collected mappings, |
| 420 // https://crbug.com/700180. | 458 // https://crbug.com/700180. |
| 421 caps->setIso(MediaSettingsRange::create(std::move(capabilities->iso))); | 459 caps->setIso(MediaSettingsRange::create(std::move(capabilities->iso))); |
| 422 caps->setImageHeight( | 460 caps->setImageHeight( |
| 423 MediaSettingsRange::create(std::move(capabilities->height))); | 461 MediaSettingsRange::create(std::move(capabilities->height))); |
| 424 caps->setImageWidth( | 462 caps->setImageWidth( |
| 425 MediaSettingsRange::create(std::move(capabilities->width))); | 463 MediaSettingsRange::create(std::move(capabilities->width))); |
| 426 caps->setZoom(MediaSettingsRange::create(std::move(capabilities->zoom))); | 464 caps->setZoom(MediaSettingsRange::create(std::move(capabilities->zoom))); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 445 caps->setRedEyeReduction(capabilities->red_eye_reduction); | 483 caps->setRedEyeReduction(capabilities->red_eye_reduction); |
| 446 resolver->resolve(caps); | 484 resolver->resolve(caps); |
| 447 } | 485 } |
| 448 m_serviceRequests.erase(resolver); | 486 m_serviceRequests.erase(resolver); |
| 449 } | 487 } |
| 450 | 488 |
| 451 void ImageCapture::onSetOptions(ScriptPromiseResolver* resolver, bool result) { | 489 void ImageCapture::onSetOptions(ScriptPromiseResolver* resolver, bool result) { |
| 452 if (!m_serviceRequests.contains(resolver)) | 490 if (!m_serviceRequests.contains(resolver)) |
| 453 return; | 491 return; |
| 454 | 492 |
| 455 if (result) | 493 if (!result) { |
| 456 resolver->resolve(); | |
| 457 else | |
| 458 resolver->reject(DOMException::create(UnknownError, "setOptions failed")); | 494 resolver->reject(DOMException::create(UnknownError, "setOptions failed")); |
| 459 m_serviceRequests.erase(resolver); | 495 m_serviceRequests.erase(resolver); |
| 496 return; | |
| 497 } | |
| 498 | |
| 499 // Retrieve the current device status after setting the options. | |
| 500 m_service->GetCapabilities( | |
| 501 m_streamTrack->component()->source()->id(), | |
| 502 convertToBaseCallback(WTF::bind(&ImageCapture::onCapabilities, | |
| 503 wrapPersistent(this), | |
| 504 wrapPersistent(resolver)))); | |
| 460 } | 505 } |
| 461 | 506 |
| 462 void ImageCapture::onTakePhoto(ScriptPromiseResolver* resolver, | 507 void ImageCapture::onTakePhoto(ScriptPromiseResolver* resolver, |
| 463 media::mojom::blink::BlobPtr blob) { | 508 media::mojom::blink::BlobPtr blob) { |
| 464 if (!m_serviceRequests.contains(resolver)) | 509 if (!m_serviceRequests.contains(resolver)) |
| 465 return; | 510 return; |
| 466 | 511 |
| 467 // TODO(mcasas): Should be using a mojo::StructTraits. | 512 // TODO(mcasas): Should be using a mojo::StructTraits. |
| 468 if (blob->data.isEmpty()) | 513 if (blob->data.isEmpty()) |
| 469 resolver->reject(DOMException::create(UnknownError, "platform error")); | 514 resolver->reject(DOMException::create(UnknownError, "platform error")); |
| 470 else | 515 else |
| 471 resolver->resolve( | 516 resolver->resolve( |
| 472 Blob::create(blob->data.data(), blob->data.size(), blob->mime_type)); | 517 Blob::create(blob->data.data(), blob->data.size(), blob->mime_type)); |
| 473 m_serviceRequests.erase(resolver); | 518 m_serviceRequests.erase(resolver); |
| 474 } | 519 } |
| 475 | 520 |
| 476 void ImageCapture::onCapabilitiesBootstrap( | 521 void ImageCapture::onCapabilitiesUpdate( |
| 477 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { | 522 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { |
| 478 DVLOG(1) << __func__; | 523 DVLOG(1) << __func__; |
| 479 if (capabilities.is_null()) | 524 if (capabilities.is_null()) |
| 480 return; | 525 return; |
| 481 | 526 |
| 482 // TODO(mcasas): adapt the mojo interface to return a list of supported Modes | 527 // TODO(mcasas): adapt the mojo interface to return a list of supported Modes |
| 483 // when moving these out of PhotoCapabilities, https://crbug.com/700607. | 528 // when moving these out of PhotoCapabilities, https://crbug.com/700607. |
| 484 m_capabilities.setWhiteBalanceMode( | 529 m_capabilities.setWhiteBalanceMode( |
| 485 WTF::Vector<WTF::String>({toString(capabilities->white_balance_mode)})); | 530 WTF::Vector<WTF::String>({toString(capabilities->white_balance_mode)})); |
| 486 m_capabilities.setExposureMode( | 531 m_capabilities.setExposureMode( |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 541 | 586 |
| 542 DEFINE_TRACE(ImageCapture) { | 587 DEFINE_TRACE(ImageCapture) { |
| 543 visitor->trace(m_streamTrack); | 588 visitor->trace(m_streamTrack); |
| 544 visitor->trace(m_capabilities); | 589 visitor->trace(m_capabilities); |
| 545 visitor->trace(m_serviceRequests); | 590 visitor->trace(m_serviceRequests); |
| 546 EventTargetWithInlineData::trace(visitor); | 591 EventTargetWithInlineData::trace(visitor); |
| 547 ContextLifecycleObserver::trace(visitor); | 592 ContextLifecycleObserver::trace(visitor); |
| 548 } | 593 } |
| 549 | 594 |
| 550 } // namespace blink | 595 } // namespace blink |
| OLD | NEW |