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

Unified Diff: third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp

Issue 2747573002: Image Capture: MediaStreamTrack::getCapabilities() (Closed)
Patch Set: haraken@ and 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp
diff --git a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp
index c33cefdbf655aabe6631953d8a34719e55875246..06046a5f33713b232288584d679b8df410e03548 100644
--- a/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp
+++ b/third_party/WebKit/Source/modules/imagecapture/ImageCapture.cpp
@@ -15,6 +15,8 @@
#include "modules/imagecapture/PhotoCapabilities.h"
#include "modules/imagecapture/PhotoSettings.h"
#include "modules/mediastream/MediaStreamTrack.h"
+#include "modules/mediastream/MediaTrackCapabilities.h"
+#include "platform/WaitableEvent.h"
#include "platform/mojo/MojoHelper.h"
#include "public/platform/InterfaceProvider.h"
#include "public/platform/Platform.h"
@@ -56,6 +58,22 @@ media::mojom::blink::FillLightMode parseFillLightMode(const String& blinkMode) {
return media::mojom::blink::FillLightMode::NONE;
}
+WebString toString(media::mojom::blink::MeteringMode value) {
+ switch (value) {
+ case media::mojom::blink::MeteringMode::NONE:
+ return WebString::fromUTF8("none");
+ case media::mojom::blink::MeteringMode::MANUAL:
+ return WebString::fromUTF8("manual");
+ case media::mojom::blink::MeteringMode::SINGLE_SHOT:
+ return WebString::fromUTF8("single-shot");
+ case media::mojom::blink::MeteringMode::CONTINUOUS:
+ return WebString::fromUTF8("continuous");
+ default:
+ NOTREACHED() << "Unknown MeteringMode";
+ }
+ return WebString();
+}
+
} // anonymous namespace
ImageCapture* ImageCapture::create(ExecutionContext* context,
@@ -267,6 +285,10 @@ ScriptPromise ImageCapture::grabFrame(ScriptState* scriptState,
return promise;
}
+MediaTrackCapabilities& ImageCapture::getMediaTrackCapabilities() {
+ return m_capabilities;
+}
+
ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track)
: ContextLifecycleObserver(context), m_streamTrack(track) {
DCHECK(m_streamTrack);
@@ -277,6 +299,13 @@ ImageCapture::ImageCapture(ExecutionContext* context, MediaStreamTrack* track)
m_service.set_connection_error_handler(convertToBaseCallback(WTF::bind(
&ImageCapture::onServiceConnectionError, wrapWeakPersistent(this))));
+
+ // Launch a retrieval of the current capabilities, which arrive asynchronously
+ // to avoid blocking the main UI thread.
+ m_service->GetCapabilities(
+ m_streamTrack->component()->source()->id(),
+ convertToBaseCallback(WTF::bind(&ImageCapture::onCapabilitiesBootstrap,
+ wrapPersistent(this))));
}
void ImageCapture::onCapabilities(
@@ -288,57 +317,35 @@ void ImageCapture::onCapabilities(
if (capabilities.is_null()) {
resolver->reject(DOMException::create(UnknownError, "platform error"));
} else {
- // TODO(mcasas): Should be using a mojo::StructTraits.
- MediaSettingsRange* iso = MediaSettingsRange::create(
- capabilities->iso->max, capabilities->iso->min,
- capabilities->iso->current, capabilities->iso->step);
- MediaSettingsRange* height = MediaSettingsRange::create(
- capabilities->height->max, capabilities->height->min,
- capabilities->height->current, capabilities->height->step);
- MediaSettingsRange* width = MediaSettingsRange::create(
- capabilities->width->max, capabilities->width->min,
- capabilities->width->current, capabilities->width->step);
- MediaSettingsRange* zoom = MediaSettingsRange::create(
- capabilities->zoom->max, capabilities->zoom->min,
- capabilities->zoom->current, capabilities->zoom->step);
- MediaSettingsRange* exposureCompensation =
- MediaSettingsRange::create(capabilities->exposure_compensation->max,
- capabilities->exposure_compensation->min,
- capabilities->exposure_compensation->current,
- capabilities->exposure_compensation->step);
- MediaSettingsRange* colorTemperature =
- MediaSettingsRange::create(capabilities->color_temperature->max,
- capabilities->color_temperature->min,
- capabilities->color_temperature->current,
- capabilities->color_temperature->step);
- MediaSettingsRange* brightness = MediaSettingsRange::create(
- capabilities->brightness->max, capabilities->brightness->min,
- capabilities->brightness->current, capabilities->brightness->step);
- MediaSettingsRange* contrast = MediaSettingsRange::create(
- capabilities->contrast->max, capabilities->contrast->min,
- capabilities->contrast->current, capabilities->contrast->step);
- MediaSettingsRange* saturation = MediaSettingsRange::create(
- capabilities->saturation->max, capabilities->saturation->min,
- capabilities->saturation->current, capabilities->saturation->step);
- MediaSettingsRange* sharpness = MediaSettingsRange::create(
- capabilities->sharpness->max, capabilities->sharpness->min,
- capabilities->sharpness->current, capabilities->sharpness->step);
PhotoCapabilities* caps = PhotoCapabilities::create();
- caps->setIso(iso);
- caps->setImageHeight(height);
- caps->setImageWidth(width);
- caps->setZoom(zoom);
+ // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when
+ // mojo::StructTraits supports garbage-collected mappings,
+ // https://crbug.com/700180.
+ caps->setIso(MediaSettingsRange::create(std::move(capabilities->iso)));
+ caps->setImageHeight(
+ MediaSettingsRange::create(std::move(capabilities->height)));
+ caps->setImageWidth(
+ MediaSettingsRange::create(std::move(capabilities->width)));
+ caps->setZoom(MediaSettingsRange::create(std::move(capabilities->zoom)));
+ caps->setExposureCompensation(MediaSettingsRange::create(
+ std::move(capabilities->exposure_compensation)));
+ caps->setColorTemperature(
+ MediaSettingsRange::create(std::move(capabilities->color_temperature)));
+ caps->setBrightness(
+ MediaSettingsRange::create(std::move(capabilities->brightness)));
+ caps->setContrast(
+ MediaSettingsRange::create(std::move(capabilities->contrast)));
+ caps->setSaturation(
+ MediaSettingsRange::create(std::move(capabilities->saturation)));
+ caps->setSharpness(
+ MediaSettingsRange::create(std::move(capabilities->sharpness)));
+
caps->setFocusMode(capabilities->focus_mode);
caps->setExposureMode(capabilities->exposure_mode);
- caps->setExposureCompensation(exposureCompensation);
caps->setWhiteBalanceMode(capabilities->white_balance_mode);
caps->setFillLightMode(capabilities->fill_light_mode);
+
caps->setRedEyeReduction(capabilities->red_eye_reduction);
- caps->setColorTemperature(colorTemperature);
- caps->setBrightness(brightness);
- caps->setContrast(contrast);
- caps->setSaturation(saturation);
- caps->setSharpness(sharpness);
resolver->resolve(caps);
}
m_serviceRequests.erase(resolver);
@@ -369,6 +376,65 @@ void ImageCapture::onTakePhoto(ScriptPromiseResolver* resolver,
m_serviceRequests.erase(resolver);
}
+void ImageCapture::onCapabilitiesBootstrap(
+ media::mojom::blink::PhotoCapabilitiesPtr capabilities) {
+ DVLOG(1) << __func__;
+ if (capabilities.is_null())
+ return;
+
+ // TODO(mcasas): adapt the mojo interface to return a list of supported Modes
+ // when moving these out of PhotoCapabilities, https://crbug.com/700607.
+ m_capabilities.setWhiteBalanceMode(
+ WTF::Vector<WTF::String>({toString(capabilities->white_balance_mode)}));
+ m_capabilities.setExposureMode(
+ WTF::Vector<WTF::String>({toString(capabilities->exposure_mode)}));
+ m_capabilities.setFocusMode(
+ WTF::Vector<WTF::String>({toString(capabilities->focus_mode)}));
+
+ // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when
+ // mojo::StructTraits supports garbage-collected mappings,
+ // https://crbug.com/700180.
+ if (capabilities->exposure_compensation->max !=
+ capabilities->exposure_compensation->min) {
+ m_capabilities.setExposureCompensation(MediaSettingsRange::create(
+ std::move(capabilities->exposure_compensation)));
+ }
+ if (capabilities->color_temperature->max !=
+ capabilities->color_temperature->min) {
+ m_capabilities.setColorTemperature(
+ MediaSettingsRange::create(std::move(capabilities->color_temperature)));
+ }
+ if (capabilities->iso->max != capabilities->iso->min) {
+ m_capabilities.setIso(
+ MediaSettingsRange::create(std::move(capabilities->iso)));
+ }
+
+ if (capabilities->brightness->max != capabilities->brightness->min) {
+ m_capabilities.setBrightness(
+ MediaSettingsRange::create(std::move(capabilities->brightness)));
+ }
+ if (capabilities->contrast->max != capabilities->contrast->min) {
+ m_capabilities.setContrast(
+ MediaSettingsRange::create(std::move(capabilities->contrast)));
+ }
+ if (capabilities->saturation->max != capabilities->saturation->min) {
+ m_capabilities.setSaturation(
+ MediaSettingsRange::create(std::move(capabilities->saturation)));
+ }
+ if (capabilities->sharpness->max != capabilities->sharpness->min) {
+ m_capabilities.setSharpness(
+ MediaSettingsRange::create(std::move(capabilities->sharpness)));
+ }
+
+ if (capabilities->zoom->max != capabilities->zoom->min) {
+ m_capabilities.setZoom(
+ MediaSettingsRange::create(std::move(capabilities->zoom)));
+ }
+
+ // TODO(mcasas): do |torch| when the mojom interface is updated,
+ // https://crbug.com/700607.
+}
+
void ImageCapture::onServiceConnectionError() {
m_service.reset();
for (ScriptPromiseResolver* resolver : m_serviceRequests)
@@ -378,6 +444,7 @@ void ImageCapture::onServiceConnectionError() {
DEFINE_TRACE(ImageCapture) {
visitor->trace(m_streamTrack);
+ visitor->trace(m_capabilities);
visitor->trace(m_serviceRequests);
EventTargetWithInlineData::trace(visitor);
ContextLifecycleObserver::trace(visitor);

Powered by Google App Engine
This is Rietveld 408576698