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/renderer/media/video_capture_impl.h" | 5 #include "content/renderer/media/video_capture_impl.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "content/common/child_process.h" | 8 #include "content/common/child_process.h" |
9 #include "content/common/media/video_capture_messages.h" | 9 #include "content/common/media/video_capture_messages.h" |
10 | 10 |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 | 137 |
138 void VideoCaptureImpl::DoStartCapture( | 138 void VideoCaptureImpl::DoStartCapture( |
139 media::VideoCapture::EventHandler* handler, | 139 media::VideoCapture::EventHandler* handler, |
140 const VideoCaptureCapability& capability) { | 140 const VideoCaptureCapability& capability) { |
141 DCHECK(ml_proxy_->BelongsToCurrentThread()); | 141 DCHECK(ml_proxy_->BelongsToCurrentThread()); |
142 | 142 |
143 ClientInfo::iterator it = pending_clients_.find(handler); | 143 ClientInfo::iterator it = pending_clients_.find(handler); |
144 | 144 |
145 if (it != pending_clients_.end()) { | 145 if (it != pending_clients_.end()) { |
146 handler->OnError(this, 1); | 146 handler->OnError(this, 1); |
| 147 handler->OnRemoved(this); |
147 return; | 148 return; |
148 } | 149 } |
149 | 150 |
150 if (!device_id_) { | 151 if (!device_id_) { |
151 pending_clients_[handler] = capability; | 152 pending_clients_[handler] = capability; |
152 return; | 153 return; |
153 } | 154 } |
154 | 155 |
155 if (capability.resolution_fixed && master_clients_.size() && | 156 if (capability.resolution_fixed && master_clients_.size() && |
156 (capability.width != current_params_.width || | 157 (capability.width != current_params_.width || |
157 capability.height != current_params_.height)) { | 158 capability.height != current_params_.height)) { |
158 // Can't have 2 master clients with different resolutions. | 159 // Can't have 2 master clients with different resolutions. |
159 handler->OnError(this, 1); | 160 handler->OnError(this, 1); |
| 161 handler->OnRemoved(this); |
160 return; | 162 return; |
161 } | 163 } |
162 | 164 |
163 clients_[handler] = capability; | 165 clients_[handler] = capability; |
164 if (capability.resolution_fixed) { | 166 if (capability.resolution_fixed) { |
165 master_clients_.push_back(handler); | 167 master_clients_.push_back(handler); |
166 if (master_clients_.size() > 1) | 168 if (master_clients_.size() > 1) |
167 return; | 169 return; |
168 } | 170 } |
169 | 171 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 StartCaptureInternal(); | 214 StartCaptureInternal(); |
213 } | 215 } |
214 | 216 |
215 void VideoCaptureImpl::DoStopCapture( | 217 void VideoCaptureImpl::DoStopCapture( |
216 media::VideoCapture::EventHandler* handler) { | 218 media::VideoCapture::EventHandler* handler) { |
217 DCHECK(ml_proxy_->BelongsToCurrentThread()); | 219 DCHECK(ml_proxy_->BelongsToCurrentThread()); |
218 | 220 |
219 ClientInfo::iterator it = pending_clients_.find(handler); | 221 ClientInfo::iterator it = pending_clients_.find(handler); |
220 if (it != pending_clients_.end()) { | 222 if (it != pending_clients_.end()) { |
221 handler->OnStopped(this); | 223 handler->OnStopped(this); |
| 224 handler->OnRemoved(this); |
222 pending_clients_.erase(it); | 225 pending_clients_.erase(it); |
223 return; | 226 return; |
224 } | 227 } |
225 | 228 |
226 if (clients_.find(handler) == clients_.end()) | 229 if (clients_.find(handler) == clients_.end()) |
227 return; | 230 return; |
228 | 231 |
229 handler->OnStopped(this); | 232 handler->OnStopped(this); |
| 233 handler->OnRemoved(this); |
230 clients_.erase(handler); | 234 clients_.erase(handler); |
231 master_clients_.remove(handler); | 235 master_clients_.remove(handler); |
232 | 236 |
233 // Still have at least one master client. | 237 // Still have at least one master client. |
234 if (master_clients_.size() > 0) | 238 if (master_clients_.size() > 0) |
235 return; | 239 return; |
236 | 240 |
237 // TODO(wjia): Is it really needed to handle resolution change for non-master | 241 // TODO(wjia): Is it really needed to handle resolution change for non-master |
238 // clients, except no client case? | 242 // clients, except no client case? |
239 if (clients_.size() > 0) { | 243 if (clients_.size() > 0) { |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 for (ClientInfo::iterator it = clients_.begin(); | 365 for (ClientInfo::iterator it = clients_.begin(); |
362 it != clients_.end(); it++) { | 366 it != clients_.end(); it++) { |
363 it->first->OnPaused(this); | 367 it->first->OnPaused(this); |
364 } | 368 } |
365 break; | 369 break; |
366 case media::VideoCapture::kError: | 370 case media::VideoCapture::kError: |
367 for (ClientInfo::iterator it = clients_.begin(); | 371 for (ClientInfo::iterator it = clients_.begin(); |
368 it != clients_.end(); it++) { | 372 it != clients_.end(); it++) { |
369 // TODO(wjia): browser process would send error code. | 373 // TODO(wjia): browser process would send error code. |
370 it->first->OnError(this, 1); | 374 it->first->OnError(this, 1); |
| 375 it->first->OnRemoved(this); |
371 } | 376 } |
| 377 clients_.clear(); |
| 378 master_clients_.clear(); |
| 379 state_ = kStopped; |
| 380 current_params_.width = current_params_.height = 0; |
372 break; | 381 break; |
373 default: | 382 default: |
374 break; | 383 break; |
375 } | 384 } |
376 } | 385 } |
377 | 386 |
378 void VideoCaptureImpl::DoDeviceInfoReceived( | 387 void VideoCaptureImpl::DoDeviceInfoReceived( |
379 const media::VideoCaptureParams& device_info) { | 388 const media::VideoCaptureParams& device_info) { |
380 DCHECK(ml_proxy_->BelongsToCurrentThread()); | 389 DCHECK(ml_proxy_->BelongsToCurrentThread()); |
381 | 390 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 } | 455 } |
447 | 456 |
448 void VideoCaptureImpl::Send(IPC::Message* message) { | 457 void VideoCaptureImpl::Send(IPC::Message* message) { |
449 base::MessageLoopProxy* io_message_loop_proxy = | 458 base::MessageLoopProxy* io_message_loop_proxy = |
450 ChildProcess::current()->io_message_loop_proxy(); | 459 ChildProcess::current()->io_message_loop_proxy(); |
451 | 460 |
452 io_message_loop_proxy->PostTask(FROM_HERE, | 461 io_message_loop_proxy->PostTask(FROM_HERE, |
453 NewRunnableMethod(message_filter_.get(), | 462 NewRunnableMethod(message_filter_.get(), |
454 &VideoCaptureMessageFilter::Send, message)); | 463 &VideoCaptureMessageFilter::Send, message)); |
455 } | 464 } |
OLD | NEW |