| 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/browser/renderer_host/media/video_capture_host.h" | 5 #include "content/browser/renderer_host/media/video_capture_host.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "content/browser/browser_main_loop.h" | 9 #include "content/browser/browser_main_loop.h" |
| 10 #include "content/browser/renderer_host/media/media_stream_manager.h" | 10 #include "content/browser/renderer_host/media/media_stream_manager.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 const VideoCaptureControllerID& controller_id, | 50 const VideoCaptureControllerID& controller_id, |
| 51 base::SharedMemoryHandle handle, | 51 base::SharedMemoryHandle handle, |
| 52 int length, | 52 int length, |
| 53 int buffer_id) { | 53 int buffer_id) { |
| 54 BrowserThread::PostTask( | 54 BrowserThread::PostTask( |
| 55 BrowserThread::IO, FROM_HERE, | 55 BrowserThread::IO, FROM_HERE, |
| 56 base::Bind(&VideoCaptureHost::DoSendNewBufferOnIOThread, | 56 base::Bind(&VideoCaptureHost::DoSendNewBufferOnIOThread, |
| 57 this, controller_id, handle, length, buffer_id)); | 57 this, controller_id, handle, length, buffer_id)); |
| 58 } | 58 } |
| 59 | 59 |
| 60 void VideoCaptureHost::OnBufferDestroyed( |
| 61 const VideoCaptureControllerID& controller_id, |
| 62 int buffer_id) { |
| 63 BrowserThread::PostTask( |
| 64 BrowserThread::IO, FROM_HERE, |
| 65 base::Bind(&VideoCaptureHost::DoSendFreeBufferOnIOThread, |
| 66 this, controller_id, buffer_id)); |
| 67 } |
| 68 |
| 60 void VideoCaptureHost::OnBufferReady( | 69 void VideoCaptureHost::OnBufferReady( |
| 61 const VideoCaptureControllerID& controller_id, | 70 const VideoCaptureControllerID& controller_id, |
| 62 int buffer_id, | 71 int buffer_id, |
| 63 base::Time timestamp) { | 72 base::Time timestamp, |
| 73 const media::VideoCaptureFormat& frame_format) { |
| 64 BrowserThread::PostTask( | 74 BrowserThread::PostTask( |
| 65 BrowserThread::IO, FROM_HERE, | 75 BrowserThread::IO, FROM_HERE, |
| 66 base::Bind(&VideoCaptureHost::DoSendFilledBufferOnIOThread, | 76 base::Bind(&VideoCaptureHost::DoSendFilledBufferOnIOThread, |
| 67 this, controller_id, buffer_id, timestamp)); | 77 this, controller_id, buffer_id, timestamp, |
| 68 } | 78 frame_format)); |
| 69 | |
| 70 void VideoCaptureHost::OnFrameInfo( | |
| 71 const VideoCaptureControllerID& controller_id, | |
| 72 const media::VideoCaptureCapability& format) { | |
| 73 BrowserThread::PostTask( | |
| 74 BrowserThread::IO, | |
| 75 FROM_HERE, | |
| 76 base::Bind(&VideoCaptureHost::DoSendFrameInfoOnIOThread, | |
| 77 this, controller_id, format)); | |
| 78 } | |
| 79 | |
| 80 void VideoCaptureHost::OnFrameInfoChanged( | |
| 81 const VideoCaptureControllerID& controller_id, | |
| 82 int width, | |
| 83 int height, | |
| 84 int frame_rate) { | |
| 85 BrowserThread::PostTask( | |
| 86 BrowserThread::IO, FROM_HERE, | |
| 87 base::Bind(&VideoCaptureHost::DoSendFrameInfoChangedOnIOThread, | |
| 88 this, controller_id, width, height, frame_rate)); | |
| 89 } | 79 } |
| 90 | 80 |
| 91 void VideoCaptureHost::OnEnded(const VideoCaptureControllerID& controller_id) { | 81 void VideoCaptureHost::OnEnded(const VideoCaptureControllerID& controller_id) { |
| 92 DVLOG(1) << "VideoCaptureHost::OnEnded"; | 82 DVLOG(1) << "VideoCaptureHost::OnEnded"; |
| 93 BrowserThread::PostTask( | 83 BrowserThread::PostTask( |
| 94 BrowserThread::IO, FROM_HERE, | 84 BrowserThread::IO, FROM_HERE, |
| 95 base::Bind(&VideoCaptureHost::DoEndedOnIOThread, this, controller_id)); | 85 base::Bind(&VideoCaptureHost::DoEndedOnIOThread, this, controller_id)); |
| 96 } | 86 } |
| 97 | 87 |
| 98 void VideoCaptureHost::DoSendNewBufferOnIOThread( | 88 void VideoCaptureHost::DoSendNewBufferOnIOThread( |
| 99 const VideoCaptureControllerID& controller_id, | 89 const VideoCaptureControllerID& controller_id, |
| 100 base::SharedMemoryHandle handle, | 90 base::SharedMemoryHandle handle, |
| 101 int length, | 91 int length, |
| 102 int buffer_id) { | 92 int buffer_id) { |
| 103 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 93 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 104 | 94 |
| 105 if (entries_.find(controller_id) == entries_.end()) | 95 if (entries_.find(controller_id) == entries_.end()) |
| 106 return; | 96 return; |
| 107 | 97 |
| 108 Send(new VideoCaptureMsg_NewBuffer(controller_id.device_id, handle, | 98 Send(new VideoCaptureMsg_NewBuffer(controller_id.device_id, handle, |
| 109 length, buffer_id)); | 99 length, buffer_id)); |
| 110 } | 100 } |
| 111 | 101 |
| 102 void VideoCaptureHost::DoSendFreeBufferOnIOThread( |
| 103 const VideoCaptureControllerID& controller_id, |
| 104 int buffer_id) { |
| 105 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 106 |
| 107 if (entries_.find(controller_id) == entries_.end()) |
| 108 return; |
| 109 |
| 110 Send(new VideoCaptureMsg_FreeBuffer(controller_id.device_id, buffer_id)); |
| 111 } |
| 112 |
| 112 void VideoCaptureHost::DoSendFilledBufferOnIOThread( | 113 void VideoCaptureHost::DoSendFilledBufferOnIOThread( |
| 113 const VideoCaptureControllerID& controller_id, | 114 const VideoCaptureControllerID& controller_id, |
| 114 int buffer_id, base::Time timestamp) { | 115 int buffer_id, base::Time timestamp, |
| 116 const media::VideoCaptureFormat& format) { |
| 115 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 117 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 116 | 118 |
| 117 if (entries_.find(controller_id) == entries_.end()) | 119 if (entries_.find(controller_id) == entries_.end()) |
| 118 return; | 120 return; |
| 119 | 121 |
| 120 Send(new VideoCaptureMsg_BufferReady(controller_id.device_id, buffer_id, | 122 Send(new VideoCaptureMsg_BufferReady(controller_id.device_id, buffer_id, |
| 121 timestamp)); | 123 timestamp, format)); |
| 122 } | 124 } |
| 123 | 125 |
| 124 void VideoCaptureHost::DoHandleErrorOnIOThread( | 126 void VideoCaptureHost::DoHandleErrorOnIOThread( |
| 125 const VideoCaptureControllerID& controller_id) { | 127 const VideoCaptureControllerID& controller_id) { |
| 126 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 128 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 127 | 129 |
| 128 if (entries_.find(controller_id) == entries_.end()) | 130 if (entries_.find(controller_id) == entries_.end()) |
| 129 return; | 131 return; |
| 130 | 132 |
| 131 Send(new VideoCaptureMsg_StateChanged(controller_id.device_id, | 133 Send(new VideoCaptureMsg_StateChanged(controller_id.device_id, |
| 132 VIDEO_CAPTURE_STATE_ERROR)); | 134 VIDEO_CAPTURE_STATE_ERROR)); |
| 133 DeleteVideoCaptureControllerOnIOThread(controller_id); | 135 DeleteVideoCaptureControllerOnIOThread(controller_id); |
| 134 } | 136 } |
| 135 | 137 |
| 136 void VideoCaptureHost::DoEndedOnIOThread( | 138 void VideoCaptureHost::DoEndedOnIOThread( |
| 137 const VideoCaptureControllerID& controller_id) { | 139 const VideoCaptureControllerID& controller_id) { |
| 138 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 140 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 139 DVLOG(1) << "VideoCaptureHost::DoEndedOnIOThread"; | 141 DVLOG(1) << "VideoCaptureHost::DoEndedOnIOThread"; |
| 140 if (entries_.find(controller_id) == entries_.end()) | 142 if (entries_.find(controller_id) == entries_.end()) |
| 141 return; | 143 return; |
| 142 | 144 |
| 143 Send(new VideoCaptureMsg_StateChanged(controller_id.device_id, | 145 Send(new VideoCaptureMsg_StateChanged(controller_id.device_id, |
| 144 VIDEO_CAPTURE_STATE_ENDED)); | 146 VIDEO_CAPTURE_STATE_ENDED)); |
| 145 DeleteVideoCaptureControllerOnIOThread(controller_id); | 147 DeleteVideoCaptureControllerOnIOThread(controller_id); |
| 146 } | 148 } |
| 147 | 149 |
| 148 void VideoCaptureHost::DoSendFrameInfoOnIOThread( | |
| 149 const VideoCaptureControllerID& controller_id, | |
| 150 const media::VideoCaptureCapability& format) { | |
| 151 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 152 | |
| 153 if (entries_.find(controller_id) == entries_.end()) | |
| 154 return; | |
| 155 | |
| 156 media::VideoCaptureParams params; | |
| 157 params.width = format.width; | |
| 158 params.height = format.height; | |
| 159 params.frame_rate = format.frame_rate; | |
| 160 params.frame_size_type = format.frame_size_type; | |
| 161 Send(new VideoCaptureMsg_DeviceInfo(controller_id.device_id, params)); | |
| 162 Send(new VideoCaptureMsg_StateChanged(controller_id.device_id, | |
| 163 VIDEO_CAPTURE_STATE_STARTED)); | |
| 164 } | |
| 165 | |
| 166 void VideoCaptureHost::DoSendFrameInfoChangedOnIOThread( | |
| 167 const VideoCaptureControllerID& controller_id, | |
| 168 int width, | |
| 169 int height, | |
| 170 int frame_rate) { | |
| 171 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 172 | |
| 173 if (entries_.find(controller_id) == entries_.end()) | |
| 174 return; | |
| 175 | |
| 176 media::VideoCaptureParams params; | |
| 177 params.width = width; | |
| 178 params.height = height; | |
| 179 params.frame_rate = frame_rate; | |
| 180 Send(new VideoCaptureMsg_DeviceInfoChanged(controller_id.device_id, params)); | |
| 181 } | |
| 182 | |
| 183 /////////////////////////////////////////////////////////////////////////////// | 150 /////////////////////////////////////////////////////////////////////////////// |
| 184 // IPC Messages handler. | 151 // IPC Messages handler. |
| 185 bool VideoCaptureHost::OnMessageReceived(const IPC::Message& message, | 152 bool VideoCaptureHost::OnMessageReceived(const IPC::Message& message, |
| 186 bool* message_was_ok) { | 153 bool* message_was_ok) { |
| 187 bool handled = true; | 154 bool handled = true; |
| 188 IPC_BEGIN_MESSAGE_MAP_EX(VideoCaptureHost, message, *message_was_ok) | 155 IPC_BEGIN_MESSAGE_MAP_EX(VideoCaptureHost, message, *message_was_ok) |
| 189 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Start, OnStartCapture) | 156 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Start, OnStartCapture) |
| 190 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Pause, OnPauseCapture) | 157 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Pause, OnPauseCapture) |
| 191 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Stop, OnStopCapture) | 158 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Stop, OnStopCapture) |
| 192 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_BufferReady, OnReceiveEmptyBuffer) | 159 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_BufferReady, OnReceiveEmptyBuffer) |
| 193 IPC_MESSAGE_UNHANDLED(handled = false) | 160 IPC_MESSAGE_UNHANDLED(handled = false) |
| 194 IPC_END_MESSAGE_MAP_EX() | 161 IPC_END_MESSAGE_MAP_EX() |
| 195 | 162 |
| 196 return handled; | 163 return handled; |
| 197 } | 164 } |
| 198 | 165 |
| 199 void VideoCaptureHost::OnStartCapture(int device_id, | 166 void VideoCaptureHost::OnStartCapture(int device_id, |
| 200 const media::VideoCaptureParams& params) { | 167 const media::VideoCaptureParams& params) { |
| 201 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 168 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 202 DVLOG(1) << "VideoCaptureHost::OnStartCapture, device_id " << device_id | 169 DVLOG(1) << "VideoCaptureHost::OnStartCapture, device_id " << device_id |
| 203 << ", (" << params.width << ", " << params.height << ", " | 170 << ", (" << params.requested_format.width |
| 204 << params.frame_rate << ", " << params.session_id | 171 << ", " << params.requested_format.height |
| 205 << ", variable resolution device:" | 172 << ", " << params.requested_format.frame_rate |
| 206 << ((params.frame_size_type == | 173 << ", " << params.session_id << ", variable resolution device:" |
| 174 << ((params.requested_format.frame_size_type == |
| 207 media::VariableResolutionVideoCaptureDevice) ? "yes" : "no") | 175 media::VariableResolutionVideoCaptureDevice) ? "yes" : "no") |
| 208 << ")"; | 176 << ")"; |
| 209 VideoCaptureControllerID controller_id(device_id); | 177 VideoCaptureControllerID controller_id(device_id); |
| 210 DCHECK(entries_.find(controller_id) == entries_.end()); | 178 DCHECK(entries_.find(controller_id) == entries_.end()); |
| 211 | 179 |
| 212 entries_[controller_id] = base::WeakPtr<VideoCaptureController>(); | 180 entries_[controller_id] = base::WeakPtr<VideoCaptureController>(); |
| 213 media_stream_manager_->video_capture_manager()->StartCaptureForClient( | 181 media_stream_manager_->video_capture_manager()->StartCaptureForClient( |
| 214 params, PeerHandle(), controller_id, this, base::Bind( | 182 params, PeerHandle(), controller_id, this, base::Bind( |
| 215 &VideoCaptureHost::OnControllerAdded, this, device_id, params)); | 183 &VideoCaptureHost::OnControllerAdded, this, device_id, params)); |
| 216 } | 184 } |
| 217 | 185 |
| 218 void VideoCaptureHost::OnControllerAdded( | 186 void VideoCaptureHost::OnControllerAdded( |
| 219 int device_id, const media::VideoCaptureParams& params, | 187 int device_id, const media::VideoCaptureParams& params, |
| 220 const base::WeakPtr<VideoCaptureController>& controller) { | 188 const base::WeakPtr<VideoCaptureController>& controller) { |
| 221 BrowserThread::PostTask( | 189 BrowserThread::PostTask( |
| 222 BrowserThread::IO, FROM_HERE, | 190 BrowserThread::IO, FROM_HERE, |
| 223 base::Bind(&VideoCaptureHost::DoControllerAddedOnIOThread, | 191 base::Bind(&VideoCaptureHost::DoControllerAddedOnIOThread, |
| 224 this, device_id, params, controller)); | 192 this, device_id, params, controller)); |
| 225 } | 193 } |
| 226 | 194 |
| 227 void VideoCaptureHost::DoControllerAddedOnIOThread( | 195 void VideoCaptureHost::DoControllerAddedOnIOThread( |
| 228 int device_id, const media::VideoCaptureParams params, | 196 int device_id, const media::VideoCaptureParams& params, |
| 229 const base::WeakPtr<VideoCaptureController>& controller) { | 197 const base::WeakPtr<VideoCaptureController>& controller) { |
| 230 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 198 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 231 VideoCaptureControllerID controller_id(device_id); | 199 VideoCaptureControllerID controller_id(device_id); |
| 232 EntryMap::iterator it = entries_.find(controller_id); | 200 EntryMap::iterator it = entries_.find(controller_id); |
| 233 if (it == entries_.end()) { | 201 if (it == entries_.end()) { |
| 234 if (controller) { | 202 if (controller) { |
| 235 media_stream_manager_->video_capture_manager()->StopCaptureForClient( | 203 media_stream_manager_->video_capture_manager()->StopCaptureForClient( |
| 236 controller.get(), controller_id, this); | 204 controller.get(), controller_id, this); |
| 237 } | 205 } |
| 238 return; | 206 return; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 return; | 256 return; |
| 289 | 257 |
| 290 if (it->second) { | 258 if (it->second) { |
| 291 media_stream_manager_->video_capture_manager()->StopCaptureForClient( | 259 media_stream_manager_->video_capture_manager()->StopCaptureForClient( |
| 292 it->second.get(), controller_id, this); | 260 it->second.get(), controller_id, this); |
| 293 } | 261 } |
| 294 entries_.erase(it); | 262 entries_.erase(it); |
| 295 } | 263 } |
| 296 | 264 |
| 297 } // namespace content | 265 } // namespace content |
| OLD | NEW |