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_frame_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::GetForRenderFrame( |
27 RenderView* render_view) { | 27 RenderFrame* render_frame) { |
28 PepperMediaDeviceManager* handler = | 28 PepperMediaDeviceManager* handler = |
29 PepperMediaDeviceManager::Get(render_view); | 29 PepperMediaDeviceManager::Get(render_frame); |
30 if (!handler) | 30 if (!handler) |
31 handler = new PepperMediaDeviceManager(render_view); | 31 handler = new PepperMediaDeviceManager(render_frame); |
32 return handler; | 32 return handler; |
33 } | 33 } |
34 | 34 |
35 PepperMediaDeviceManager::PepperMediaDeviceManager(RenderView* render_view) | 35 PepperMediaDeviceManager::PepperMediaDeviceManager(RenderFrame* render_frame) |
36 : RenderViewObserver(render_view), | 36 : RenderFrameObserver(render_frame), |
37 RenderViewObserverTracker<PepperMediaDeviceManager>(render_view), | 37 RenderFrameObserverTracker<PepperMediaDeviceManager>(render_frame), |
38 next_id_(1) {} | 38 next_id_(1) {} |
39 | 39 |
40 PepperMediaDeviceManager::~PepperMediaDeviceManager() { | 40 PepperMediaDeviceManager::~PepperMediaDeviceManager() { |
41 DCHECK(enumerate_callbacks_.empty()); | 41 DCHECK(enumerate_callbacks_.empty()); |
42 DCHECK(open_callbacks_.empty()); | 42 DCHECK(open_callbacks_.empty()); |
43 } | 43 } |
44 | 44 |
45 int PepperMediaDeviceManager::EnumerateDevices( | 45 int PepperMediaDeviceManager::EnumerateDevices( |
46 PP_DeviceType_Dev type, | 46 PP_DeviceType_Dev type, |
47 const GURL& document_url, | 47 const GURL& document_url, |
48 const EnumerateDevicesCallback& callback) { | 48 const EnumerateDevicesCallback& callback) { |
49 enumerate_callbacks_[next_id_] = callback; | 49 enumerate_callbacks_[next_id_] = callback; |
50 int request_id = next_id_++; | 50 int request_id = next_id_++; |
51 | 51 |
52 #if defined(ENABLE_WEBRTC) | 52 #if defined(ENABLE_WEBRTC) |
53 GetRenderViewImpl()->media_stream_dispatcher()->EnumerateDevices( | 53 GetMediaStreamDispatcher()->EnumerateDevices( |
54 request_id, | 54 request_id, |
55 AsWeakPtr(), | 55 AsWeakPtr(), |
56 PepperMediaDeviceManager::FromPepperDeviceType(type), | 56 PepperMediaDeviceManager::FromPepperDeviceType(type), |
57 document_url.GetOrigin(), | 57 document_url.GetOrigin(), |
58 false); | 58 false); |
59 #else | 59 #else |
60 base::MessageLoop::current()->PostTask( | 60 base::MessageLoop::current()->PostTask( |
61 FROM_HERE, | 61 FROM_HERE, |
62 base::Bind(&PepperMediaDeviceManager::OnDevicesEnumerated, | 62 base::Bind(&PepperMediaDeviceManager::OnDevicesEnumerated, |
63 AsWeakPtr(), | 63 AsWeakPtr(), |
64 request_id, | 64 request_id, |
65 StreamDeviceInfoArray())); | 65 StreamDeviceInfoArray())); |
66 #endif | 66 #endif |
67 | 67 |
68 return request_id; | 68 return request_id; |
69 } | 69 } |
70 | 70 |
71 void PepperMediaDeviceManager::StopEnumerateDevices(int request_id) { | 71 void PepperMediaDeviceManager::StopEnumerateDevices(int request_id) { |
72 enumerate_callbacks_.erase(request_id); | 72 enumerate_callbacks_.erase(request_id); |
73 | 73 |
74 #if defined(ENABLE_WEBRTC) | 74 #if defined(ENABLE_WEBRTC) |
75 // Need to post task since this function might be called inside the callback | 75 // Need to post task since this function might be called inside the callback |
76 // of EnumerateDevices. | 76 // of EnumerateDevices. |
77 base::MessageLoop::current()->PostTask( | 77 base::MessageLoop::current()->PostTask( |
78 FROM_HERE, | 78 FROM_HERE, |
79 base::Bind(&MediaStreamDispatcher::StopEnumerateDevices, | 79 base::Bind(&PepperMediaDeviceManager::StopEnumerateDevicesDelayed, |
80 GetRenderViewImpl()->media_stream_dispatcher()->AsWeakPtr(), | 80 AsWeakPtr(), |
81 request_id, | 81 request_id)); |
82 AsWeakPtr())); | |
83 #endif | 82 #endif |
84 } | 83 } |
85 | 84 |
| 85 void PepperMediaDeviceManager::StopEnumerateDevicesDelayed(int request_id) { |
| 86 #if defined(ENABLE_WEBRTC) |
| 87 // This method is being invoked by the message loop at some unknown |
| 88 // point-in-time after StopEnumerateDevices(). Therefore, check that |
| 89 // render_frame() is not NULL, in order to guarantee |
| 90 // GetMediaStreamDispatcher() won't return NULL. |
| 91 if (render_frame()) |
| 92 GetMediaStreamDispatcher()->StopEnumerateDevices(request_id, AsWeakPtr()); |
| 93 #endif |
| 94 } |
| 95 |
86 int PepperMediaDeviceManager::OpenDevice(PP_DeviceType_Dev type, | 96 int PepperMediaDeviceManager::OpenDevice(PP_DeviceType_Dev type, |
87 const std::string& device_id, | 97 const std::string& device_id, |
88 const GURL& document_url, | 98 const GURL& document_url, |
89 const OpenDeviceCallback& callback) { | 99 const OpenDeviceCallback& callback) { |
90 open_callbacks_[next_id_] = callback; | 100 open_callbacks_[next_id_] = callback; |
91 int request_id = next_id_++; | 101 int request_id = next_id_++; |
92 | 102 |
93 #if defined(ENABLE_WEBRTC) | 103 #if defined(ENABLE_WEBRTC) |
94 GetRenderViewImpl()->media_stream_dispatcher()->OpenDevice( | 104 GetMediaStreamDispatcher()->OpenDevice( |
95 request_id, | 105 request_id, |
96 AsWeakPtr(), | 106 AsWeakPtr(), |
97 device_id, | 107 device_id, |
98 PepperMediaDeviceManager::FromPepperDeviceType(type), | 108 PepperMediaDeviceManager::FromPepperDeviceType(type), |
99 document_url.GetOrigin()); | 109 document_url.GetOrigin()); |
100 #else | 110 #else |
101 base::MessageLoop::current()->PostTask( | 111 base::MessageLoop::current()->PostTask( |
102 FROM_HERE, | 112 FROM_HERE, |
103 base::Bind(&PepperMediaDeviceManager::OnDeviceOpenFailed, | 113 base::Bind(&PepperMediaDeviceManager::OnDeviceOpenFailed, |
104 AsWeakPtr(), | 114 AsWeakPtr(), |
105 request_id)); | 115 request_id)); |
106 #endif | 116 #endif |
107 | 117 |
108 return request_id; | 118 return request_id; |
109 } | 119 } |
110 | 120 |
111 void PepperMediaDeviceManager::CancelOpenDevice(int request_id) { | 121 void PepperMediaDeviceManager::CancelOpenDevice(int request_id) { |
112 open_callbacks_.erase(request_id); | 122 open_callbacks_.erase(request_id); |
113 | 123 |
114 #if defined(ENABLE_WEBRTC) | 124 #if defined(ENABLE_WEBRTC) |
115 GetRenderViewImpl()->media_stream_dispatcher()->CancelOpenDevice(request_id, | 125 GetMediaStreamDispatcher()->CancelOpenDevice(request_id, AsWeakPtr()); |
116 AsWeakPtr()); | |
117 #endif | 126 #endif |
118 } | 127 } |
119 | 128 |
120 void PepperMediaDeviceManager::CloseDevice(const std::string& label) { | 129 void PepperMediaDeviceManager::CloseDevice(const std::string& label) { |
121 #if defined(ENABLE_WEBRTC) | 130 #if defined(ENABLE_WEBRTC) |
122 GetRenderViewImpl()->media_stream_dispatcher()->CloseDevice(label); | 131 GetMediaStreamDispatcher()->CloseDevice(label); |
123 #endif | 132 #endif |
124 } | 133 } |
125 | 134 |
126 int PepperMediaDeviceManager::GetSessionID(PP_DeviceType_Dev type, | 135 int PepperMediaDeviceManager::GetSessionID(PP_DeviceType_Dev type, |
127 const std::string& label) { | 136 const std::string& label) { |
128 #if defined(ENABLE_WEBRTC) | 137 #if defined(ENABLE_WEBRTC) |
129 switch (type) { | 138 switch (type) { |
130 case PP_DEVICETYPE_DEV_AUDIOCAPTURE: | 139 case PP_DEVICETYPE_DEV_AUDIOCAPTURE: |
131 return GetRenderViewImpl()->media_stream_dispatcher()->audio_session_id( | 140 return GetMediaStreamDispatcher()->audio_session_id(label, 0); |
132 label, 0); | |
133 case PP_DEVICETYPE_DEV_VIDEOCAPTURE: | 141 case PP_DEVICETYPE_DEV_VIDEOCAPTURE: |
134 return GetRenderViewImpl()->media_stream_dispatcher()->video_session_id( | 142 return GetMediaStreamDispatcher()->video_session_id(label, 0); |
135 label, 0); | |
136 default: | 143 default: |
137 NOTREACHED(); | 144 NOTREACHED(); |
138 return 0; | 145 return 0; |
139 } | 146 } |
140 #else | 147 #else |
141 return 0; | 148 return 0; |
142 #endif | 149 #endif |
143 } | 150 } |
144 | 151 |
145 void PepperMediaDeviceManager::OnStreamGenerated( | 152 void PepperMediaDeviceManager::OnStreamGenerated( |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 // The callback may have been unregistered. | 236 // The callback may have been unregistered. |
230 return; | 237 return; |
231 } | 238 } |
232 | 239 |
233 OpenDeviceCallback callback = iter->second; | 240 OpenDeviceCallback callback = iter->second; |
234 open_callbacks_.erase(iter); | 241 open_callbacks_.erase(iter); |
235 | 242 |
236 callback.Run(request_id, succeeded, label); | 243 callback.Run(request_id, succeeded, label); |
237 } | 244 } |
238 | 245 |
239 RenderViewImpl* PepperMediaDeviceManager::GetRenderViewImpl() { | 246 MediaStreamDispatcher* PepperMediaDeviceManager::GetMediaStreamDispatcher() |
240 return static_cast<RenderViewImpl*>(render_view()); | 247 const { |
| 248 DCHECK(render_frame()); |
| 249 MediaStreamDispatcher* const dispatcher = |
| 250 static_cast<RenderFrameImpl*>(render_frame())->GetMediaStreamDispatcher(); |
| 251 DCHECK(dispatcher); |
| 252 return dispatcher; |
241 } | 253 } |
242 | 254 |
243 } // namespace content | 255 } // namespace content |
OLD | NEW |