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/MediaTrackConstraints.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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 m_frameGrabber->grabFrame( | 240 m_frameGrabber->grabFrame( |
240 &track, new CallbackPromiseAdapter<ImageBitmap, void>(resolver)); | 241 &track, new CallbackPromiseAdapter<ImageBitmap, void>(resolver)); |
241 | 242 |
242 return promise; | 243 return promise; |
243 } | 244 } |
244 | 245 |
245 MediaTrackCapabilities& ImageCapture::getMediaTrackCapabilities() { | 246 MediaTrackCapabilities& ImageCapture::getMediaTrackCapabilities() { |
246 return m_capabilities; | 247 return m_capabilities; |
247 } | 248 } |
248 | 249 |
249 // TODO(mcasas): make the implementation fully Spec compliant, see inside the | 250 // TODO(mcasas): make the implementation fully Spec compliant, see the TODOs |
250 // method, https://crbug.com/700607. | 251 // inside the method, https://crbug.com/708723. |
251 void ImageCapture::setMediaTrackConstraints( | 252 void ImageCapture::setMediaTrackConstraints( |
252 ScriptPromiseResolver* resolver, | 253 ScriptPromiseResolver* resolver, |
253 const MediaTrackConstraintSet& constraints) { | 254 const HeapVector<MediaTrackConstraintSet>& constraintsVector) { |
254 if (!m_service) { | 255 if (!m_service) { |
255 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); | 256 resolver->reject(DOMException::create(NotFoundError, kNoServiceError)); |
256 return; | 257 return; |
257 } | 258 } |
258 m_serviceRequests.insert(resolver); | 259 m_serviceRequests.insert(resolver); |
259 | 260 |
| 261 // TODO(mcasas): add support more than one single advanced constraint. |
| 262 const auto constraints = constraintsVector[0]; |
| 263 |
260 auto settings = media::mojom::blink::PhotoSettings::New(); | 264 auto settings = media::mojom::blink::PhotoSettings::New(); |
261 | 265 |
262 // TODO(mcasas): support other Mode types beyond simple string i.e. the | 266 // TODO(mcasas): support other Mode types beyond simple string i.e. the |
263 // equivalents of "sequence<DOMString>"" or "ConstrainDOMStringParameters". | 267 // equivalents of "sequence<DOMString>"" or "ConstrainDOMStringParameters". |
264 settings->has_white_balance_mode = constraints.hasWhiteBalanceMode() && | 268 settings->has_white_balance_mode = constraints.hasWhiteBalanceMode() && |
265 constraints.whiteBalanceMode().isString(); | 269 constraints.whiteBalanceMode().isString(); |
266 if (settings->has_white_balance_mode) { | 270 if (settings->has_white_balance_mode) { |
267 m_currentConstraints.setWhiteBalanceMode(constraints.whiteBalanceMode()); | 271 m_currentConstraints.setWhiteBalanceMode(constraints.whiteBalanceMode()); |
268 settings->white_balance_mode = | 272 settings->white_balance_mode = |
269 parseMeteringMode(constraints.whiteBalanceMode().getAsString()); | 273 parseMeteringMode(constraints.whiteBalanceMode().getAsString()); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 std::move(settings), | 366 std::move(settings), |
363 convertToBaseCallback(WTF::bind( | 367 convertToBaseCallback(WTF::bind( |
364 &ImageCapture::onSetOptions, wrapPersistent(this), | 368 &ImageCapture::onSetOptions, wrapPersistent(this), |
365 wrapPersistent(resolver)))); | 369 wrapPersistent(resolver)))); |
366 } | 370 } |
367 | 371 |
368 const MediaTrackConstraintSet& ImageCapture::getMediaTrackConstraints() const { | 372 const MediaTrackConstraintSet& ImageCapture::getMediaTrackConstraints() const { |
369 return m_currentConstraints; | 373 return m_currentConstraints; |
370 } | 374 } |
371 | 375 |
| 376 void ImageCapture::clearMediaTrackConstraints(ScriptPromiseResolver* resolver) { |
| 377 m_currentConstraints = MediaTrackConstraintSet(); |
| 378 resolver->resolve(); |
| 379 |
| 380 // TODO(mcasas): Clear also any PhotoSettings that the device might have got |
| 381 // configured, for that we need to know a "default" state of the device; take |
| 382 // a snapshot upon first opening. https://crbug.com/700607. |
| 383 } |
| 384 |
372 void ImageCapture::getMediaTrackSettings(MediaTrackSettings& settings) const { | 385 void ImageCapture::getMediaTrackSettings(MediaTrackSettings& settings) const { |
373 // Merge any present |m_settings| members into |settings|. | 386 // Merge any present |m_settings| members into |settings|. |
374 | 387 |
375 if (m_settings.hasWhiteBalanceMode()) | 388 if (m_settings.hasWhiteBalanceMode()) |
376 settings.setWhiteBalanceMode(m_settings.whiteBalanceMode()); | 389 settings.setWhiteBalanceMode(m_settings.whiteBalanceMode()); |
377 if (m_settings.hasExposureMode()) | 390 if (m_settings.hasExposureMode()) |
378 settings.setExposureMode(m_settings.exposureMode()); | 391 settings.setExposureMode(m_settings.exposureMode()); |
379 if (m_settings.hasFocusMode()) | 392 if (m_settings.hasFocusMode()) |
380 settings.setFocusMode(m_settings.focusMode()); | 393 settings.setFocusMode(m_settings.focusMode()); |
381 | 394 |
(...skipping 15 matching lines...) Expand all Loading... |
397 settings.setSaturation(m_settings.saturation()); | 410 settings.setSaturation(m_settings.saturation()); |
398 if (m_settings.hasSharpness()) | 411 if (m_settings.hasSharpness()) |
399 settings.setSharpness(m_settings.sharpness()); | 412 settings.setSharpness(m_settings.sharpness()); |
400 | 413 |
401 if (m_settings.hasZoom()) | 414 if (m_settings.hasZoom()) |
402 settings.setZoom(m_settings.zoom()); | 415 settings.setZoom(m_settings.zoom()); |
403 if (m_settings.hasTorch()) | 416 if (m_settings.hasTorch()) |
404 settings.setTorch(m_settings.torch()); | 417 settings.setTorch(m_settings.torch()); |
405 } | 418 } |
406 | 419 |
| 420 bool ImageCapture::hasNonImageCaptureConstraints( |
| 421 const MediaTrackConstraints& constraints) const { |
| 422 if (!constraints.hasAdvanced()) |
| 423 return false; |
| 424 |
| 425 const auto& advancedConstraints = constraints.advanced(); |
| 426 for (const auto& constraint : advancedConstraints) { |
| 427 if (constraint.hasWidth() || constraint.hasHeight() || |
| 428 constraint.hasAspectRatio() || constraint.hasFrameRate() || |
| 429 constraint.hasFacingMode() || constraint.hasVolume() || |
| 430 constraint.hasSampleRate() || constraint.hasSampleSize() || |
| 431 constraint.hasEchoCancellation() || constraint.hasLatency() || |
| 432 constraint.hasChannelCount() || constraint.hasDeviceId() || |
| 433 constraint.hasGroupId() || constraint.hasVideoKind() || |
| 434 constraint.hasDepthNear() || constraint.hasDepthFar() || |
| 435 constraint.hasFocalLengthX() || constraint.hasFocalLengthY() || |
| 436 constraint.hasMandatory() || constraint.hasOptional()) { |
| 437 return true; |
| 438 } |
| 439 } |
| 440 return false; |
| 441 } |
| 442 |
407 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track) | 443 ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track) |
408 : ContextLifecycleObserver(context), m_streamTrack(track) { | 444 : ContextLifecycleObserver(context), m_streamTrack(track) { |
409 DCHECK(m_streamTrack); | 445 DCHECK(m_streamTrack); |
410 DCHECK(!m_service.is_bound()); | 446 DCHECK(!m_service.is_bound()); |
411 | 447 |
412 Platform::current()->interfaceProvider()->getInterface( | 448 Platform::current()->interfaceProvider()->getInterface( |
413 mojo::MakeRequest(&m_service)); | 449 mojo::MakeRequest(&m_service)); |
414 | 450 |
415 m_service.set_connection_error_handler(convertToBaseCallback(WTF::bind( | 451 m_service.set_connection_error_handler(convertToBaseCallback(WTF::bind( |
416 &ImageCapture::onServiceConnectionError, wrapWeakPersistent(this)))); | 452 &ImageCapture::onServiceConnectionError, wrapWeakPersistent(this)))); |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 visitor->trace(m_streamTrack); | 617 visitor->trace(m_streamTrack); |
582 visitor->trace(m_capabilities); | 618 visitor->trace(m_capabilities); |
583 visitor->trace(m_settings); | 619 visitor->trace(m_settings); |
584 visitor->trace(m_currentConstraints); | 620 visitor->trace(m_currentConstraints); |
585 visitor->trace(m_serviceRequests); | 621 visitor->trace(m_serviceRequests); |
586 EventTargetWithInlineData::trace(visitor); | 622 EventTargetWithInlineData::trace(visitor); |
587 ContextLifecycleObserver::trace(visitor); | 623 ContextLifecycleObserver::trace(visitor); |
588 } | 624 } |
589 | 625 |
590 } // namespace blink | 626 } // namespace blink |
OLD | NEW |