OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license | |
5 * that can be found in the LICENSE file in the root of the source | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #ifndef WEBRTC_MEDIA_DEVICES_FAKEDEVICEMANAGER_H_ | |
12 #define WEBRTC_MEDIA_DEVICES_FAKEDEVICEMANAGER_H_ | |
13 | |
14 #include <string> | |
15 #include <vector> | |
16 | |
17 #include "webrtc/base/scoped_ptr.h" | |
18 #include "webrtc/base/window.h" | |
19 #include "webrtc/base/windowpicker.h" | |
20 #include "webrtc/media/base/fakevideocapturer.h" | |
21 #include "webrtc/media/base/mediacommon.h" | |
22 #include "webrtc/media/devices/devicemanager.h" | |
23 | |
24 namespace cricket { | |
25 | |
26 class FakeDeviceManager : public DeviceManagerInterface { | |
27 public: | |
28 FakeDeviceManager() {} | |
29 virtual bool Init() { | |
30 return true; | |
31 } | |
32 virtual void Terminate() { | |
33 } | |
34 virtual int GetCapabilities() { | |
35 std::vector<Device> devices; | |
36 int caps = VIDEO_RECV; | |
37 if (!input_devices_.empty()) { | |
38 caps |= AUDIO_SEND; | |
39 } | |
40 if (!output_devices_.empty()) { | |
41 caps |= AUDIO_RECV; | |
42 } | |
43 if (!vidcap_devices_.empty()) { | |
44 caps |= VIDEO_SEND; | |
45 } | |
46 return caps; | |
47 } | |
48 virtual bool GetAudioInputDevices(std::vector<Device>* devs) { | |
49 *devs = input_devices_; | |
50 return true; | |
51 } | |
52 virtual bool GetAudioOutputDevices(std::vector<Device>* devs) { | |
53 *devs = output_devices_; | |
54 return true; | |
55 } | |
56 virtual bool GetAudioInputDevice(const std::string& name, Device* out) { | |
57 return GetAudioDevice(true, name, out); | |
58 } | |
59 virtual bool GetAudioOutputDevice(const std::string& name, Device* out) { | |
60 return GetAudioDevice(false, name, out); | |
61 } | |
62 virtual bool GetVideoCaptureDevices(std::vector<Device>* devs) { | |
63 *devs = vidcap_devices_; | |
64 return true; | |
65 } | |
66 virtual void SetVideoDeviceCapturerFactory( | |
67 VideoDeviceCapturerFactory* video_device_capturer_factory) { | |
68 } | |
69 virtual void SetScreenCapturerFactory( | |
70 ScreenCapturerFactory* screen_capturer_factory) { | |
71 screen_capturer_factory_.reset(screen_capturer_factory); | |
72 } | |
73 virtual void SetVideoCaptureDeviceMaxFormat(const std::string& usb_id, | |
74 const VideoFormat& max_format) { | |
75 max_formats_[usb_id] = max_format; | |
76 } | |
77 bool IsMaxFormatForDevice(const std::string& usb_id, | |
78 const VideoFormat& max_format) const { | |
79 std::map<std::string, VideoFormat>::const_iterator found = | |
80 max_formats_.find(usb_id); | |
81 return (found != max_formats_.end()) ? | |
82 max_format == found->second : | |
83 false; | |
84 } | |
85 virtual void ClearVideoCaptureDeviceMaxFormat(const std::string& usb_id) { | |
86 max_formats_.erase(usb_id); | |
87 } | |
88 virtual VideoCapturer* CreateVideoCapturer(const Device& device) const { | |
89 return new FakeVideoCapturer(); | |
90 } | |
91 virtual VideoCapturer* CreateScreenCapturer( | |
92 const ScreencastId& screenid) const { | |
93 if (!screen_capturer_factory_) { | |
94 return new FakeVideoCapturer(); | |
95 } | |
96 return screen_capturer_factory_->Create(screenid); | |
97 } | |
98 virtual bool GetWindows( | |
99 std::vector<rtc::WindowDescription>* descriptions) { | |
100 descriptions->clear(); | |
101 const uint32_t id = 1u; // Note that 0 is not a valid ID. | |
102 const rtc::WindowId window_id = | |
103 rtc::WindowId::Cast(id); | |
104 std::string title = "FakeWindow"; | |
105 rtc::WindowDescription window_description(window_id, title); | |
106 descriptions->push_back(window_description); | |
107 return true; | |
108 } | |
109 virtual VideoCapturer* CreateWindowCapturer(rtc::WindowId window) { | |
110 if (!window.IsValid()) { | |
111 return NULL; | |
112 } | |
113 return new FakeVideoCapturer; | |
114 } | |
115 virtual bool GetDesktops( | |
116 std::vector<rtc::DesktopDescription>* descriptions) { | |
117 descriptions->clear(); | |
118 const int id = 0; | |
119 const int valid_index = 0; | |
120 const rtc::DesktopId desktop_id = | |
121 rtc::DesktopId::Cast(id, valid_index); | |
122 std::string title = "FakeDesktop"; | |
123 rtc::DesktopDescription desktop_description(desktop_id, title); | |
124 descriptions->push_back(desktop_description); | |
125 return true; | |
126 } | |
127 virtual VideoCapturer* CreateDesktopCapturer(rtc::DesktopId desktop) { | |
128 if (!desktop.IsValid()) { | |
129 return NULL; | |
130 } | |
131 return new FakeVideoCapturer; | |
132 } | |
133 | |
134 virtual bool GetDefaultVideoCaptureDevice(Device* device) { | |
135 if (vidcap_devices_.empty()) { | |
136 return false; | |
137 } | |
138 *device = vidcap_devices_[0]; | |
139 return true; | |
140 } | |
141 | |
142 #if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) | |
143 bool QtKitToSgDevice(const std::string& qtkit_name, Device* out) { | |
144 out->name = qtkit_name; | |
145 out->id = "sg:" + qtkit_name; | |
146 return true; | |
147 } | |
148 #endif | |
149 | |
150 void SetAudioInputDevices(const std::vector<std::string>& devices) { | |
151 input_devices_.clear(); | |
152 for (size_t i = 0; i < devices.size(); ++i) { | |
153 input_devices_.push_back(Device(devices[i], | |
154 static_cast<int>(i))); | |
155 } | |
156 SignalDevicesChange(); | |
157 } | |
158 void SetAudioOutputDevices(const std::vector<std::string>& devices) { | |
159 output_devices_.clear(); | |
160 for (size_t i = 0; i < devices.size(); ++i) { | |
161 output_devices_.push_back(Device(devices[i], | |
162 static_cast<int>(i))); | |
163 } | |
164 SignalDevicesChange(); | |
165 } | |
166 void SetVideoCaptureDevices(const std::vector<std::string>& devices) { | |
167 vidcap_devices_.clear(); | |
168 for (size_t i = 0; i < devices.size(); ++i) { | |
169 vidcap_devices_.push_back(Device(devices[i], | |
170 static_cast<int>(i))); | |
171 } | |
172 SignalDevicesChange(); | |
173 } | |
174 virtual bool GetVideoCaptureDevice(const std::string& name, | |
175 Device* out) { | |
176 if (vidcap_devices_.empty()) | |
177 return false; | |
178 | |
179 // If the name is empty, return the default device. | |
180 if (name.empty() || name == kDefaultDeviceName) { | |
181 *out = vidcap_devices_[0]; | |
182 return true; | |
183 } | |
184 | |
185 return FindDeviceByName(vidcap_devices_, name, out); | |
186 } | |
187 bool GetAudioDevice(bool is_input, const std::string& name, | |
188 Device* out) { | |
189 // If the name is empty, return the default device. | |
190 if (name.empty() || name == kDefaultDeviceName) { | |
191 *out = Device(name, -1); | |
192 return true; | |
193 } | |
194 | |
195 return FindDeviceByName((is_input ? input_devices_ : output_devices_), | |
196 name, out); | |
197 } | |
198 static bool FindDeviceByName(const std::vector<Device>& devices, | |
199 const std::string& name, | |
200 Device* out) { | |
201 for (std::vector<Device>::const_iterator it = devices.begin(); | |
202 it != devices.end(); ++it) { | |
203 if (name == it->name) { | |
204 *out = *it; | |
205 return true; | |
206 } | |
207 } | |
208 return false; | |
209 } | |
210 | |
211 private: | |
212 std::vector<Device> input_devices_; | |
213 std::vector<Device> output_devices_; | |
214 std::vector<Device> vidcap_devices_; | |
215 std::map<std::string, VideoFormat> max_formats_; | |
216 rtc::scoped_ptr< | |
217 ScreenCapturerFactory> screen_capturer_factory_; | |
218 }; | |
219 | |
220 } // namespace cricket | |
221 | |
222 #endif // WEBRTC_MEDIA_DEVICES_FAKEDEVICEMANAGER_H_ | |
OLD | NEW |