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
3 // found in the LICENSE file.
5 #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h"
7 #include "content/browser/browser_main_loop.h"
8 #include "content/browser/renderer_host/media/web_contents_capture_util.h"
9 #include "content/common/media/media_stream_messages.h"
10 #include "content/common/media/media_stream_options.h"
15 MediaStreamDispatcherHost::MediaStreamDispatcherHost(
16 int render_process_id,
17 MediaStreamManager* media_stream_manager)
18 : render_process_id_(render_process_id),
19 media_stream_manager_(media_stream_manager) {
22 void MediaStreamDispatcherHost::StreamGenerated(
23 const std::string& label,
24 const StreamDeviceInfoArray& audio_devices,
25 const StreamDeviceInfoArray& video_devices) {
26 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
27 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerated("
28 << ", {label = " << label << "})";
30 StreamRequest request = PopRequest(label);
32 Send(new MediaStreamMsg_StreamGenerated(
33 request.render_view_id, request.page_request_id, label, audio_devices,
37 void MediaStreamDispatcherHost::StreamGenerationFailed(
38 const std::string& label) {
39 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
40 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerationFailed("
41 << ", {label = " << label << "})";
43 StreamRequest request = PopRequest(label);
45 Send(new MediaStreamMsg_StreamGenerationFailed(request.render_view_id,
46 request.page_request_id));
49 void MediaStreamDispatcherHost::StopGeneratedStream(
51 const std::string& label) {
52 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
53 DVLOG(1) << "MediaStreamDispatcherHost::StopGeneratedStream("
54 << ", {label = " << label << "})";
56 Send(new MediaStreamMsg_StopGeneratedStream(render_view_id, label));
59 void MediaStreamDispatcherHost::DevicesEnumerated(
60 const std::string& label,
61 const StreamDeviceInfoArray& devices) {
62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
63 DVLOG(1) << "MediaStreamDispatcherHost::DevicesEnumerated("
64 << ", {label = " << label << "})";
66 StreamMap::iterator it = streams_.find(label);
67 DCHECK(it != streams_.end());
68 StreamRequest request = it->second;
70 Send(new MediaStreamMsg_DevicesEnumerated(
71 request.render_view_id, request.page_request_id, label, devices));
74 void MediaStreamDispatcherHost::DeviceOpened(
75 const std::string& label,
76 const StreamDeviceInfo& video_device) {
77 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
78 DVLOG(1) << "MediaStreamDispatcherHost::DeviceOpened("
79 << ", {label = " << label << "})";
81 StreamRequest request = PopRequest(label);
83 Send(new MediaStreamMsg_DeviceOpened(
84 request.render_view_id, request.page_request_id, label, video_device));
87 bool MediaStreamDispatcherHost::OnMessageReceived(
88 const IPC::Message& message, bool* message_was_ok) {
90 IPC_BEGIN_MESSAGE_MAP_EX(MediaStreamDispatcherHost, message, *message_was_ok)
91 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_GenerateStream, OnGenerateStream)
92 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CancelGenerateStream,
93 OnCancelGenerateStream)
94 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_StopStreamDevice,
96 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_EnumerateDevices,
98 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_OpenDevice,
100 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_CloseDevice,
102 IPC_MESSAGE_UNHANDLED(handled = false)
103 IPC_END_MESSAGE_MAP_EX()
107 void MediaStreamDispatcherHost::OnChannelClosing() {
108 DVLOG(1) << "MediaStreamDispatcherHost::OnChannelClosing";
110 // Since the IPC channel is gone, close all requesting/requested streams.
111 media_stream_manager_->CancelAllRequests(render_process_id_);
112 // Clear the map after we have stopped all the streams.
116 MediaStreamDispatcherHost::~MediaStreamDispatcherHost() {
117 DCHECK(streams_.empty());
120 void MediaStreamDispatcherHost::OnGenerateStream(
123 const StreamOptions& components,
124 const GURL& security_origin) {
125 DVLOG(1) << "MediaStreamDispatcherHost::OnGenerateStream("
126 << render_view_id << ", "
127 << page_request_id << ", ["
128 << " audio:" << components.audio_type
129 << " video:" << components.video_type
131 << security_origin.spec() << ")";
133 const std::string& label = media_stream_manager_->GenerateStream(
134 this, render_process_id_, render_view_id, page_request_id,
135 components, security_origin);
137 Send(new MediaStreamMsg_StreamGenerationFailed(render_view_id,
140 StoreRequest(render_view_id, page_request_id, label);
144 void MediaStreamDispatcherHost::OnCancelGenerateStream(int render_view_id,
145 int page_request_id) {
146 DVLOG(1) << "MediaStreamDispatcherHost::OnCancelGenerateStream("
147 << render_view_id << ", "
148 << page_request_id << ")";
150 for (StreamMap::iterator it = streams_.begin(); it != streams_.end(); ++it) {
151 if (it->second.render_view_id == render_view_id &&
152 it->second.page_request_id == page_request_id) {
153 const std::string& label = it->first;
154 media_stream_manager_->CancelRequest(label);
161 void MediaStreamDispatcherHost::OnStopStreamDevice(
163 const std::string& device_id) {
164 DVLOG(1) << "MediaStreamDispatcherHost::OnStopStreamDevice("
165 << render_view_id << ", "
167 media_stream_manager_->StopStreamDevice(render_process_id_, render_view_id,
171 void MediaStreamDispatcherHost::OnEnumerateDevices(
174 MediaStreamType type,
175 const GURL& security_origin) {
176 DVLOG(1) << "MediaStreamDispatcherHost::OnEnumerateDevices("
177 << render_view_id << ", "
178 << page_request_id << ", "
180 << security_origin.spec() << ")";
182 const std::string& label = media_stream_manager_->EnumerateDevices(
183 this, render_process_id_, render_view_id, page_request_id,
184 type, security_origin);
185 StoreRequest(render_view_id, page_request_id, label);
188 void MediaStreamDispatcherHost::OnCancelEnumerateDevices(
190 const std::string& label) {
191 DVLOG(1) << "MediaStreamDispatcherHost::OnCancelEnumerateDevices("
192 << render_view_id << ", "
195 media_stream_manager_->CancelRequest(label);
199 void MediaStreamDispatcherHost::OnOpenDevice(
202 const std::string& device_id,
203 MediaStreamType type,
204 const GURL& security_origin) {
205 DVLOG(1) << "MediaStreamDispatcherHost::OnOpenDevice("
206 << render_view_id << ", "
207 << page_request_id << ", device_id: "
208 << device_id.c_str() << ", type: "
210 << security_origin.spec() << ")";
212 const std::string& label = media_stream_manager_->OpenDevice(
213 this, render_process_id_, render_view_id, page_request_id,
214 device_id, type, security_origin);
215 StoreRequest(render_view_id, page_request_id, label);
218 void MediaStreamDispatcherHost::OnCloseDevice(
220 const std::string& label) {
221 DVLOG(1) << "MediaStreamDispatcherHost::OnCloseDevice("
222 << render_view_id << ", "
225 media_stream_manager_->CancelRequest(label);
228 void MediaStreamDispatcherHost::StoreRequest(int render_view_id,
230 const std::string& label) {
231 DCHECK(!label.empty());
232 DCHECK(streams_.find(label) == streams_.end());
234 streams_[label] = StreamRequest(render_view_id, page_request_id);
237 MediaStreamDispatcherHost::StreamRequest
238 MediaStreamDispatcherHost::PopRequest(const std::string& label) {
239 StreamMap::iterator it = streams_.find(label);
240 CHECK(it != streams_.end());
241 StreamRequest request = it->second;
246 } // namespace content