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

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

Issue 2747573002: Image Capture: MediaStreamTrack::getCapabilities() (Closed)
Patch Set: 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..41528277a88facbce8f69694115fcc037e442cb6 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;
}
+std::string toString(media::mojom::blink::MeteringMode value) {
Reilly Grant (use Gerrit) 2017/03/14 21:38:57 Return String so you don't need to do a conversion
mcasas 2017/03/14 22:28:01 haraken@ recommended that too, done.
+ switch (value) {
+ case media::mojom::blink::MeteringMode::NONE:
+ return "none";
+ case media::mojom::blink::MeteringMode::MANUAL:
+ return "manual";
+ case media::mojom::blink::MeteringMode::SINGLE_SHOT:
+ return "single-shot";
+ case media::mojom::blink::MeteringMode::CONTINUOUS:
+ return "continuous";
+ default:
+ NOTREACHED() << "Unknown MeteringMode";
+ }
+ return "";
+}
+
} // 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,34 @@ 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);
+ // TODO(mcasas): Should be using a mojo::StructTraits, but they have issues
+ // handling garbage-collected mappings.
PhotoCapabilities* caps = PhotoCapabilities::create();
- caps->setIso(iso);
- caps->setImageHeight(height);
- caps->setImageWidth(width);
- caps->setZoom(zoom);
+ caps->setIso(MediaSettingsRange::create(std::move(capabilities->iso)));
haraken 2017/03/14 19:56:37 Why do we need to create a new MediaSettingsRange
mcasas 2017/03/14 22:28:01 Indeed; but StructTraits<> can't map a MediaSettin
haraken 2017/03/15 08:43:08 Maybe would it be an option to define a struct and
+ 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 +375,62 @@ 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>(
haraken 2017/03/14 19:56:37 Why does the mode need to be a vector? It has only
mcasas 2017/03/14 22:28:01 MediaTrackCapabilities.idl specifies these members
+ {WebString::fromASCII(toString(capabilities->white_balance_mode))}));
haraken 2017/03/14 19:56:37 Can we simply return WebString from toString()?
mcasas 2017/03/14 22:28:01 Done.
+ m_capabilities.setExposureMode(WTF::Vector<WTF::String>(
+ {WebString::fromASCII(toString(capabilities->exposure_mode))}));
+ m_capabilities.setFocusMode(WTF::Vector<WTF::String>(
+ {WebString::fromASCII(toString(capabilities->focus_mode))}));
+
+ 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 +440,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