Chromium Code Reviews| 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); |