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" |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include "platform/mojo/MojoHelper.h" | 21 #include "platform/mojo/MojoHelper.h" |
22 #include "public/platform/InterfaceProvider.h" | 22 #include "public/platform/InterfaceProvider.h" |
23 #include "public/platform/Platform.h" | 23 #include "public/platform/Platform.h" |
24 #include "public/platform/WebImageCaptureFrameGrabber.h" | 24 #include "public/platform/WebImageCaptureFrameGrabber.h" |
25 #include "public/platform/WebMediaStreamTrack.h" | 25 #include "public/platform/WebMediaStreamTrack.h" |
26 #include "wtf/PtrUtil.h" | 26 #include "wtf/PtrUtil.h" |
27 | 27 |
28 namespace blink { | 28 namespace blink { |
29 | 29 |
30 using FillLightMode = media::mojom::blink::FillLightMode; | 30 using FillLightMode = media::mojom::blink::FillLightMode; |
| 31 using MeteringMode = media::mojom::blink::MeteringMode; |
31 | 32 |
32 namespace { | 33 namespace { |
33 | 34 |
34 const char kNoServiceError[] = "ImageCapture service unavailable."; | 35 const char kNoServiceError[] = "ImageCapture service unavailable."; |
35 | 36 |
36 bool trackIsInactive(const MediaStreamTrack& track) { | 37 bool trackIsInactive(const MediaStreamTrack& track) { |
37 // Spec instructs to return an exception if the Track's readyState() is not | 38 // Spec instructs to return an exception if the Track's readyState() is not |
38 // "live". Also reject if the track is disabled or muted. | 39 // "live". Also reject if the track is disabled or muted. |
39 return track.readyState() != "live" || !track.enabled() || track.muted(); | 40 return track.readyState() != "live" || !track.enabled() || track.muted(); |
40 } | 41 } |
41 | 42 |
42 media::mojom::blink::MeteringMode parseMeteringMode(const String& blinkMode) { | 43 MeteringMode parseMeteringMode(const String& blinkMode) { |
43 if (blinkMode == "manual") | 44 if (blinkMode == "manual") |
44 return media::mojom::blink::MeteringMode::MANUAL; | 45 return MeteringMode::MANUAL; |
45 if (blinkMode == "single-shot") | 46 if (blinkMode == "single-shot") |
46 return media::mojom::blink::MeteringMode::SINGLE_SHOT; | 47 return MeteringMode::SINGLE_SHOT; |
47 if (blinkMode == "continuous") | 48 if (blinkMode == "continuous") |
48 return media::mojom::blink::MeteringMode::CONTINUOUS; | 49 return MeteringMode::CONTINUOUS; |
49 return media::mojom::blink::MeteringMode::NONE; | 50 if (blinkMode == "none") |
| 51 return MeteringMode::NONE; |
| 52 NOTREACHED(); |
| 53 return MeteringMode::NONE; |
50 } | 54 } |
51 | 55 |
52 FillLightMode parseFillLightMode(const String& blinkMode) { | 56 FillLightMode parseFillLightMode(const String& blinkMode) { |
53 if (blinkMode == "off") | 57 if (blinkMode == "off") |
54 return FillLightMode::OFF; | 58 return FillLightMode::OFF; |
55 if (blinkMode == "auto") | 59 if (blinkMode == "auto") |
56 return FillLightMode::AUTO; | 60 return FillLightMode::AUTO; |
57 if (blinkMode == "flash") | 61 if (blinkMode == "flash") |
58 return FillLightMode::FLASH; | 62 return FillLightMode::FLASH; |
59 return FillLightMode::NONE; | 63 NOTREACHED(); |
| 64 return FillLightMode::OFF; |
60 } | 65 } |
61 | 66 |
62 WebString toString(media::mojom::blink::MeteringMode value) { | 67 WebString toString(MeteringMode value) { |
63 switch (value) { | 68 switch (value) { |
64 case media::mojom::blink::MeteringMode::NONE: | 69 case MeteringMode::NONE: |
65 return WebString::fromUTF8("none"); | 70 return WebString::fromUTF8("none"); |
66 case media::mojom::blink::MeteringMode::MANUAL: | 71 case MeteringMode::MANUAL: |
67 return WebString::fromUTF8("manual"); | 72 return WebString::fromUTF8("manual"); |
68 case media::mojom::blink::MeteringMode::SINGLE_SHOT: | 73 case MeteringMode::SINGLE_SHOT: |
69 return WebString::fromUTF8("single-shot"); | 74 return WebString::fromUTF8("single-shot"); |
70 case media::mojom::blink::MeteringMode::CONTINUOUS: | 75 case MeteringMode::CONTINUOUS: |
71 return WebString::fromUTF8("continuous"); | 76 return WebString::fromUTF8("continuous"); |
72 default: | 77 default: |
73 NOTREACHED() << "Unknown MeteringMode"; | 78 NOTREACHED() << "Unknown MeteringMode"; |
74 } | 79 } |
75 return WebString(); | 80 return WebString(); |
76 } | 81 } |
77 | 82 |
78 } // anonymous namespace | 83 } // anonymous namespace |
79 | 84 |
80 ImageCapture* ImageCapture::create(ExecutionContext* context, | 85 ImageCapture* ImageCapture::create(ExecutionContext* context, |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 m_currentConstraints.setSharpness(constraints.sharpness()); | 343 m_currentConstraints.setSharpness(constraints.sharpness()); |
339 settings->sharpness = constraints.sharpness().getAsDouble(); | 344 settings->sharpness = constraints.sharpness().getAsDouble(); |
340 } | 345 } |
341 | 346 |
342 settings->has_zoom = constraints.hasZoom() && constraints.zoom().isDouble(); | 347 settings->has_zoom = constraints.hasZoom() && constraints.zoom().isDouble(); |
343 if (settings->has_zoom) { | 348 if (settings->has_zoom) { |
344 m_currentConstraints.setZoom(constraints.zoom()); | 349 m_currentConstraints.setZoom(constraints.zoom()); |
345 settings->zoom = constraints.zoom().getAsDouble(); | 350 settings->zoom = constraints.zoom().getAsDouble(); |
346 } | 351 } |
347 | 352 |
348 // TODO(mcasas): add |torch| when the mojom interface is updated, | 353 // TODO(mcasas): support ConstrainBooleanParameters where applicable. |
349 // https://crbug.com/700607. | 354 settings->has_torch = |
| 355 constraints.hasTorch() && constraints.torch().isBoolean(); |
| 356 if (settings->has_torch) { |
| 357 m_currentConstraints.setTorch(constraints.torch()); |
| 358 settings->torch = constraints.torch().getAsBoolean(); |
| 359 } |
350 | 360 |
351 m_service->SetOptions(m_streamTrack->component()->source()->id(), | 361 m_service->SetOptions(m_streamTrack->component()->source()->id(), |
352 std::move(settings), | 362 std::move(settings), |
353 convertToBaseCallback(WTF::bind( | 363 convertToBaseCallback(WTF::bind( |
354 &ImageCapture::onSetOptions, wrapPersistent(this), | 364 &ImageCapture::onSetOptions, wrapPersistent(this), |
355 wrapPersistent(resolver)))); | 365 wrapPersistent(resolver)))); |
356 } | 366 } |
357 | 367 |
358 const MediaTrackConstraintSet& ImageCapture::getMediaTrackConstraints() const { | 368 const MediaTrackConstraintSet& ImageCapture::getMediaTrackConstraints() const { |
359 return m_currentConstraints; | 369 return m_currentConstraints; |
(...skipping 20 matching lines...) Expand all Loading... |
380 settings.setBrightness(m_capabilities.brightness()->current()); | 390 settings.setBrightness(m_capabilities.brightness()->current()); |
381 if (m_capabilities.hasContrast()) | 391 if (m_capabilities.hasContrast()) |
382 settings.setContrast(m_capabilities.contrast()->current()); | 392 settings.setContrast(m_capabilities.contrast()->current()); |
383 if (m_capabilities.hasSaturation()) | 393 if (m_capabilities.hasSaturation()) |
384 settings.setSaturation(m_capabilities.saturation()->current()); | 394 settings.setSaturation(m_capabilities.saturation()->current()); |
385 if (m_capabilities.hasSharpness()) | 395 if (m_capabilities.hasSharpness()) |
386 settings.setSharpness(m_capabilities.sharpness()->current()); | 396 settings.setSharpness(m_capabilities.sharpness()->current()); |
387 | 397 |
388 if (m_capabilities.hasZoom()) | 398 if (m_capabilities.hasZoom()) |
389 settings.setZoom(m_capabilities.zoom()->current()); | 399 settings.setZoom(m_capabilities.zoom()->current()); |
| 400 if (m_capabilities.hasTorch()) |
| 401 settings.setTorch(m_capabilities.torch()); |
390 | 402 |
391 // TODO(mcasas): add |torch| when the mojom interface is updated, | 403 // TODO(mcasas): add |torch| when the mojom interface is updated, |
392 // https://crbug.com/700607. | 404 // https://crbug.com/700607. |
393 } | 405 } |
394 | 406 |
395 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track) | 407 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track) |
396 : ContextLifecycleObserver(context), m_streamTrack(track) { | 408 : ContextLifecycleObserver(context), m_streamTrack(track) { |
397 DCHECK(m_streamTrack); | 409 DCHECK(m_streamTrack); |
398 DCHECK(!m_service.is_bound()); | 410 DCHECK(!m_service.is_bound()); |
399 | 411 |
(...skipping 16 matching lines...) Expand all Loading... |
416 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { | 428 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { |
417 if (!m_serviceRequests.contains(resolver)) | 429 if (!m_serviceRequests.contains(resolver)) |
418 return; | 430 return; |
419 if (capabilities.is_null()) { | 431 if (capabilities.is_null()) { |
420 resolver->reject(DOMException::create(UnknownError, "platform error")); | 432 resolver->reject(DOMException::create(UnknownError, "platform error")); |
421 } else { | 433 } else { |
422 // Update the local capabilities cache. | 434 // Update the local capabilities cache. |
423 onCapabilitiesUpdate(capabilities.Clone()); | 435 onCapabilitiesUpdate(capabilities.Clone()); |
424 | 436 |
425 PhotoCapabilities* caps = PhotoCapabilities::create(); | 437 PhotoCapabilities* caps = PhotoCapabilities::create(); |
| 438 |
| 439 caps->setRedEyeReduction(capabilities->red_eye_reduction); |
426 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when | 440 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when |
427 // mojo::StructTraits supports garbage-collected mappings, | 441 // mojo::StructTraits supports garbage-collected mappings, |
428 // https://crbug.com/700180. | 442 // https://crbug.com/700180. |
429 caps->setImageHeight( | 443 caps->setImageHeight( |
430 MediaSettingsRange::create(std::move(capabilities->height))); | 444 MediaSettingsRange::create(std::move(capabilities->height))); |
431 caps->setImageWidth( | 445 caps->setImageWidth( |
432 MediaSettingsRange::create(std::move(capabilities->width))); | 446 MediaSettingsRange::create(std::move(capabilities->width))); |
433 | 447 caps->setFillLightMode(capabilities->fill_light_mode); |
434 // TODO(mcasas): use a list of supported modes when mojo is updated. | |
435 // https://crbug.com/700607. | |
436 if (capabilities->fill_light_mode == FillLightMode::NONE) | |
437 caps->setFillLightMode(Vector<FillLightMode>()); | |
438 else | |
439 caps->setFillLightMode({capabilities->fill_light_mode}); | |
440 | |
441 // TODO(mcasas): use a list of supported modes when mojo is updated. | |
442 // https://crbug.com/700607. | |
443 caps->setRedEyeReduction(capabilities->red_eye_reduction); | |
444 | 448 |
445 resolver->resolve(caps); | 449 resolver->resolve(caps); |
446 } | 450 } |
447 m_serviceRequests.erase(resolver); | 451 m_serviceRequests.erase(resolver); |
448 } | 452 } |
449 | 453 |
450 void ImageCapture::onSetOptions(ScriptPromiseResolver* resolver, bool result) { | 454 void ImageCapture::onSetOptions(ScriptPromiseResolver* resolver, bool result) { |
451 if (!m_serviceRequests.contains(resolver)) | 455 if (!m_serviceRequests.contains(resolver)) |
452 return; | 456 return; |
453 | 457 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 if (capabilities->sharpness->max != capabilities->sharpness->min) { | 530 if (capabilities->sharpness->max != capabilities->sharpness->min) { |
527 m_capabilities.setSharpness( | 531 m_capabilities.setSharpness( |
528 MediaSettingsRange::create(std::move(capabilities->sharpness))); | 532 MediaSettingsRange::create(std::move(capabilities->sharpness))); |
529 } | 533 } |
530 | 534 |
531 if (capabilities->zoom->max != capabilities->zoom->min) { | 535 if (capabilities->zoom->max != capabilities->zoom->min) { |
532 m_capabilities.setZoom( | 536 m_capabilities.setZoom( |
533 MediaSettingsRange::create(std::move(capabilities->zoom))); | 537 MediaSettingsRange::create(std::move(capabilities->zoom))); |
534 } | 538 } |
535 | 539 |
| 540 m_capabilities.setTorch(capabilities->torch); |
| 541 |
536 // TODO(mcasas): do |torch| when the mojom interface is updated, | 542 // TODO(mcasas): do |torch| when the mojom interface is updated, |
537 // https://crbug.com/700607. | 543 // https://crbug.com/700607. |
538 } | 544 } |
539 | 545 |
540 void ImageCapture::onServiceConnectionError() { | 546 void ImageCapture::onServiceConnectionError() { |
541 m_service.reset(); | 547 m_service.reset(); |
542 for (ScriptPromiseResolver* resolver : m_serviceRequests) | 548 for (ScriptPromiseResolver* resolver : m_serviceRequests) |
543 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); | 549 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); |
544 m_serviceRequests.clear(); | 550 m_serviceRequests.clear(); |
545 } | 551 } |
546 | 552 |
547 DEFINE_TRACE(ImageCapture) { | 553 DEFINE_TRACE(ImageCapture) { |
548 visitor->trace(m_streamTrack); | 554 visitor->trace(m_streamTrack); |
549 visitor->trace(m_capabilities); | 555 visitor->trace(m_capabilities); |
550 visitor->trace(m_currentConstraints); | 556 visitor->trace(m_currentConstraints); |
551 visitor->trace(m_serviceRequests); | 557 visitor->trace(m_serviceRequests); |
552 EventTargetWithInlineData::trace(visitor); | 558 EventTargetWithInlineData::trace(visitor); |
553 ContextLifecycleObserver::trace(visitor); | 559 ContextLifecycleObserver::trace(visitor); |
554 } | 560 } |
555 | 561 |
556 } // namespace blink | 562 } // namespace blink |
OLD | NEW |