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

Unified Diff: content/renderer/media/user_media_client_impl.cc

Issue 2750163002: Use spec-compliant algorithm for video content-capture deviceId selection in getUserMedia. (Closed)
Patch Set: address review comments and rebase 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
« no previous file with comments | « content/renderer/media/user_media_client_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/media/user_media_client_impl.cc
diff --git a/content/renderer/media/user_media_client_impl.cc b/content/renderer/media/user_media_client_impl.cc
index 15fc8ce25cdc66582070e06e9ddb12b7127bd8ee..77cc03569017544b7ab83664b784049a8ce67183 100644
--- a/content/renderer/media/user_media_client_impl.cc
+++ b/content/renderer/media/user_media_client_impl.cc
@@ -26,6 +26,7 @@
#include "content/renderer/media/local_media_stream_audio_source.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_video_content.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_video_capturer_source.h"
@@ -129,6 +130,8 @@ bool IsDeviceSource(const std::string& source) {
return source.empty();
}
+// TODO(guidou): Remove once audio constraints are processed with spec-compliant
+// algorithm. See http://crbug.com/657733.
void CopyConstraintsToTrackControls(
const blink::WebMediaConstraints& constraints,
TrackControls* track_controls,
@@ -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(
const blink::WebMediaConstraints& audio_constraints,
StreamControls* controls) {
@@ -260,6 +271,7 @@ void UserMediaClientImpl::requestUserMedia(
UpdateWebRTCMethodCount(WEBKIT_GET_USER_MEDIA);
DCHECK(CalledOnValidThread());
DCHECK(!user_media_request.isNull());
+ DCHECK(user_media_request.audio() || user_media_request.video());
// ownerDocument may be null if we are in a test.
// In that case, it's OK to not check frame().
DCHECK(user_media_request.ownerDocument().isNull() ||
@@ -338,21 +350,29 @@ void UserMediaClientImpl::SetupVideoInput(
const blink::WebUserMediaRequest& user_media_request,
std::unique_ptr<StreamControls> controls,
const RequestSettings& request_settings) {
- if (user_media_request.video()) {
- bool ignore;
- CopyConstraintsToTrackControls(user_media_request.videoConstraints(),
- &controls->video, &ignore);
- if (IsDeviceSource(controls->video.stream_source)) {
- GetMediaDevicesDispatcher()->GetVideoInputCapabilities(
- request_settings.security_origin,
- base::Bind(&UserMediaClientImpl::SelectVideoDeviceSourceSettings,
- weak_factory_.GetWeakPtr(), request_id, user_media_request,
- base::Passed(&controls), request_settings));
- return;
- }
+ if (!user_media_request.video()) {
+ FinalizeRequestUserMedia(request_id, user_media_request,
+ std::move(controls), request_settings);
+ return;
+ }
+ InitializeTrackControls(user_media_request.videoConstraints(),
+ &controls->video);
+ if (IsDeviceSource(controls->video.stream_source)) {
+ GetMediaDevicesDispatcher()->GetVideoInputCapabilities(
+ request_settings.security_origin,
+ 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(
@@ -417,6 +437,29 @@ void UserMediaClientImpl::FinalizeSelectVideoDeviceSourceSettings(
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(
int request_id,
const blink::WebUserMediaRequest& user_media_request,
« no previous file with comments | « content/renderer/media/user_media_client_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698