OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/pepper/pepper_media_device_manager.h" | 5 #include "content/renderer/pepper/pepper_media_device_manager.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "content/renderer/media/media_stream_dispatcher.h" | 8 #include "content/renderer/media/media_stream_dispatcher.h" |
9 #include "content/renderer/render_view_impl.h" | 9 #include "content/renderer/render_view_impl.h" |
10 #include "ppapi/shared_impl/ppb_device_ref_shared.h" | 10 #include "ppapi/shared_impl/ppb_device_ref_shared.h" |
11 | 11 |
12 namespace content { | 12 namespace content { |
13 | 13 |
14 namespace { | 14 namespace { |
15 | 15 |
16 ppapi::DeviceRefData FromStreamDeviceInfo(const StreamDeviceInfo& info) { | 16 ppapi::DeviceRefData FromStreamDeviceInfo(const StreamDeviceInfo& info) { |
17 ppapi::DeviceRefData data; | 17 ppapi::DeviceRefData data; |
18 data.id = info.device.id; | 18 data.id = info.device.id; |
19 data.name = info.device.name; | 19 data.name = info.device.name; |
20 data.type = PepperMediaDeviceManager::FromMediaStreamType(info.device.type); | 20 data.type = PepperMediaDeviceManager::FromMediaStreamType(info.device.type); |
21 return data; | 21 return data; |
22 } | 22 } |
23 | 23 |
24 } // namespace | 24 } // namespace |
25 | 25 |
26 PepperMediaDeviceManager* PepperMediaDeviceManager::GetForRenderView( | 26 PepperMediaDeviceManager* PepperMediaDeviceManager::GetForRenderView( |
27 RenderView* render_view) { | 27 RenderView* render_view) { |
28 PepperMediaDeviceManager* handler = | 28 PepperMediaDeviceManager* handler = |
29 PepperMediaDeviceManager::Get(render_view); | 29 PepperMediaDeviceManager::Get(render_view); |
30 if (!handler) | 30 if (!handler) |
31 handler = new PepperMediaDeviceManager(render_view); | 31 handler = new PepperMediaDeviceManager(render_view); |
32 return handler; | 32 return handler; |
33 } | 33 } |
34 | 34 |
35 PepperMediaDeviceManager::PepperMediaDeviceManager(RenderView* render_view) | 35 PepperMediaDeviceManager::PepperMediaDeviceManager(RenderView* render_view) |
36 : RenderViewObserver(render_view), | 36 : RenderViewObserver(render_view), |
37 RenderViewObserverTracker<PepperMediaDeviceManager>(render_view), | 37 RenderViewObserverTracker<PepperMediaDeviceManager>(render_view), |
38 next_id_(1) { | 38 next_id_(1) {} |
39 } | |
40 | 39 |
41 PepperMediaDeviceManager::~PepperMediaDeviceManager() { | 40 PepperMediaDeviceManager::~PepperMediaDeviceManager() { |
42 DCHECK(enumerate_callbacks_.empty()); | 41 DCHECK(enumerate_callbacks_.empty()); |
43 DCHECK(open_callbacks_.empty()); | 42 DCHECK(open_callbacks_.empty()); |
44 } | 43 } |
45 | 44 |
46 int PepperMediaDeviceManager::EnumerateDevices( | 45 int PepperMediaDeviceManager::EnumerateDevices( |
47 PP_DeviceType_Dev type, | 46 PP_DeviceType_Dev type, |
48 const GURL& document_url, | 47 const GURL& document_url, |
49 const EnumerateDevicesCallback& callback) { | 48 const EnumerateDevicesCallback& callback) { |
50 enumerate_callbacks_[next_id_] = callback; | 49 enumerate_callbacks_[next_id_] = callback; |
51 int request_id = next_id_++; | 50 int request_id = next_id_++; |
52 | 51 |
53 #if defined(ENABLE_WEBRTC) | 52 #if defined(ENABLE_WEBRTC) |
54 GetRenderViewImpl()->media_stream_dispatcher()->EnumerateDevices( | 53 GetRenderViewImpl()->media_stream_dispatcher()->EnumerateDevices( |
55 request_id, AsWeakPtr(), | 54 request_id, |
| 55 AsWeakPtr(), |
56 PepperMediaDeviceManager::FromPepperDeviceType(type), | 56 PepperMediaDeviceManager::FromPepperDeviceType(type), |
57 document_url.GetOrigin()); | 57 document_url.GetOrigin()); |
58 #else | 58 #else |
59 base::MessageLoop::current()->PostTask( | 59 base::MessageLoop::current()->PostTask( |
60 FROM_HERE, | 60 FROM_HERE, |
61 base::Bind( | 61 base::Bind(&PepperMediaDeviceManager::OnDevicesEnumerated, |
62 &PepperMediaDeviceManager::OnDevicesEnumerated, | 62 AsWeakPtr(), |
63 AsWeakPtr(), | 63 request_id, |
64 request_id, | 64 StreamDeviceInfoArray())); |
65 StreamDeviceInfoArray())); | |
66 #endif | 65 #endif |
67 | 66 |
68 return request_id; | 67 return request_id; |
69 } | 68 } |
70 | 69 |
71 void PepperMediaDeviceManager::StopEnumerateDevices(int request_id) { | 70 void PepperMediaDeviceManager::StopEnumerateDevices(int request_id) { |
72 enumerate_callbacks_.erase(request_id); | 71 enumerate_callbacks_.erase(request_id); |
73 | 72 |
74 #if defined(ENABLE_WEBRTC) | 73 #if defined(ENABLE_WEBRTC) |
75 // Need to post task since this function might be called inside the callback | 74 // Need to post task since this function might be called inside the callback |
76 // of EnumerateDevices. | 75 // of EnumerateDevices. |
77 base::MessageLoop::current()->PostTask( | 76 base::MessageLoop::current()->PostTask( |
78 FROM_HERE, | 77 FROM_HERE, |
79 base::Bind(&MediaStreamDispatcher::StopEnumerateDevices, | 78 base::Bind(&MediaStreamDispatcher::StopEnumerateDevices, |
80 GetRenderViewImpl()->media_stream_dispatcher()->AsWeakPtr(), | 79 GetRenderViewImpl()->media_stream_dispatcher()->AsWeakPtr(), |
81 request_id, | 80 request_id, |
82 AsWeakPtr())); | 81 AsWeakPtr())); |
83 #endif | 82 #endif |
84 } | 83 } |
85 | 84 |
86 int PepperMediaDeviceManager::OpenDevice( | 85 int PepperMediaDeviceManager::OpenDevice(PP_DeviceType_Dev type, |
87 PP_DeviceType_Dev type, | 86 const std::string& device_id, |
88 const std::string& device_id, | 87 const GURL& document_url, |
89 const GURL& document_url, | 88 const OpenDeviceCallback& callback) { |
90 const OpenDeviceCallback& callback) { | |
91 open_callbacks_[next_id_] = callback; | 89 open_callbacks_[next_id_] = callback; |
92 int request_id = next_id_++; | 90 int request_id = next_id_++; |
93 | 91 |
94 #if defined(ENABLE_WEBRTC) | 92 #if defined(ENABLE_WEBRTC) |
95 GetRenderViewImpl()->media_stream_dispatcher()-> | 93 GetRenderViewImpl()->media_stream_dispatcher()->OpenDevice( |
96 OpenDevice( | 94 request_id, |
97 request_id, | 95 AsWeakPtr(), |
98 AsWeakPtr(), | 96 device_id, |
99 device_id, | 97 PepperMediaDeviceManager::FromPepperDeviceType(type), |
100 PepperMediaDeviceManager::FromPepperDeviceType(type), | 98 document_url.GetOrigin()); |
101 document_url.GetOrigin()); | |
102 #else | 99 #else |
103 base::MessageLoop::current()->PostTask( | 100 base::MessageLoop::current()->PostTask( |
104 FROM_HERE, | 101 FROM_HERE, |
105 base::Bind(&PepperMediaDeviceManager::OnDeviceOpenFailed, | 102 base::Bind(&PepperMediaDeviceManager::OnDeviceOpenFailed, |
106 AsWeakPtr(), | 103 AsWeakPtr(), |
107 request_id)); | 104 request_id)); |
108 #endif | 105 #endif |
109 | 106 |
110 return request_id; | 107 return request_id; |
111 } | 108 } |
112 | 109 |
113 void PepperMediaDeviceManager::CancelOpenDevice(int request_id) { | 110 void PepperMediaDeviceManager::CancelOpenDevice(int request_id) { |
114 open_callbacks_.erase(request_id); | 111 open_callbacks_.erase(request_id); |
115 | 112 |
116 #if defined(ENABLE_WEBRTC) | 113 #if defined(ENABLE_WEBRTC) |
117 GetRenderViewImpl()->media_stream_dispatcher()->CancelOpenDevice( | 114 GetRenderViewImpl()->media_stream_dispatcher()->CancelOpenDevice(request_id, |
118 request_id, AsWeakPtr()); | 115 AsWeakPtr()); |
119 #endif | 116 #endif |
120 } | 117 } |
121 | 118 |
122 void PepperMediaDeviceManager::CloseDevice(const std::string& label) { | 119 void PepperMediaDeviceManager::CloseDevice(const std::string& label) { |
123 #if defined(ENABLE_WEBRTC) | 120 #if defined(ENABLE_WEBRTC) |
124 GetRenderViewImpl()->media_stream_dispatcher()->CloseDevice(label); | 121 GetRenderViewImpl()->media_stream_dispatcher()->CloseDevice(label); |
125 #endif | 122 #endif |
126 } | 123 } |
127 | 124 |
128 int PepperMediaDeviceManager::GetSessionID(PP_DeviceType_Dev type, | 125 int PepperMediaDeviceManager::GetSessionID(PP_DeviceType_Dev type, |
(...skipping 12 matching lines...) Expand all Loading... |
141 } | 138 } |
142 #else | 139 #else |
143 return 0; | 140 return 0; |
144 #endif | 141 #endif |
145 } | 142 } |
146 | 143 |
147 void PepperMediaDeviceManager::OnStreamGenerated( | 144 void PepperMediaDeviceManager::OnStreamGenerated( |
148 int request_id, | 145 int request_id, |
149 const std::string& label, | 146 const std::string& label, |
150 const StreamDeviceInfoArray& audio_device_array, | 147 const StreamDeviceInfoArray& audio_device_array, |
151 const StreamDeviceInfoArray& video_device_array) { | 148 const StreamDeviceInfoArray& video_device_array) {} |
152 } | |
153 | 149 |
154 void PepperMediaDeviceManager::OnStreamGenerationFailed( | 150 void PepperMediaDeviceManager::OnStreamGenerationFailed( |
155 int request_id, | 151 int request_id, |
156 content::MediaStreamRequestResult result) { | 152 content::MediaStreamRequestResult result) {} |
157 } | |
158 | 153 |
159 void PepperMediaDeviceManager::OnDeviceStopped( | 154 void PepperMediaDeviceManager::OnDeviceStopped( |
160 const std::string& label, | 155 const std::string& label, |
161 const StreamDeviceInfo& device_info) { | 156 const StreamDeviceInfo& device_info) {} |
162 } | |
163 | 157 |
164 void PepperMediaDeviceManager::OnDevicesEnumerated( | 158 void PepperMediaDeviceManager::OnDevicesEnumerated( |
165 int request_id, | 159 int request_id, |
166 const StreamDeviceInfoArray& device_array) { | 160 const StreamDeviceInfoArray& device_array) { |
167 EnumerateCallbackMap::iterator iter = enumerate_callbacks_.find(request_id); | 161 EnumerateCallbackMap::iterator iter = enumerate_callbacks_.find(request_id); |
168 if (iter == enumerate_callbacks_.end()) { | 162 if (iter == enumerate_callbacks_.end()) { |
169 // This might be enumerated result sent before StopEnumerateDevices is | 163 // This might be enumerated result sent before StopEnumerateDevices is |
170 // called since EnumerateDevices is persistent request. | 164 // called since EnumerateDevices is persistent request. |
171 return; | 165 return; |
172 } | 166 } |
173 | 167 |
174 EnumerateDevicesCallback callback = iter->second; | 168 EnumerateDevicesCallback callback = iter->second; |
175 | 169 |
176 std::vector<ppapi::DeviceRefData> devices; | 170 std::vector<ppapi::DeviceRefData> devices; |
177 devices.reserve(device_array.size()); | 171 devices.reserve(device_array.size()); |
178 for (StreamDeviceInfoArray::const_iterator info = | 172 for (StreamDeviceInfoArray::const_iterator info = device_array.begin(); |
179 device_array.begin(); info != device_array.end(); ++info) { | 173 info != device_array.end(); |
| 174 ++info) { |
180 devices.push_back(FromStreamDeviceInfo(*info)); | 175 devices.push_back(FromStreamDeviceInfo(*info)); |
181 } | 176 } |
182 callback.Run(request_id, devices); | 177 callback.Run(request_id, devices); |
183 } | 178 } |
184 | 179 |
185 void PepperMediaDeviceManager::OnDeviceOpened( | 180 void PepperMediaDeviceManager::OnDeviceOpened( |
186 int request_id, | 181 int request_id, |
187 const std::string& label, | 182 const std::string& label, |
188 const StreamDeviceInfo& device_info) { | 183 const StreamDeviceInfo& device_info) { |
189 NotifyDeviceOpened(request_id, true, label); | 184 NotifyDeviceOpened(request_id, true, label); |
(...skipping 28 matching lines...) Expand all Loading... |
218 case MEDIA_DEVICE_AUDIO_CAPTURE: | 213 case MEDIA_DEVICE_AUDIO_CAPTURE: |
219 return PP_DEVICETYPE_DEV_AUDIOCAPTURE; | 214 return PP_DEVICETYPE_DEV_AUDIOCAPTURE; |
220 case MEDIA_DEVICE_VIDEO_CAPTURE: | 215 case MEDIA_DEVICE_VIDEO_CAPTURE: |
221 return PP_DEVICETYPE_DEV_VIDEOCAPTURE; | 216 return PP_DEVICETYPE_DEV_VIDEOCAPTURE; |
222 default: | 217 default: |
223 NOTREACHED(); | 218 NOTREACHED(); |
224 return PP_DEVICETYPE_DEV_INVALID; | 219 return PP_DEVICETYPE_DEV_INVALID; |
225 } | 220 } |
226 } | 221 } |
227 | 222 |
228 void PepperMediaDeviceManager::NotifyDeviceOpened( | 223 void PepperMediaDeviceManager::NotifyDeviceOpened(int request_id, |
229 int request_id, | 224 bool succeeded, |
230 bool succeeded, | 225 const std::string& label) { |
231 const std::string& label) { | |
232 OpenCallbackMap::iterator iter = open_callbacks_.find(request_id); | 226 OpenCallbackMap::iterator iter = open_callbacks_.find(request_id); |
233 if (iter == open_callbacks_.end()) { | 227 if (iter == open_callbacks_.end()) { |
234 // The callback may have been unregistered. | 228 // The callback may have been unregistered. |
235 return; | 229 return; |
236 } | 230 } |
237 | 231 |
238 OpenDeviceCallback callback = iter->second; | 232 OpenDeviceCallback callback = iter->second; |
239 open_callbacks_.erase(iter); | 233 open_callbacks_.erase(iter); |
240 | 234 |
241 callback.Run(request_id, succeeded, label); | 235 callback.Run(request_id, succeeded, label); |
242 } | 236 } |
243 | 237 |
244 RenderViewImpl* PepperMediaDeviceManager::GetRenderViewImpl() { | 238 RenderViewImpl* PepperMediaDeviceManager::GetRenderViewImpl() { |
245 return static_cast<RenderViewImpl*>(render_view()); | 239 return static_cast<RenderViewImpl*>(render_view()); |
246 } | 240 } |
247 | 241 |
248 } // namespace content | 242 } // namespace content |
OLD | NEW |