| 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" | |
| 20 #include "platform/WaitableEvent.h" | 19 #include "platform/WaitableEvent.h" |
| 21 #include "platform/mojo/MojoHelper.h" | 20 #include "platform/mojo/MojoHelper.h" |
| 22 #include "public/platform/InterfaceProvider.h" | 21 #include "public/platform/InterfaceProvider.h" |
| 23 #include "public/platform/Platform.h" | 22 #include "public/platform/Platform.h" |
| 24 #include "public/platform/WebImageCaptureFrameGrabber.h" | 23 #include "public/platform/WebImageCaptureFrameGrabber.h" |
| 25 #include "public/platform/WebMediaStreamTrack.h" | 24 #include "public/platform/WebMediaStreamTrack.h" |
| 26 #include "wtf/PtrUtil.h" | 25 #include "wtf/PtrUtil.h" |
| 27 | 26 |
| 28 namespace blink { | 27 namespace blink { |
| 29 | 28 |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 convertToBaseCallback(WTF::bind( | 363 convertToBaseCallback(WTF::bind( |
| 365 &ImageCapture::onSetOptions, wrapPersistent(this), | 364 &ImageCapture::onSetOptions, wrapPersistent(this), |
| 366 wrapPersistent(resolver)))); | 365 wrapPersistent(resolver)))); |
| 367 } | 366 } |
| 368 | 367 |
| 369 const MediaTrackConstraintSet& ImageCapture::getMediaTrackConstraints() const { | 368 const MediaTrackConstraintSet& ImageCapture::getMediaTrackConstraints() const { |
| 370 return m_currentConstraints; | 369 return m_currentConstraints; |
| 371 } | 370 } |
| 372 | 371 |
| 373 void ImageCapture::getMediaTrackSettings(MediaTrackSettings& settings) const { | 372 void ImageCapture::getMediaTrackSettings(MediaTrackSettings& settings) const { |
| 374 if (m_capabilities.hasWhiteBalanceMode()) | 373 // Merge any present |m_settings| members into |settings|. |
| 375 settings.setWhiteBalanceMode(m_capabilities.whiteBalanceMode()[0]); | |
| 376 if (m_capabilities.hasExposureMode()) | |
| 377 settings.setExposureMode(m_capabilities.exposureMode()[0]); | |
| 378 if (m_capabilities.hasFocusMode()) | |
| 379 settings.setFocusMode(m_capabilities.focusMode()[0]); | |
| 380 | 374 |
| 381 if (!m_currentPointsOfInterest.isEmpty()) | 375 if (m_settings.hasWhiteBalanceMode()) |
| 382 settings.setPointsOfInterest(m_currentPointsOfInterest); | 376 settings.setWhiteBalanceMode(m_settings.whiteBalanceMode()); |
| 377 if (m_settings.hasExposureMode()) |
| 378 settings.setExposureMode(m_settings.exposureMode()); |
| 379 if (m_settings.hasFocusMode()) |
| 380 settings.setFocusMode(m_settings.focusMode()); |
| 383 | 381 |
| 384 if (m_capabilities.hasExposureCompensation()) { | 382 if (m_settings.hasPointsOfInterest()) |
| 385 settings.setExposureCompensation( | 383 settings.setPointsOfInterest(m_settings.pointsOfInterest()); |
| 386 m_capabilities.exposureCompensation()->current()); | |
| 387 } | |
| 388 if (m_capabilities.hasColorTemperature()) | |
| 389 settings.setColorTemperature(m_capabilities.colorTemperature()->current()); | |
| 390 if (m_capabilities.hasIso()) | |
| 391 settings.setIso(m_capabilities.iso()->current()); | |
| 392 | 384 |
| 393 if (m_capabilities.hasBrightness()) | 385 if (m_settings.hasExposureCompensation()) |
| 394 settings.setBrightness(m_capabilities.brightness()->current()); | 386 settings.setExposureCompensation(m_settings.exposureCompensation()); |
| 395 if (m_capabilities.hasContrast()) | 387 if (m_settings.hasColorTemperature()) |
| 396 settings.setContrast(m_capabilities.contrast()->current()); | 388 settings.setColorTemperature(m_settings.colorTemperature()); |
| 397 if (m_capabilities.hasSaturation()) | 389 if (m_settings.hasIso()) |
| 398 settings.setSaturation(m_capabilities.saturation()->current()); | 390 settings.setIso(m_settings.iso()); |
| 399 if (m_capabilities.hasSharpness()) | |
| 400 settings.setSharpness(m_capabilities.sharpness()->current()); | |
| 401 | 391 |
| 402 if (m_capabilities.hasZoom()) | 392 if (m_settings.hasBrightness()) |
| 403 settings.setZoom(m_capabilities.zoom()->current()); | 393 settings.setBrightness(m_settings.brightness()); |
| 404 if (m_capabilities.hasTorch()) | 394 if (m_settings.hasContrast()) |
| 405 settings.setTorch(m_capabilities.torch()); | 395 settings.setContrast(m_settings.contrast()); |
| 396 if (m_settings.hasSaturation()) |
| 397 settings.setSaturation(m_settings.saturation()); |
| 398 if (m_settings.hasSharpness()) |
| 399 settings.setSharpness(m_settings.sharpness()); |
| 400 |
| 401 if (m_settings.hasZoom()) |
| 402 settings.setZoom(m_settings.zoom()); |
| 403 if (m_settings.hasTorch()) |
| 404 settings.setTorch(m_settings.torch()); |
| 406 } | 405 } |
| 407 | 406 |
| 408 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track) | 407 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track) |
| 409 : ContextLifecycleObserver(context), m_streamTrack(track) { | 408 : ContextLifecycleObserver(context), m_streamTrack(track) { |
| 410 DCHECK(m_streamTrack); | 409 DCHECK(m_streamTrack); |
| 411 DCHECK(!m_service.is_bound()); | 410 DCHECK(!m_service.is_bound()); |
| 412 | 411 |
| 413 Platform::current()->interfaceProvider()->getInterface( | 412 Platform::current()->interfaceProvider()->getInterface( |
| 414 mojo::MakeRequest(&m_service)); | 413 mojo::MakeRequest(&m_service)); |
| 415 | 414 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 if (!capabilities.is_null()) | 488 if (!capabilities.is_null()) |
| 490 onCapabilitiesUpdateInternal(*capabilities); | 489 onCapabilitiesUpdateInternal(*capabilities); |
| 491 } | 490 } |
| 492 | 491 |
| 493 void ImageCapture::onCapabilitiesUpdateInternal( | 492 void ImageCapture::onCapabilitiesUpdateInternal( |
| 494 const media::mojom::blink::PhotoCapabilities& capabilities) { | 493 const media::mojom::blink::PhotoCapabilities& capabilities) { |
| 495 // TODO(mcasas): adapt the mojo interface to return a list of supported Modes | 494 // TODO(mcasas): adapt the mojo interface to return a list of supported Modes |
| 496 // when moving these out of PhotoCapabilities, https://crbug.com/700607. | 495 // when moving these out of PhotoCapabilities, https://crbug.com/700607. |
| 497 m_capabilities.setWhiteBalanceMode( | 496 m_capabilities.setWhiteBalanceMode( |
| 498 WTF::Vector<WTF::String>({toString(capabilities.white_balance_mode)})); | 497 WTF::Vector<WTF::String>({toString(capabilities.white_balance_mode)})); |
| 498 if (m_capabilities.hasWhiteBalanceMode()) |
| 499 m_settings.setWhiteBalanceMode(m_capabilities.whiteBalanceMode()[0]); |
| 499 m_capabilities.setExposureMode( | 500 m_capabilities.setExposureMode( |
| 500 WTF::Vector<WTF::String>({toString(capabilities.exposure_mode)})); | 501 WTF::Vector<WTF::String>({toString(capabilities.exposure_mode)})); |
| 502 if (m_capabilities.hasExposureMode()) |
| 503 m_settings.setExposureMode(m_capabilities.exposureMode()[0]); |
| 501 m_capabilities.setFocusMode( | 504 m_capabilities.setFocusMode( |
| 502 WTF::Vector<WTF::String>({toString(capabilities.focus_mode)})); | 505 WTF::Vector<WTF::String>({toString(capabilities.focus_mode)})); |
| 506 if (m_capabilities.hasFocusMode()) |
| 507 m_settings.setFocusMode(m_capabilities.focusMode()[0]); |
| 503 | 508 |
| 509 HeapVector<Point2D> currentPointsOfInterest; |
| 504 if (!capabilities.points_of_interest.isEmpty()) { | 510 if (!capabilities.points_of_interest.isEmpty()) { |
| 505 m_currentPointsOfInterest.clear(); | |
| 506 for (const auto& point : capabilities.points_of_interest) { | 511 for (const auto& point : capabilities.points_of_interest) { |
| 507 Point2D webPoint; | 512 Point2D webPoint; |
| 508 webPoint.setX(point->x); | 513 webPoint.setX(point->x); |
| 509 webPoint.setY(point->y); | 514 webPoint.setY(point->y); |
| 510 m_currentPointsOfInterest.push_back(mojo::Clone(webPoint)); | 515 currentPointsOfInterest.push_back(mojo::Clone(webPoint)); |
| 511 } | 516 } |
| 512 } | 517 } |
| 518 m_settings.setPointsOfInterest(std::move(currentPointsOfInterest)); |
| 513 | 519 |
| 514 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when | 520 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when |
| 515 // mojo::StructTraits supports garbage-collected mappings, | 521 // mojo::StructTraits supports garbage-collected mappings, |
| 516 // https://crbug.com/700180. | 522 // https://crbug.com/700180. |
| 517 if (capabilities.exposure_compensation->max != | 523 if (capabilities.exposure_compensation->max != |
| 518 capabilities.exposure_compensation->min) { | 524 capabilities.exposure_compensation->min) { |
| 519 m_capabilities.setExposureCompensation( | 525 m_capabilities.setExposureCompensation( |
| 520 MediaSettingsRange::create(*capabilities.exposure_compensation)); | 526 MediaSettingsRange::create(*capabilities.exposure_compensation)); |
| 527 m_settings.setExposureCompensation( |
| 528 capabilities.exposure_compensation->current); |
| 521 } | 529 } |
| 522 if (capabilities.color_temperature->max != | 530 if (capabilities.color_temperature->max != |
| 523 capabilities.color_temperature->min) { | 531 capabilities.color_temperature->min) { |
| 524 m_capabilities.setColorTemperature( | 532 m_capabilities.setColorTemperature( |
| 525 MediaSettingsRange::create(*capabilities.color_temperature)); | 533 MediaSettingsRange::create(*capabilities.color_temperature)); |
| 534 m_settings.setColorTemperature(capabilities.color_temperature->current); |
| 526 } | 535 } |
| 527 if (capabilities.iso->max != capabilities.iso->min) | 536 if (capabilities.iso->max != capabilities.iso->min) { |
| 528 m_capabilities.setIso(MediaSettingsRange::create(*capabilities.iso)); | 537 m_capabilities.setIso(MediaSettingsRange::create(*capabilities.iso)); |
| 538 m_settings.setIso(capabilities.iso->current); |
| 539 } |
| 529 | 540 |
| 530 if (capabilities.brightness->max != capabilities.brightness->min) { | 541 if (capabilities.brightness->max != capabilities.brightness->min) { |
| 531 m_capabilities.setBrightness( | 542 m_capabilities.setBrightness( |
| 532 MediaSettingsRange::create(*capabilities.brightness)); | 543 MediaSettingsRange::create(*capabilities.brightness)); |
| 544 m_settings.setBrightness(capabilities.brightness->current); |
| 533 } | 545 } |
| 534 if (capabilities.contrast->max != capabilities.contrast->min) { | 546 if (capabilities.contrast->max != capabilities.contrast->min) { |
| 535 m_capabilities.setContrast( | 547 m_capabilities.setContrast( |
| 536 MediaSettingsRange::create(*capabilities.contrast)); | 548 MediaSettingsRange::create(*capabilities.contrast)); |
| 549 m_settings.setContrast(capabilities.contrast->current); |
| 537 } | 550 } |
| 538 if (capabilities.saturation->max != capabilities.saturation->min) { | 551 if (capabilities.saturation->max != capabilities.saturation->min) { |
| 539 m_capabilities.setSaturation( | 552 m_capabilities.setSaturation( |
| 540 MediaSettingsRange::create(*capabilities.saturation)); | 553 MediaSettingsRange::create(*capabilities.saturation)); |
| 554 m_settings.setSaturation(capabilities.saturation->current); |
| 541 } | 555 } |
| 542 if (capabilities.sharpness->max != capabilities.sharpness->min) { | 556 if (capabilities.sharpness->max != capabilities.sharpness->min) { |
| 543 m_capabilities.setSharpness( | 557 m_capabilities.setSharpness( |
| 544 MediaSettingsRange::create(*capabilities.sharpness)); | 558 MediaSettingsRange::create(*capabilities.sharpness)); |
| 559 m_settings.setSharpness(capabilities.sharpness->current); |
| 545 } | 560 } |
| 546 | 561 |
| 547 if (capabilities.zoom->max != capabilities.zoom->min) | 562 if (capabilities.zoom->max != capabilities.zoom->min) { |
| 548 m_capabilities.setZoom(MediaSettingsRange::create(*capabilities.zoom)); | 563 m_capabilities.setZoom(MediaSettingsRange::create(*capabilities.zoom)); |
| 564 m_settings.setZoom(capabilities.zoom->current); |
| 565 } |
| 549 | 566 |
| 550 m_capabilities.setTorch(capabilities.torch); | 567 m_capabilities.setTorch(capabilities.torch); |
| 551 | 568 |
| 552 // TODO(mcasas): do |torch| when the mojom interface is updated, | 569 // TODO(mcasas): do |torch| when the mojom interface is updated, |
| 553 // https://crbug.com/700607. | 570 // https://crbug.com/700607. |
| 554 } | 571 } |
| 555 | 572 |
| 556 void ImageCapture::onServiceConnectionError() { | 573 void ImageCapture::onServiceConnectionError() { |
| 557 m_service.reset(); | 574 m_service.reset(); |
| 558 for (ScriptPromiseResolver* resolver : m_serviceRequests) | 575 for (ScriptPromiseResolver* resolver : m_serviceRequests) |
| 559 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); | 576 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); |
| 560 m_serviceRequests.clear(); | 577 m_serviceRequests.clear(); |
| 561 } | 578 } |
| 562 | 579 |
| 563 DEFINE_TRACE(ImageCapture) { | 580 DEFINE_TRACE(ImageCapture) { |
| 564 visitor->trace(m_streamTrack); | 581 visitor->trace(m_streamTrack); |
| 565 visitor->trace(m_capabilities); | 582 visitor->trace(m_capabilities); |
| 583 visitor->trace(m_settings); |
| 566 visitor->trace(m_currentConstraints); | 584 visitor->trace(m_currentConstraints); |
| 567 visitor->trace(m_currentPointsOfInterest); | |
| 568 visitor->trace(m_serviceRequests); | 585 visitor->trace(m_serviceRequests); |
| 569 EventTargetWithInlineData::trace(visitor); | 586 EventTargetWithInlineData::trace(visitor); |
| 570 ContextLifecycleObserver::trace(visitor); | 587 ContextLifecycleObserver::trace(visitor); |
| 571 } | 588 } |
| 572 | 589 |
| 573 } // namespace blink | 590 } // namespace blink |
| OLD | NEW |