• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * libjingle
3  * Copyright 2008 Google Inc.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  *  1. Redistributions of source code must retain the above copyright notice,
9  *     this list of conditions and the following disclaimer.
10  *  2. Redistributions in binary form must reproduce the above copyright notice,
11  *     this list of conditions and the following disclaimer in the documentation
12  *     and/or other materials provided with the distribution.
13  *  3. The name of the author may not be used to endorse or promote products
14  *     derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef TALK_MEDIA_DEVICES_FAKEDEVICEMANAGER_H_
29 #define TALK_MEDIA_DEVICES_FAKEDEVICEMANAGER_H_
30 
31 #include <string>
32 #include <vector>
33 
34 #include "talk/media/base/fakevideocapturer.h"
35 #include "talk/media/base/mediacommon.h"
36 #include "talk/media/devices/devicemanager.h"
37 #include "webrtc/base/scoped_ptr.h"
38 #include "webrtc/base/window.h"
39 #include "webrtc/base/windowpicker.h"
40 
41 namespace cricket {
42 
43 class FakeDeviceManager : public DeviceManagerInterface {
44  public:
FakeDeviceManager()45   FakeDeviceManager() {}
Init()46   virtual bool Init() {
47     return true;
48   }
Terminate()49   virtual void Terminate() {
50   }
GetCapabilities()51   virtual int GetCapabilities() {
52     std::vector<Device> devices;
53     int caps = VIDEO_RECV;
54     if (!input_devices_.empty()) {
55       caps |= AUDIO_SEND;
56     }
57     if (!output_devices_.empty()) {
58       caps |= AUDIO_RECV;
59     }
60     if (!vidcap_devices_.empty()) {
61       caps |= VIDEO_SEND;
62     }
63     return caps;
64   }
GetAudioInputDevices(std::vector<Device> * devs)65   virtual bool GetAudioInputDevices(std::vector<Device>* devs) {
66     *devs = input_devices_;
67     return true;
68   }
GetAudioOutputDevices(std::vector<Device> * devs)69   virtual bool GetAudioOutputDevices(std::vector<Device>* devs) {
70     *devs = output_devices_;
71     return true;
72   }
GetAudioInputDevice(const std::string & name,Device * out)73   virtual bool GetAudioInputDevice(const std::string& name, Device* out) {
74     return GetAudioDevice(true, name, out);
75   }
GetAudioOutputDevice(const std::string & name,Device * out)76   virtual bool GetAudioOutputDevice(const std::string& name, Device* out) {
77     return GetAudioDevice(false, name, out);
78   }
GetVideoCaptureDevices(std::vector<Device> * devs)79   virtual bool GetVideoCaptureDevices(std::vector<Device>* devs) {
80     *devs = vidcap_devices_;
81     return true;
82   }
SetVideoDeviceCapturerFactory(VideoDeviceCapturerFactory * video_device_capturer_factory)83   virtual void SetVideoDeviceCapturerFactory(
84       VideoDeviceCapturerFactory* video_device_capturer_factory) {
85   }
SetScreenCapturerFactory(ScreenCapturerFactory * screen_capturer_factory)86   virtual void SetScreenCapturerFactory(
87       ScreenCapturerFactory* screen_capturer_factory) {
88     screen_capturer_factory_.reset(screen_capturer_factory);
89   }
SetVideoCaptureDeviceMaxFormat(const std::string & usb_id,const VideoFormat & max_format)90   virtual void SetVideoCaptureDeviceMaxFormat(const std::string& usb_id,
91                                               const VideoFormat& max_format) {
92     max_formats_[usb_id] = max_format;
93   }
IsMaxFormatForDevice(const std::string & usb_id,const VideoFormat & max_format)94   bool IsMaxFormatForDevice(const std::string& usb_id,
95                             const VideoFormat& max_format) const {
96     std::map<std::string, VideoFormat>::const_iterator found =
97         max_formats_.find(usb_id);
98     return (found != max_formats_.end()) ?
99         max_format == found->second :
100         false;
101   }
ClearVideoCaptureDeviceMaxFormat(const std::string & usb_id)102   virtual void ClearVideoCaptureDeviceMaxFormat(const std::string& usb_id) {
103     max_formats_.erase(usb_id);
104   }
CreateVideoCapturer(const Device & device)105   virtual VideoCapturer* CreateVideoCapturer(const Device& device) const {
106     return new FakeVideoCapturer();
107   }
CreateScreenCapturer(const ScreencastId & screenid)108   virtual VideoCapturer* CreateScreenCapturer(
109       const ScreencastId& screenid) const {
110     if (!screen_capturer_factory_) {
111       return new FakeVideoCapturer();
112     }
113     return screen_capturer_factory_->Create(screenid);
114   }
GetWindows(std::vector<rtc::WindowDescription> * descriptions)115   virtual bool GetWindows(
116       std::vector<rtc::WindowDescription>* descriptions) {
117     descriptions->clear();
118     const uint32_t id = 1u;  // Note that 0 is not a valid ID.
119     const rtc::WindowId window_id =
120         rtc::WindowId::Cast(id);
121     std::string title = "FakeWindow";
122     rtc::WindowDescription window_description(window_id, title);
123     descriptions->push_back(window_description);
124     return true;
125   }
CreateWindowCapturer(rtc::WindowId window)126   virtual VideoCapturer* CreateWindowCapturer(rtc::WindowId window) {
127     if (!window.IsValid()) {
128       return NULL;
129     }
130     return new FakeVideoCapturer;
131   }
GetDesktops(std::vector<rtc::DesktopDescription> * descriptions)132   virtual bool GetDesktops(
133       std::vector<rtc::DesktopDescription>* descriptions) {
134     descriptions->clear();
135     const int id = 0;
136     const int valid_index = 0;
137     const rtc::DesktopId desktop_id =
138         rtc::DesktopId::Cast(id, valid_index);
139     std::string title = "FakeDesktop";
140     rtc::DesktopDescription desktop_description(desktop_id, title);
141     descriptions->push_back(desktop_description);
142     return true;
143   }
CreateDesktopCapturer(rtc::DesktopId desktop)144   virtual VideoCapturer* CreateDesktopCapturer(rtc::DesktopId desktop) {
145     if (!desktop.IsValid()) {
146       return NULL;
147     }
148     return new FakeVideoCapturer;
149   }
150 
GetDefaultVideoCaptureDevice(Device * device)151   virtual bool GetDefaultVideoCaptureDevice(Device* device) {
152     if (vidcap_devices_.empty()) {
153       return false;
154     }
155     *device = vidcap_devices_[0];
156     return true;
157   }
158 
159 #if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
QtKitToSgDevice(const std::string & qtkit_name,Device * out)160   bool QtKitToSgDevice(const std::string& qtkit_name, Device* out) {
161     out->name = qtkit_name;
162     out->id = "sg:" + qtkit_name;
163     return true;
164   }
165 #endif
166 
SetAudioInputDevices(const std::vector<std::string> & devices)167   void SetAudioInputDevices(const std::vector<std::string>& devices) {
168     input_devices_.clear();
169     for (size_t i = 0; i < devices.size(); ++i) {
170       input_devices_.push_back(Device(devices[i],
171                                       static_cast<int>(i)));
172     }
173     SignalDevicesChange();
174   }
SetAudioOutputDevices(const std::vector<std::string> & devices)175   void SetAudioOutputDevices(const std::vector<std::string>& devices) {
176     output_devices_.clear();
177     for (size_t i = 0; i < devices.size(); ++i) {
178       output_devices_.push_back(Device(devices[i],
179                                        static_cast<int>(i)));
180     }
181     SignalDevicesChange();
182   }
SetVideoCaptureDevices(const std::vector<std::string> & devices)183   void SetVideoCaptureDevices(const std::vector<std::string>& devices) {
184     vidcap_devices_.clear();
185     for (size_t i = 0; i < devices.size(); ++i) {
186       vidcap_devices_.push_back(Device(devices[i],
187                                        static_cast<int>(i)));
188     }
189     SignalDevicesChange();
190   }
GetVideoCaptureDevice(const std::string & name,Device * out)191   virtual bool GetVideoCaptureDevice(const std::string& name,
192                                      Device* out) {
193     if (vidcap_devices_.empty())
194       return false;
195 
196     // If the name is empty, return the default device.
197     if (name.empty() || name == kDefaultDeviceName) {
198       *out = vidcap_devices_[0];
199       return true;
200     }
201 
202     return FindDeviceByName(vidcap_devices_, name, out);
203   }
GetAudioDevice(bool is_input,const std::string & name,Device * out)204   bool GetAudioDevice(bool is_input, const std::string& name,
205                       Device* out) {
206     // If the name is empty, return the default device.
207     if (name.empty() || name == kDefaultDeviceName) {
208       *out = Device(name, -1);
209       return true;
210     }
211 
212     return FindDeviceByName((is_input ? input_devices_ : output_devices_),
213                             name, out);
214   }
FindDeviceByName(const std::vector<Device> & devices,const std::string & name,Device * out)215   static bool FindDeviceByName(const std::vector<Device>& devices,
216                                const std::string& name,
217                                Device* out) {
218     for (std::vector<Device>::const_iterator it = devices.begin();
219          it != devices.end(); ++it) {
220       if (name == it->name) {
221         *out = *it;
222         return true;
223       }
224     }
225     return false;
226   }
227 
228  private:
229   std::vector<Device> input_devices_;
230   std::vector<Device> output_devices_;
231   std::vector<Device> vidcap_devices_;
232   std::map<std::string, VideoFormat> max_formats_;
233   rtc::scoped_ptr<
234     ScreenCapturerFactory> screen_capturer_factory_;
235 };
236 
237 }  // namespace cricket
238 
239 #endif  // TALK_MEDIA_DEVICES_FAKEDEVICEMANAGER_H_
240