Chromium Code Reviews| Index: content/browser/media/media_devices_util.cc |
| diff --git a/content/browser/media/media_devices_util.cc b/content/browser/media/media_devices_util.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b71c3c2459cb0b1f41caf4809261ebbcb7b6d11f |
| --- /dev/null |
| +++ b/content/browser/media/media_devices_util.cc |
| @@ -0,0 +1,109 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/media/media_devices_util.h" |
| + |
| +#include <utility> |
| +#include <vector> |
| + |
| +#include "base/bind.h" |
| +#include "base/command_line.h" |
| +#include "base/strings/string_split.h" |
| +#include "base/strings/string_tokenizer.h" |
| +#include "content/browser/frame_host/render_frame_host_delegate.h" |
| +#include "content/browser/frame_host/render_frame_host_impl.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "content/public/common/media_stream_request.h" |
| +#include "media/base/media_switches.h" |
| + |
| +namespace content { |
| + |
| +namespace { |
| + |
| +std::string GetDefaultMediaDeviceIDOnUIThread(MediaDeviceType device_type, |
| + int render_process_id, |
| + int render_frame_id) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + RenderFrameHostImpl* frame_host = |
| + RenderFrameHostImpl::FromID(render_process_id, render_frame_id); |
| + if (!frame_host) |
| + return std::string(); |
| + |
| + RenderFrameHostDelegate* delegate = frame_host->delegate(); |
| + if (!delegate) |
| + return std::string(); |
| + |
| + MediaStreamType media_stream_type; |
| + switch (device_type) { |
| + case MEDIA_DEVICE_TYPE_AUDIO_INPUT: |
| + media_stream_type = MEDIA_DEVICE_AUDIO_CAPTURE; |
| + break; |
| + case MEDIA_DEVICE_TYPE_VIDEO_INPUT: |
| + media_stream_type = MEDIA_DEVICE_VIDEO_CAPTURE; |
| + break; |
| + default: |
| + return std::string(); |
| + } |
| + |
| + return delegate->GetDefaultMediaDeviceID(media_stream_type); |
| +} |
| + |
| +std::string GetDefaultMediaDeviceIDFromCommandLine( |
| + MediaDeviceType device_type) { |
| + DCHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kUseFakeDeviceForMediaStream)); |
| + const std::string option = |
| + base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| + switches::kUseFakeDeviceForMediaStream); |
| + // Optional comma delimited parameters to the command line can specify values |
| + // for the default device IDs. |
| + // Examples: "video-input-default-id=mycam, audio-input-default-id=mymic" |
| + base::StringTokenizer option_tokenizer(option, ", "); |
| + option_tokenizer.set_quote_chars("\""); |
| + |
| + while (option_tokenizer.GetNext()) { |
| + std::vector<std::string> param = |
| + base::SplitString(option_tokenizer.token(), "=", base::TRIM_WHITESPACE, |
| + base::SPLIT_WANT_NONEMPTY); |
| + if (param.size() != 2u) { |
| + LOG(WARNING) << "Forget a value '" << option << "'? Use name=value for " |
| + << switches::kUseFakeDeviceForMediaStream << "."; |
|
dcheng
2017/01/20 07:56:50
DLOG. This doesn't seem like a switch real users a
Guido Urdaneta
2017/01/20 12:40:58
Done.
|
| + return std::string(); |
| + } |
| + |
| + if (device_type == MEDIA_DEVICE_TYPE_AUDIO_INPUT && |
| + base::EqualsCaseInsensitiveASCII(param.front(), |
|
dcheng
2017/01/20 07:56:50
Similarly, since this isn't really exposed to real
Guido Urdaneta
2017/01/20 12:40:58
Done.
|
| + "audio-input-default-id")) { |
| + return param.back(); |
| + } else if (device_type == MEDIA_DEVICE_TYPE_VIDEO_INPUT && |
| + base::EqualsCaseInsensitiveASCII(param.front(), |
| + "video-input-default-id")) { |
| + return param.back(); |
| + } |
| + } |
| + |
| + return std::string(); |
| +} |
| + |
| +} // namespace |
| + |
| +void GetDefaultMediaDeviceID( |
| + MediaDeviceType device_type, |
| + int render_process_id, |
| + int render_frame_id, |
| + const base::Callback<void(const std::string&)>& callback) { |
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kUseFakeDeviceForMediaStream)) { |
| + callback.Run(GetDefaultMediaDeviceIDFromCommandLine(device_type)); |
| + return; |
| + } |
| + |
| + BrowserThread::PostTaskAndReplyWithResult( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&GetDefaultMediaDeviceIDOnUIThread, device_type, |
| + render_process_id, render_frame_id), |
| + callback); |
| +} |
| + |
| +} // namespace content |