Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp

Issue 2766473002: Image Capture: wire getSettings() from MediaStreamTrack (Closed)
Patch Set: reillyg@s comments Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 if (m_capabilities.hasWhiteBalanceMode())
392 settings.setWhiteBalanceMode(m_capabilities.whiteBalanceMode()[0]);
393 if (m_capabilities.hasExposureMode())
394 settings.setExposureMode(m_capabilities.exposureMode()[0]);
395 if (m_capabilities.hasFocusMode())
396 settings.setFocusMode(m_capabilities.focusMode()[0]);
397
398 if (m_capabilities.hasExposureCompensation()) {
399 settings.setExposureCompensation(
400 m_capabilities.exposureCompensation()->current());
401 }
402 if (m_capabilities.hasColorTemperature())
403 settings.setColorTemperature(m_capabilities.colorTemperature()->current());
404 if (m_capabilities.hasIso())
405 settings.setIso(m_capabilities.iso()->current());
406
407 if (m_capabilities.hasBrightness())
408 settings.setBrightness(m_capabilities.brightness()->current());
409 if (m_capabilities.hasContrast())
410 settings.setContrast(m_capabilities.contrast()->current());
411 if (m_capabilities.hasSaturation())
412 settings.setSaturation(m_capabilities.saturation()->current());
413 if (m_capabilities.hasSharpness())
414 settings.setSharpness(m_capabilities.sharpness()->current());
415
416 if (m_capabilities.hasZoom())
417 settings.setZoom(m_capabilities.zoom()->current());
418
419 // TODO(mcasas): add |torch| when the mojom interface is updated,
420 // https://crbug.com/700607.
421 }
422
389 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track) 423 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track)
390 : ContextLifecycleObserver(context), m_streamTrack(track) { 424 : ContextLifecycleObserver(context), m_streamTrack(track) {
391 DCHECK(m_streamTrack); 425 DCHECK(m_streamTrack);
392 DCHECK(!m_service.is_bound()); 426 DCHECK(!m_service.is_bound());
393 427
394 Platform::current()->interfaceProvider()->getInterface( 428 Platform::current()->interfaceProvider()->getInterface(
395 mojo::MakeRequest(&m_service)); 429 mojo::MakeRequest(&m_service));
396 430
397 m_service.set_connection_error_handler(convertToBaseCallback(WTF::bind( 431 m_service.set_connection_error_handler(convertToBaseCallback(WTF::bind(
398 &ImageCapture::onServiceConnectionError, wrapWeakPersistent(this)))); 432 &ImageCapture::onServiceConnectionError, wrapWeakPersistent(this))));
399 433
400 // Launch a retrieval of the current capabilities, which arrive asynchronously 434 // Launch a retrieval of the current capabilities, which arrive asynchronously
401 // to avoid blocking the main UI thread. 435 // to avoid blocking the main UI thread.
402 m_service->GetCapabilities( 436 m_service->GetCapabilities(
403 m_streamTrack->component()->source()->id(), 437 m_streamTrack->component()->source()->id(),
404 convertToBaseCallback(WTF::bind(&ImageCapture::onCapabilitiesBootstrap, 438 convertToBaseCallback(WTF::bind(&ImageCapture::onCapabilitiesUpdate,
405 wrapPersistent(this)))); 439 wrapPersistent(this))));
406 } 440 }
407 441
408 void ImageCapture::onCapabilities( 442 void ImageCapture::onCapabilities(
409 ScriptPromiseResolver* resolver, 443 ScriptPromiseResolver* resolver,
410 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { 444 media::mojom::blink::PhotoCapabilitiesPtr capabilities) {
411 DVLOG(1) << __func__;
412 if (!m_serviceRequests.contains(resolver)) 445 if (!m_serviceRequests.contains(resolver))
413 return; 446 return;
414 if (capabilities.is_null()) { 447 if (capabilities.is_null()) {
415 resolver->reject(DOMException::create(UnknownError, "platform error")); 448 resolver->reject(DOMException::create(UnknownError, "platform error"));
416 } else { 449 } else {
450 // Update the local capabilities cache.
451 onCapabilitiesUpdate(capabilities.Clone());
452
417 PhotoCapabilities* caps = PhotoCapabilities::create(); 453 PhotoCapabilities* caps = PhotoCapabilities::create();
418 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when 454 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when
419 // mojo::StructTraits supports garbage-collected mappings, 455 // mojo::StructTraits supports garbage-collected mappings,
420 // https://crbug.com/700180. 456 // https://crbug.com/700180.
421 caps->setIso(MediaSettingsRange::create(std::move(capabilities->iso))); 457 caps->setIso(MediaSettingsRange::create(std::move(capabilities->iso)));
422 caps->setImageHeight( 458 caps->setImageHeight(
423 MediaSettingsRange::create(std::move(capabilities->height))); 459 MediaSettingsRange::create(std::move(capabilities->height)));
424 caps->setImageWidth( 460 caps->setImageWidth(
425 MediaSettingsRange::create(std::move(capabilities->width))); 461 MediaSettingsRange::create(std::move(capabilities->width)));
426 caps->setZoom(MediaSettingsRange::create(std::move(capabilities->zoom))); 462 caps->setZoom(MediaSettingsRange::create(std::move(capabilities->zoom)));
(...skipping 18 matching lines...) Expand all
445 caps->setRedEyeReduction(capabilities->red_eye_reduction); 481 caps->setRedEyeReduction(capabilities->red_eye_reduction);
446 resolver->resolve(caps); 482 resolver->resolve(caps);
447 } 483 }
448 m_serviceRequests.erase(resolver); 484 m_serviceRequests.erase(resolver);
449 } 485 }
450 486
451 void ImageCapture::onSetOptions(ScriptPromiseResolver* resolver, bool result) { 487 void ImageCapture::onSetOptions(ScriptPromiseResolver* resolver, bool result) {
452 if (!m_serviceRequests.contains(resolver)) 488 if (!m_serviceRequests.contains(resolver))
453 return; 489 return;
454 490
455 if (result) 491 if (!result) {
456 resolver->resolve();
457 else
458 resolver->reject(DOMException::create(UnknownError, "setOptions failed")); 492 resolver->reject(DOMException::create(UnknownError, "setOptions failed"));
459 m_serviceRequests.erase(resolver); 493 m_serviceRequests.erase(resolver);
494 return;
495 }
496
497 // Retrieve the current device status after setting the options.
498 m_service->GetCapabilities(
499 m_streamTrack->component()->source()->id(),
500 convertToBaseCallback(WTF::bind(&ImageCapture::onCapabilities,
501 wrapPersistent(this),
502 wrapPersistent(resolver))));
460 } 503 }
461 504
462 void ImageCapture::onTakePhoto(ScriptPromiseResolver* resolver, 505 void ImageCapture::onTakePhoto(ScriptPromiseResolver* resolver,
463 media::mojom::blink::BlobPtr blob) { 506 media::mojom::blink::BlobPtr blob) {
464 if (!m_serviceRequests.contains(resolver)) 507 if (!m_serviceRequests.contains(resolver))
465 return; 508 return;
466 509
467 // TODO(mcasas): Should be using a mojo::StructTraits. 510 // TODO(mcasas): Should be using a mojo::StructTraits.
468 if (blob->data.isEmpty()) 511 if (blob->data.isEmpty())
469 resolver->reject(DOMException::create(UnknownError, "platform error")); 512 resolver->reject(DOMException::create(UnknownError, "platform error"));
470 else 513 else
471 resolver->resolve( 514 resolver->resolve(
472 Blob::create(blob->data.data(), blob->data.size(), blob->mime_type)); 515 Blob::create(blob->data.data(), blob->data.size(), blob->mime_type));
473 m_serviceRequests.erase(resolver); 516 m_serviceRequests.erase(resolver);
474 } 517 }
475 518
476 void ImageCapture::onCapabilitiesBootstrap( 519 void ImageCapture::onCapabilitiesUpdate(
477 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { 520 media::mojom::blink::PhotoCapabilitiesPtr capabilities) {
478 DVLOG(1) << __func__;
479 if (capabilities.is_null()) 521 if (capabilities.is_null())
480 return; 522 return;
481 523
482 // TODO(mcasas): adapt the mojo interface to return a list of supported Modes 524 // TODO(mcasas): adapt the mojo interface to return a list of supported Modes
483 // when moving these out of PhotoCapabilities, https://crbug.com/700607. 525 // when moving these out of PhotoCapabilities, https://crbug.com/700607.
484 m_capabilities.setWhiteBalanceMode( 526 m_capabilities.setWhiteBalanceMode(
485 WTF::Vector<WTF::String>({toString(capabilities->white_balance_mode)})); 527 WTF::Vector<WTF::String>({toString(capabilities->white_balance_mode)}));
486 m_capabilities.setExposureMode( 528 m_capabilities.setExposureMode(
487 WTF::Vector<WTF::String>({toString(capabilities->exposure_mode)})); 529 WTF::Vector<WTF::String>({toString(capabilities->exposure_mode)}));
488 m_capabilities.setFocusMode( 530 m_capabilities.setFocusMode(
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 583
542 DEFINE_TRACE(ImageCapture) { 584 DEFINE_TRACE(ImageCapture) {
543 visitor->trace(m_streamTrack); 585 visitor->trace(m_streamTrack);
544 visitor->trace(m_capabilities); 586 visitor->trace(m_capabilities);
545 visitor->trace(m_serviceRequests); 587 visitor->trace(m_serviceRequests);
546 EventTargetWithInlineData::trace(visitor); 588 EventTargetWithInlineData::trace(visitor);
547 ContextLifecycleObserver::trace(visitor); 589 ContextLifecycleObserver::trace(visitor);
548 } 590 }
549 591
550 } // namespace blink 592 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698