| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/browser/renderer_host/media/media_stream_dispatcher_host.h" | 5 #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h" |
| 6 | 6 |
| 7 #include "content/browser/resource_context.h" | 7 #include "content/browser/resource_context.h" |
| 8 #include "content/common/media/media_stream_messages.h" | 8 #include "content/common/media/media_stream_messages.h" |
| 9 #include "content/common/media/media_stream_options.h" | 9 #include "content/common/media/media_stream_options.h" |
| 10 | 10 |
| 11 using content::BrowserThread; | 11 using content::BrowserThread; |
| 12 | 12 |
| 13 namespace media_stream { | 13 namespace media_stream { |
| 14 | 14 |
| 15 struct MediaStreamDispatcherHost::StreamRequest { |
| 16 StreamRequest() {} |
| 17 StreamRequest(int render_view_id, int page_request_id) |
| 18 : render_view_id(render_view_id), |
| 19 page_request_id(page_request_id ) { |
| 20 } |
| 21 int render_view_id; |
| 22 // Id of the request generated by MediaStreamDispatcher. |
| 23 int page_request_id; |
| 24 }; |
| 25 |
| 15 MediaStreamDispatcherHost::MediaStreamDispatcherHost( | 26 MediaStreamDispatcherHost::MediaStreamDispatcherHost( |
| 16 const content::ResourceContext* resource_context, int render_process_id) | 27 const content::ResourceContext* resource_context, int render_process_id) |
| 17 : resource_context_(resource_context), | 28 : resource_context_(resource_context), |
| 18 render_process_id_(render_process_id) { | 29 render_process_id_(render_process_id) { |
| 19 } | 30 } |
| 20 | 31 |
| 21 MediaStreamDispatcherHost::~MediaStreamDispatcherHost() { | 32 MediaStreamDispatcherHost::~MediaStreamDispatcherHost() { |
| 22 } | 33 } |
| 23 | 34 |
| 24 MediaStreamManager* MediaStreamDispatcherHost::manager() { | 35 MediaStreamManager* MediaStreamDispatcherHost::manager() { |
| 25 return resource_context_->media_stream_manager(); | 36 return resource_context_->media_stream_manager(); |
| 26 } | 37 } |
| 27 | 38 |
| 28 bool MediaStreamDispatcherHost::OnMessageReceived( | 39 bool MediaStreamDispatcherHost::OnMessageReceived( |
| 29 const IPC::Message& message, bool* message_was_ok) { | 40 const IPC::Message& message, bool* message_was_ok) { |
| 30 bool handled = true; | 41 bool handled = true; |
| 31 IPC_BEGIN_MESSAGE_MAP_EX(MediaStreamDispatcherHost, message, *message_was_ok) | 42 IPC_BEGIN_MESSAGE_MAP_EX(MediaStreamDispatcherHost, message, *message_was_ok) |
| 32 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_GenerateStream, OnGenerateStream) | 43 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_GenerateStream, OnGenerateStream) |
| 33 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_StopGeneratedStream, | 44 IPC_MESSAGE_HANDLER(MediaStreamHostMsg_StopGeneratedStream, |
| 34 OnStopGeneratedStream) | 45 OnStopGeneratedStream) |
| 35 IPC_MESSAGE_UNHANDLED(handled = false) | 46 IPC_MESSAGE_UNHANDLED(handled = false) |
| 36 IPC_END_MESSAGE_MAP_EX() | 47 IPC_END_MESSAGE_MAP_EX() |
| 37 return handled; | 48 return handled; |
| 38 } | 49 } |
| 39 | 50 |
| 40 void MediaStreamDispatcherHost::OnChannelClosing() { | 51 void MediaStreamDispatcherHost::OnChannelClosing() { |
| 41 BrowserMessageFilter::OnChannelClosing(); | 52 BrowserMessageFilter::OnChannelClosing(); |
| 42 VLOG(1) << "MediaStreamDispatcherHost::OnChannelClosing"; | 53 DVLOG(1) << "MediaStreamDispatcherHost::OnChannelClosing"; |
| 43 | 54 |
| 44 // TODO(mflodman) Remove this temporary solution when shut-down issue is | 55 // TODO(mflodman) Remove this temporary solution when shut-down issue is |
| 45 // resolved, i.e. uncomment the code below. | 56 // resolved, i.e. uncomment the code below. |
| 46 // Since the IPC channel is gone, close all requested VideCaptureDevices and | 57 // Since the IPC channel is gone, close all requested VideCaptureDevices and |
| 47 // cancel pending requests. | 58 // cancel pending requests. |
| 48 // manager()->CancelRequests(this); | 59 // manager()->CancelRequests(this); |
| 49 // for (StreamMap::iterator it = streams_.begin(); | 60 // for (StreamMap::iterator it = streams_.begin(); |
| 50 // it != streams_.end(); | 61 // it != streams_.end(); |
| 51 // it++) { | 62 // it++) { |
| 52 // std::string label = it->first; | 63 // std::string label = it->first; |
| 53 // manager()->StopGeneratedStream(label); | 64 // manager()->StopGeneratedStream(label); |
| 54 // } | 65 // } |
| 55 } | 66 } |
| 56 | 67 |
| 57 void MediaStreamDispatcherHost::OnGenerateStream( | 68 void MediaStreamDispatcherHost::OnGenerateStream( |
| 58 int render_view_id, | 69 int render_view_id, |
| 59 int page_request_id, | 70 int page_request_id, |
| 60 const media_stream::StreamOptions& components, | 71 const media_stream::StreamOptions& components, |
| 61 const std::string& security_origin) { | 72 const std::string& security_origin) { |
| 62 VLOG(1) << "MediaStreamDispatcherHost::OnGenerateStream(" | 73 DVLOG(1) << "MediaStreamDispatcherHost::OnGenerateStream(" |
| 63 << render_view_id << ", " | 74 << render_view_id << ", " |
| 64 << page_request_id << ", [ " | 75 << page_request_id << ", [ " |
| 65 << (components.audio ? "audio " : "") | 76 << (components.audio ? "audio " : "") |
| 66 << ((components.video_option & | 77 << ((components.video_option & |
| 67 StreamOptions::kFacingUser) ? | 78 StreamOptions::kFacingUser) ? |
| 68 "video_facing_user " : "") | 79 "video_facing_user " : "") |
| 69 << ((components.video_option & | 80 << ((components.video_option & |
| 70 StreamOptions::kFacingEnvironment) ? | 81 StreamOptions::kFacingEnvironment) ? |
| 71 "video_facing_environment " : "") | 82 "video_facing_environment " : "") |
| 72 << "], " | 83 << "], " |
| 73 << security_origin << ")"; | 84 << security_origin << ")"; |
| 74 | 85 |
| 75 std::string label; | 86 std::string label; |
| 76 manager()->GenerateStream(this, render_process_id_, render_view_id, | 87 manager()->GenerateStream(this, render_process_id_, render_view_id, |
| 77 components, security_origin, &label); | 88 components, security_origin, &label); |
| 78 DCHECK(!label.empty()); | 89 DCHECK(!label.empty()); |
| 79 streams_[label] = StreamRequest(render_view_id, page_request_id); | 90 streams_[label] = StreamRequest(render_view_id, page_request_id); |
| 80 } | 91 } |
| 81 | 92 |
| 82 void MediaStreamDispatcherHost::OnStopGeneratedStream( | 93 void MediaStreamDispatcherHost::OnStopGeneratedStream( |
| 83 int render_view_id, const std::string& label) { | 94 int render_view_id, const std::string& label) { |
| 84 VLOG(1) << "MediaStreamDispatcherHost::OnStopGeneratedStream(" | 95 DVLOG(1) << "MediaStreamDispatcherHost::OnStopGeneratedStream(" |
| 85 << ", {label = " << label << "})"; | 96 << ", {label = " << label << "})"; |
| 86 | 97 |
| 87 StreamMap::iterator it = streams_.find(label); | 98 StreamMap::iterator it = streams_.find(label); |
| 88 DCHECK(it != streams_.end()); | 99 DCHECK(it != streams_.end()); |
| 89 manager()->StopGeneratedStream(label); | 100 manager()->StopGeneratedStream(label); |
| 90 streams_.erase(it); | 101 streams_.erase(it); |
| 91 } | 102 } |
| 92 | 103 |
| 93 void MediaStreamDispatcherHost::StreamGenerated( | 104 void MediaStreamDispatcherHost::StreamGenerated( |
| 94 const std::string& label, | 105 const std::string& label, |
| 95 const StreamDeviceInfoArray& audio_devices, | 106 const StreamDeviceInfoArray& audio_devices, |
| 96 const StreamDeviceInfoArray& video_devices) { | 107 const StreamDeviceInfoArray& video_devices) { |
| 97 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 108 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 98 VLOG(1) << "MediaStreamDispatcherHost::StreamGenerated(" | 109 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerated(" |
| 99 << ", {label = " << label << "})"; | 110 << ", {label = " << label << "})"; |
| 100 | 111 |
| 101 StreamMap::iterator it = streams_.find(label); | 112 StreamMap::iterator it = streams_.find(label); |
| 102 DCHECK(it != streams_.end()); | 113 DCHECK(it != streams_.end()); |
| 103 StreamRequest request = it->second; | 114 StreamRequest request = it->second; |
| 104 | 115 |
| 105 Send(new MediaStreamMsg_StreamGenerated( | 116 Send(new MediaStreamMsg_StreamGenerated( |
| 106 request.render_view_id, request.page_request_id, label, audio_devices, | 117 request.render_view_id, request.page_request_id, label, audio_devices, |
| 107 video_devices)); | 118 video_devices)); |
| 108 } | 119 } |
| 109 | 120 |
| 110 void MediaStreamDispatcherHost::StreamGenerationFailed( | 121 void MediaStreamDispatcherHost::StreamGenerationFailed( |
| 111 const std::string& label) { | 122 const std::string& label) { |
| 112 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 123 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 113 VLOG(1) << "MediaStreamDispatcherHost::StreamGenerationFailed(" | 124 DVLOG(1) << "MediaStreamDispatcherHost::StreamGenerationFailed(" |
| 114 << ", {label = " << label << "})"; | 125 << ", {label = " << label << "})"; |
| 115 | 126 |
| 116 StreamMap::iterator it = streams_.find(label); | 127 StreamMap::iterator it = streams_.find(label); |
| 117 DCHECK(it != streams_.end()); | 128 DCHECK(it != streams_.end()); |
| 118 StreamRequest request = it->second; | 129 StreamRequest request = it->second; |
| 119 streams_.erase(it); | 130 streams_.erase(it); |
| 120 | 131 |
| 121 Send(new MediaStreamMsg_StreamGenerationFailed(request.render_view_id, | 132 Send(new MediaStreamMsg_StreamGenerationFailed(request.render_view_id, |
| 122 request.page_request_id)); | 133 request.page_request_id)); |
| 123 } | 134 } |
| 124 | 135 |
| 125 void MediaStreamDispatcherHost::AudioDeviceFailed(const std::string& label, | 136 void MediaStreamDispatcherHost::AudioDeviceFailed(const std::string& label, |
| 126 int index) { | 137 int index) { |
| 127 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 138 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 128 VLOG(1) << "MediaStreamDispatcherHost::AudioDeviceFailed(" | 139 DVLOG(1) << "MediaStreamDispatcherHost::AudioDeviceFailed(" |
| 129 << ", {label = " << label << "})"; | 140 << ", {label = " << label << "})"; |
| 130 | 141 |
| 131 StreamMap::iterator it = streams_.find(label); | 142 StreamMap::iterator it = streams_.find(label); |
| 132 DCHECK(it != streams_.end()); | 143 DCHECK(it != streams_.end()); |
| 133 StreamRequest request = it->second; | 144 StreamRequest request = it->second; |
| 134 Send(new MediaStreamHostMsg_AudioDeviceFailed(request.render_view_id, | 145 Send(new MediaStreamHostMsg_AudioDeviceFailed(request.render_view_id, |
| 135 label, | 146 label, |
| 136 index)); | 147 index)); |
| 137 } | 148 } |
| 138 | 149 |
| 139 void MediaStreamDispatcherHost::VideoDeviceFailed(const std::string& label, | 150 void MediaStreamDispatcherHost::VideoDeviceFailed(const std::string& label, |
| 140 int index) { | 151 int index) { |
| 141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 152 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 142 VLOG(1) << "MediaStreamDispatcherHost::VideoDeviceFailed(" | 153 DVLOG(1) << "MediaStreamDispatcherHost::VideoDeviceFailed(" |
| 143 << ", {label = " << label << "})"; | 154 << ", {label = " << label << "})"; |
| 144 | 155 |
| 145 StreamMap::iterator it = streams_.find(label); | 156 StreamMap::iterator it = streams_.find(label); |
| 146 DCHECK(it != streams_.end()); | 157 DCHECK(it != streams_.end()); |
| 147 StreamRequest request = it->second; | 158 StreamRequest request = it->second; |
| 148 Send(new MediaStreamHostMsg_VideoDeviceFailed(request.render_view_id, | 159 Send(new MediaStreamHostMsg_VideoDeviceFailed(request.render_view_id, |
| 149 label, | 160 label, |
| 150 index)); | 161 index)); |
| 151 } | 162 } |
| 152 | 163 |
| 153 } // namespace media_stream | 164 } // namespace media_stream |
| OLD | NEW |