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 settings = m_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 | |
381 if (!m_currentPointsOfInterest.isEmpty()) | |
382 settings.setPointsOfInterest(m_currentPointsOfInterest); | |
383 | |
384 if (m_capabilities.hasExposureCompensation()) { | |
385 settings.setExposureCompensation( | |
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 | |
393 if (m_capabilities.hasBrightness()) | |
394 settings.setBrightness(m_capabilities.brightness()->current()); | |
395 if (m_capabilities.hasContrast()) | |
396 settings.setContrast(m_capabilities.contrast()->current()); | |
397 if (m_capabilities.hasSaturation()) | |
398 settings.setSaturation(m_capabilities.saturation()->current()); | |
399 if (m_capabilities.hasSharpness()) | |
400 settings.setSharpness(m_capabilities.sharpness()->current()); | |
401 | |
402 if (m_capabilities.hasZoom()) | |
403 settings.setZoom(m_capabilities.zoom()->current()); | |
404 if (m_capabilities.hasTorch()) | |
405 settings.setTorch(m_capabilities.torch()); | |
406 } | 374 } |
407 | 375 |
408 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track) | 376 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track) |
409 : ContextLifecycleObserver(context), m_streamTrack(track) { | 377 : ContextLifecycleObserver(context), m_streamTrack(track) { |
410 DCHECK(m_streamTrack); | 378 DCHECK(m_streamTrack); |
411 DCHECK(!m_service.is_bound()); | 379 DCHECK(!m_service.is_bound()); |
412 | 380 |
413 Platform::current()->interfaceProvider()->getInterface( | 381 Platform::current()->interfaceProvider()->getInterface( |
414 mojo::MakeRequest(&m_service)); | 382 mojo::MakeRequest(&m_service)); |
415 | 383 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
489 if (!capabilities.is_null()) | 457 if (!capabilities.is_null()) |
490 onCapabilitiesUpdateInternal(*capabilities); | 458 onCapabilitiesUpdateInternal(*capabilities); |
491 } | 459 } |
492 | 460 |
493 void ImageCapture::onCapabilitiesUpdateInternal( | 461 void ImageCapture::onCapabilitiesUpdateInternal( |
494 const media::mojom::blink::PhotoCapabilities& capabilities) { | 462 const media::mojom::blink::PhotoCapabilities& capabilities) { |
495 // TODO(mcasas): adapt the mojo interface to return a list of supported Modes | 463 // TODO(mcasas): adapt the mojo interface to return a list of supported Modes |
496 // when moving these out of PhotoCapabilities, https://crbug.com/700607. | 464 // when moving these out of PhotoCapabilities, https://crbug.com/700607. |
497 m_capabilities.setWhiteBalanceMode( | 465 m_capabilities.setWhiteBalanceMode( |
498 WTF::Vector<WTF::String>({toString(capabilities.white_balance_mode)})); | 466 WTF::Vector<WTF::String>({toString(capabilities.white_balance_mode)})); |
467 if (m_capabilities.hasWhiteBalanceMode()) | |
468 m_settings.setWhiteBalanceMode(m_capabilities.whiteBalanceMode()[0]); | |
499 m_capabilities.setExposureMode( | 469 m_capabilities.setExposureMode( |
500 WTF::Vector<WTF::String>({toString(capabilities.exposure_mode)})); | 470 WTF::Vector<WTF::String>({toString(capabilities.exposure_mode)})); |
471 if (m_capabilities.hasExposureMode()) | |
472 m_settings.setExposureMode(m_capabilities.exposureMode()[0]); | |
501 m_capabilities.setFocusMode( | 473 m_capabilities.setFocusMode( |
502 WTF::Vector<WTF::String>({toString(capabilities.focus_mode)})); | 474 WTF::Vector<WTF::String>({toString(capabilities.focus_mode)})); |
475 if (m_capabilities.hasFocusMode()) | |
476 m_settings.setFocusMode(m_capabilities.focusMode()[0]); | |
503 | 477 |
478 HeapVector<Point2D> currentPointsOfInterest; | |
504 if (!capabilities.points_of_interest.isEmpty()) { | 479 if (!capabilities.points_of_interest.isEmpty()) { |
505 m_currentPointsOfInterest.clear(); | |
506 for (const auto& point : capabilities.points_of_interest) { | 480 for (const auto& point : capabilities.points_of_interest) { |
507 Point2D webPoint; | 481 Point2D webPoint; |
508 webPoint.setX(point->x); | 482 webPoint.setX(point->x); |
509 webPoint.setY(point->y); | 483 webPoint.setY(point->y); |
510 m_currentPointsOfInterest.push_back(mojo::Clone(webPoint)); | 484 currentPointsOfInterest.push_back(std::move(webPoint)); |
Reilly Grant (use Gerrit)
2017/04/04 22:46:29
The Point2D type doesn't have a move constructor s
mcasas
2017/04/04 22:59:47
Done.
| |
511 } | 485 } |
512 } | 486 } |
487 m_settings.setPointsOfInterest(std::move(currentPointsOfInterest)); | |
513 | 488 |
514 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when | 489 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when |
515 // mojo::StructTraits supports garbage-collected mappings, | 490 // mojo::StructTraits supports garbage-collected mappings, |
516 // https://crbug.com/700180. | 491 // https://crbug.com/700180. |
517 if (capabilities.exposure_compensation->max != | 492 if (capabilities.exposure_compensation->max != |
518 capabilities.exposure_compensation->min) { | 493 capabilities.exposure_compensation->min) { |
519 m_capabilities.setExposureCompensation( | 494 m_capabilities.setExposureCompensation( |
520 MediaSettingsRange::create(*capabilities.exposure_compensation)); | 495 MediaSettingsRange::create(*capabilities.exposure_compensation)); |
496 m_settings.setExposureCompensation( | |
497 capabilities.exposure_compensation->current); | |
521 } | 498 } |
522 if (capabilities.color_temperature->max != | 499 if (capabilities.color_temperature->max != |
523 capabilities.color_temperature->min) { | 500 capabilities.color_temperature->min) { |
524 m_capabilities.setColorTemperature( | 501 m_capabilities.setColorTemperature( |
525 MediaSettingsRange::create(*capabilities.color_temperature)); | 502 MediaSettingsRange::create(*capabilities.color_temperature)); |
503 m_settings.setColorTemperature(capabilities.color_temperature->current); | |
526 } | 504 } |
527 if (capabilities.iso->max != capabilities.iso->min) | 505 if (capabilities.iso->max != capabilities.iso->min) { |
528 m_capabilities.setIso(MediaSettingsRange::create(*capabilities.iso)); | 506 m_capabilities.setIso(MediaSettingsRange::create(*capabilities.iso)); |
507 m_settings.setIso(capabilities.iso->current); | |
508 } | |
529 | 509 |
530 if (capabilities.brightness->max != capabilities.brightness->min) { | 510 if (capabilities.brightness->max != capabilities.brightness->min) { |
531 m_capabilities.setBrightness( | 511 m_capabilities.setBrightness( |
532 MediaSettingsRange::create(*capabilities.brightness)); | 512 MediaSettingsRange::create(*capabilities.brightness)); |
513 m_settings.setBrightness(capabilities.brightness->current); | |
533 } | 514 } |
534 if (capabilities.contrast->max != capabilities.contrast->min) { | 515 if (capabilities.contrast->max != capabilities.contrast->min) { |
535 m_capabilities.setContrast( | 516 m_capabilities.setContrast( |
536 MediaSettingsRange::create(*capabilities.contrast)); | 517 MediaSettingsRange::create(*capabilities.contrast)); |
518 m_settings.setContrast(capabilities.contrast->current); | |
537 } | 519 } |
538 if (capabilities.saturation->max != capabilities.saturation->min) { | 520 if (capabilities.saturation->max != capabilities.saturation->min) { |
539 m_capabilities.setSaturation( | 521 m_capabilities.setSaturation( |
540 MediaSettingsRange::create(*capabilities.saturation)); | 522 MediaSettingsRange::create(*capabilities.saturation)); |
523 m_settings.setSaturation(capabilities.saturation->current); | |
541 } | 524 } |
542 if (capabilities.sharpness->max != capabilities.sharpness->min) { | 525 if (capabilities.sharpness->max != capabilities.sharpness->min) { |
543 m_capabilities.setSharpness( | 526 m_capabilities.setSharpness( |
544 MediaSettingsRange::create(*capabilities.sharpness)); | 527 MediaSettingsRange::create(*capabilities.sharpness)); |
528 m_settings.setSharpness(capabilities.sharpness->current); | |
545 } | 529 } |
546 | 530 |
547 if (capabilities.zoom->max != capabilities.zoom->min) | 531 if (capabilities.zoom->max != capabilities.zoom->min) { |
548 m_capabilities.setZoom(MediaSettingsRange::create(*capabilities.zoom)); | 532 m_capabilities.setZoom(MediaSettingsRange::create(*capabilities.zoom)); |
533 m_settings.setZoom(capabilities.zoom->current); | |
534 } | |
549 | 535 |
550 m_capabilities.setTorch(capabilities.torch); | 536 m_capabilities.setTorch(capabilities.torch); |
551 | 537 |
552 // TODO(mcasas): do |torch| when the mojom interface is updated, | 538 // TODO(mcasas): do |torch| when the mojom interface is updated, |
553 // https://crbug.com/700607. | 539 // https://crbug.com/700607. |
554 } | 540 } |
555 | 541 |
556 void ImageCapture::onServiceConnectionError() { | 542 void ImageCapture::onServiceConnectionError() { |
557 m_service.reset(); | 543 m_service.reset(); |
558 for (ScriptPromiseResolver* resolver : m_serviceRequests) | 544 for (ScriptPromiseResolver* resolver : m_serviceRequests) |
559 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); | 545 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); |
560 m_serviceRequests.clear(); | 546 m_serviceRequests.clear(); |
561 } | 547 } |
562 | 548 |
563 DEFINE_TRACE(ImageCapture) { | 549 DEFINE_TRACE(ImageCapture) { |
564 visitor->trace(m_streamTrack); | 550 visitor->trace(m_streamTrack); |
565 visitor->trace(m_capabilities); | 551 visitor->trace(m_capabilities); |
552 visitor->trace(m_settings); | |
566 visitor->trace(m_currentConstraints); | 553 visitor->trace(m_currentConstraints); |
567 visitor->trace(m_currentPointsOfInterest); | |
568 visitor->trace(m_serviceRequests); | 554 visitor->trace(m_serviceRequests); |
569 EventTargetWithInlineData::trace(visitor); | 555 EventTargetWithInlineData::trace(visitor); |
570 ContextLifecycleObserver::trace(visitor); | 556 ContextLifecycleObserver::trace(visitor); |
571 } | 557 } |
572 | 558 |
573 } // namespace blink | 559 } // namespace blink |
OLD | NEW |