Commit 8fca3127 authored by guidou's avatar guidou Committed by Commit bot

Use spec-compliant algorithm for video content-capture deviceId selection in getUserMedia.

Other settings are chosen based on the old algorithm.

BUG=657733

Review-Url: https://codereview.chromium.org/2750163002
Cr-Commit-Position: refs/heads/master@{#457844}
parent 81a2d796
...@@ -251,6 +251,10 @@ VideoContentCaptureSourceSelectionResult UnsatisfiedConstraintsResult( ...@@ -251,6 +251,10 @@ VideoContentCaptureSourceSelectionResult UnsatisfiedConstraintsResult(
} // namespace } // namespace
VideoContentCaptureSourceSelectionResult::
VideoContentCaptureSourceSelectionResult()
: VideoContentCaptureSourceSelectionResult("") {}
VideoContentCaptureSourceSelectionResult:: VideoContentCaptureSourceSelectionResult::
VideoContentCaptureSourceSelectionResult(const char* failed_constraint_name) VideoContentCaptureSourceSelectionResult(const char* failed_constraint_name)
: failed_constraint_name_(failed_constraint_name) {} : failed_constraint_name_(failed_constraint_name) {}
......
...@@ -20,14 +20,16 @@ namespace content { ...@@ -20,14 +20,16 @@ namespace content {
class CONTENT_EXPORT VideoContentCaptureSourceSelectionResult { class CONTENT_EXPORT VideoContentCaptureSourceSelectionResult {
public: public:
// Creates a result without value and with an empty failed constraint name.
VideoContentCaptureSourceSelectionResult();
// Creates a result without value and with the given |failed_constraint_name|. // Creates a result without value and with the given |failed_constraint_name|.
// Does not take ownership of |failed_constraint_name|, so it must be null or // Does not take ownership of |failed_constraint_name|, so it must be null or
// point to a string that remains accessible. // point to a string that remains accessible.
explicit VideoContentCaptureSourceSelectionResult( explicit VideoContentCaptureSourceSelectionResult(
const char* failed_constraint_name); const char* failed_constraint_name);
// Creates a result with the given values. |device_id| is moved to an internal // Creates a result with the given values.
// field.
VideoContentCaptureSourceSelectionResult( VideoContentCaptureSourceSelectionResult(
std::string device_id, std::string device_id,
const rtc::Optional<bool>& noise_reduction, const rtc::Optional<bool>& noise_reduction,
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "content/renderer/media/local_media_stream_audio_source.h" #include "content/renderer/media/local_media_stream_audio_source.h"
#include "content/renderer/media/media_stream.h" #include "content/renderer/media/media_stream.h"
#include "content/renderer/media/media_stream_constraints_util.h" #include "content/renderer/media/media_stream_constraints_util.h"
#include "content/renderer/media/media_stream_constraints_util_video_content.h"
#include "content/renderer/media/media_stream_constraints_util_video_device.h" #include "content/renderer/media/media_stream_constraints_util_video_device.h"
#include "content/renderer/media/media_stream_dispatcher.h" #include "content/renderer/media/media_stream_dispatcher.h"
#include "content/renderer/media/media_stream_video_capturer_source.h" #include "content/renderer/media/media_stream_video_capturer_source.h"
...@@ -129,6 +130,8 @@ bool IsDeviceSource(const std::string& source) { ...@@ -129,6 +130,8 @@ bool IsDeviceSource(const std::string& source) {
return source.empty(); return source.empty();
} }
// TODO(guidou): Remove once audio constraints are processed with spec-compliant
// algorithm. See http://crbug.com/657733.
void CopyConstraintsToTrackControls( void CopyConstraintsToTrackControls(
const blink::WebMediaConstraints& constraints, const blink::WebMediaConstraints& constraints,
TrackControls* track_controls, TrackControls* track_controls,
...@@ -153,6 +156,14 @@ void CopyConstraintsToTrackControls( ...@@ -153,6 +156,14 @@ void CopyConstraintsToTrackControls(
} }
} }
void InitializeTrackControls(const blink::WebMediaConstraints& constraints,
TrackControls* track_controls) {
DCHECK(!constraints.isNull());
track_controls->requested = true;
CopyFirstString(constraints.basic().mediaStreamSource,
&track_controls->stream_source);
}
void CopyHotwordAndLocalEchoToStreamControls( void CopyHotwordAndLocalEchoToStreamControls(
const blink::WebMediaConstraints& audio_constraints, const blink::WebMediaConstraints& audio_constraints,
StreamControls* controls) { StreamControls* controls) {
...@@ -260,6 +271,7 @@ void UserMediaClientImpl::requestUserMedia( ...@@ -260,6 +271,7 @@ void UserMediaClientImpl::requestUserMedia(
UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA); UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA);
DCHECK(CalledOnValidThread()); DCHECK(CalledOnValidThread());
DCHECK(!user_media_request.isNull()); DCHECK(!user_media_request.isNull());
DCHECK(user_media_request.audio() || user_media_request.video());
// ownerDocument may be null if we are in a test. // ownerDocument may be null if we are in a test.
// In that case, it's OK to not check frame(). // In that case, it's OK to not check frame().
DCHECK(user_media_request.ownerDocument().isNull() || DCHECK(user_media_request.ownerDocument().isNull() ||
...@@ -338,21 +350,29 @@ void UserMediaClientImpl::SetupVideoInput( ...@@ -338,21 +350,29 @@ void UserMediaClientImpl::SetupVideoInput(
const blink::WebUserMediaRequest& user_media_request, const blink::WebUserMediaRequest& user_media_request,
std::unique_ptr<StreamControls> controls, std::unique_ptr<StreamControls> controls,
const RequestSettings& request_settings) { const RequestSettings& request_settings) {
if (user_media_request.video()) { if (!user_media_request.video()) {
bool ignore; FinalizeRequestUserMedia(request_id, user_media_request,
CopyConstraintsToTrackControls(user_media_request.videoConstraints(), std::move(controls), request_settings);
&controls->video, &ignore); return;
if (IsDeviceSource(controls->video.stream_source)) { }
GetMediaDevicesDispatcher()->GetVideoInputCapabilities( InitializeTrackControls(user_media_request.videoConstraints(),
request_settings.security_origin, &controls->video);
base::Bind(&UserMediaClientImpl::SelectVideoDeviceSourceSettings, if (IsDeviceSource(controls->video.stream_source)) {
weak_factory_.GetWeakPtr(), request_id, user_media_request, GetMediaDevicesDispatcher()->GetVideoInputCapabilities(
base::Passed(&controls), request_settings)); request_settings.security_origin,
return; base::Bind(&UserMediaClientImpl::SelectVideoDeviceSourceSettings,
} weak_factory_.GetWeakPtr(), request_id, user_media_request,
base::Passed(&controls), request_settings));
} else {
base::PostTaskAndReplyWithResult(
worker_task_runner_.get(), FROM_HERE,
base::Bind(&SelectVideoContentCaptureSourceSettings,
user_media_request.videoConstraints()),
base::Bind(
&UserMediaClientImpl::FinalizeSelectVideoContentSourceSettings,
weak_factory_.GetWeakPtr(), request_id, user_media_request,
base::Passed(&controls), request_settings));
} }
FinalizeRequestUserMedia(request_id, user_media_request, std::move(controls),
request_settings);
} }
void UserMediaClientImpl::SelectVideoDeviceSourceSettings( void UserMediaClientImpl::SelectVideoDeviceSourceSettings(
...@@ -409,6 +429,29 @@ void UserMediaClientImpl::FinalizeSelectVideoDeviceSourceSettings( ...@@ -409,6 +429,29 @@ void UserMediaClientImpl::FinalizeSelectVideoDeviceSourceSettings(
request_settings); request_settings);
} }
void UserMediaClientImpl::FinalizeSelectVideoContentSourceSettings(
int request_id,
const blink::WebUserMediaRequest& user_media_request,
std::unique_ptr<StreamControls> controls,
const RequestSettings& request_settings,
const VideoContentCaptureSourceSelectionResult& selection_result) {
DCHECK(CalledOnValidThread());
if (!selection_result.HasValue()) {
blink::WebString failed_constraint_name =
blink::WebString::fromASCII(selection_result.failed_constraint_name());
DCHECK(!failed_constraint_name.isEmpty());
blink::WebString device_id_constraint_name = blink::WebString::fromASCII(
user_media_request.videoConstraints().basic().deviceId.name());
GetUserMediaRequestFailed(user_media_request,
MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED,
failed_constraint_name);
return;
}
controls->video.device_id = selection_result.device_id();
FinalizeRequestUserMedia(request_id, user_media_request, std::move(controls),
request_settings);
}
void UserMediaClientImpl::FinalizeRequestUserMedia( void UserMediaClientImpl::FinalizeRequestUserMedia(
int request_id, int request_id,
const blink::WebUserMediaRequest& user_media_request, const blink::WebUserMediaRequest& user_media_request,
......
...@@ -39,6 +39,7 @@ class PeerConnectionDependencyFactory; ...@@ -39,6 +39,7 @@ class PeerConnectionDependencyFactory;
class MediaStreamAudioSource; class MediaStreamAudioSource;
class MediaStreamDispatcher; class MediaStreamDispatcher;
class MediaStreamVideoSource; class MediaStreamVideoSource;
class VideoContentCaptureSourceSelectionResult;
class VideoDeviceCaptureSourceSelectionResult; class VideoDeviceCaptureSourceSelectionResult;
// UserMediaClientImpl is a delegate for the Media Stream GetUserMedia API. // UserMediaClientImpl is a delegate for the Media Stream GetUserMedia API.
...@@ -317,6 +318,13 @@ class CONTENT_EXPORT UserMediaClientImpl ...@@ -317,6 +318,13 @@ class CONTENT_EXPORT UserMediaClientImpl
const RequestSettings& request_settings, const RequestSettings& request_settings,
const VideoDeviceCaptureSourceSelectionResult& selection_result); const VideoDeviceCaptureSourceSelectionResult& selection_result);
void FinalizeSelectVideoContentSourceSettings(
int request_id,
const blink::WebUserMediaRequest& user_media_request,
std::unique_ptr<StreamControls> controls,
const RequestSettings& request_settings,
const VideoContentCaptureSourceSelectionResult& selection_result);
void FinalizeRequestUserMedia( void FinalizeRequestUserMedia(
int request_id, int request_id,
const blink::WebUserMediaRequest& user_media_request, const blink::WebUserMediaRequest& user_media_request,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment