| 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 "base/synchronization/waitable_event.h" |
| 8 #include "content/common/child_process.h" | 9 #include "content/common/child_process.h" |
| 9 #include "content/common/media/video_capture_messages.h" | 10 #include "content/common/media/video_capture_messages.h" |
| 10 | 11 |
| 11 VideoCaptureImpl::DIBBuffer::DIBBuffer( | 12 VideoCaptureImpl::DIBBuffer::DIBBuffer( |
| 12 base::SharedMemory* d, media::VideoCapture::VideoFrameBuffer* ptr) | 13 base::SharedMemory* d, media::VideoCapture::VideoFrameBuffer* ptr) |
| 13 : dib(d), | 14 : dib(d), |
| 14 mapped_memory(ptr) {} | 15 mapped_memory(ptr) {} |
| 15 | 16 |
| 16 VideoCaptureImpl::DIBBuffer::~DIBBuffer() { | 17 VideoCaptureImpl::DIBBuffer::~DIBBuffer() { |
| 17 delete dib; | 18 delete dib; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 void VideoCaptureImpl::StartCapture( | 88 void VideoCaptureImpl::StartCapture( |
| 88 media::VideoCapture::EventHandler* handler, | 89 media::VideoCapture::EventHandler* handler, |
| 89 const VideoCaptureCapability& capability) { | 90 const VideoCaptureCapability& capability) { |
| 90 DCHECK_EQ(capability.raw_type, media::VideoFrame::I420); | 91 DCHECK_EQ(capability.raw_type, media::VideoFrame::I420); |
| 91 | 92 |
| 92 ml_proxy_->PostTask(FROM_HERE, | 93 ml_proxy_->PostTask(FROM_HERE, |
| 93 NewRunnableMethod(this, &VideoCaptureImpl::DoStartCapture, handler, | 94 NewRunnableMethod(this, &VideoCaptureImpl::DoStartCapture, handler, |
| 94 capability)); | 95 capability)); |
| 95 } | 96 } |
| 96 | 97 |
| 97 void VideoCaptureImpl::StopCapture(media::VideoCapture::EventHandler* handler) { | 98 void VideoCaptureImpl::StopCapture(media::VideoCapture::EventHandler* handler, |
| 98 ml_proxy_->PostTask(FROM_HERE, | 99 bool need_notification) { |
| 99 NewRunnableMethod(this, &VideoCaptureImpl::DoStopCapture, handler)); | 100 if (need_notification) { |
| 101 ml_proxy_->PostTask(FROM_HERE, |
| 102 NewRunnableMethod(this, &VideoCaptureImpl::DoStopCapture, handler, |
| 103 static_cast<base::WaitableEvent*>(NULL))); |
| 104 } else { |
| 105 base::WaitableEvent completion(false, false); |
| 106 ml_proxy_->PostTask(FROM_HERE, |
| 107 NewRunnableMethod(this, &VideoCaptureImpl::DoStopCapture, handler, |
| 108 &completion)); |
| 109 completion.Wait(); |
| 110 } |
| 100 } | 111 } |
| 101 | 112 |
| 102 void VideoCaptureImpl::FeedBuffer(scoped_refptr<VideoFrameBuffer> buffer) { | 113 void VideoCaptureImpl::FeedBuffer(scoped_refptr<VideoFrameBuffer> buffer) { |
| 103 ml_proxy_->PostTask(FROM_HERE, | 114 ml_proxy_->PostTask(FROM_HERE, |
| 104 NewRunnableMethod(this, &VideoCaptureImpl::DoFeedBuffer, buffer)); | 115 NewRunnableMethod(this, &VideoCaptureImpl::DoFeedBuffer, buffer)); |
| 105 } | 116 } |
| 106 | 117 |
| 107 void VideoCaptureImpl::OnBufferCreated( | 118 void VideoCaptureImpl::OnBufferCreated( |
| 108 base::SharedMemoryHandle handle, | 119 base::SharedMemoryHandle handle, |
| 109 int length, int buffer_id) { | 120 int length, int buffer_id) { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 current_params_.width = capability.width; | 217 current_params_.width = capability.width; |
| 207 current_params_.height = capability.height; | 218 current_params_.height = capability.height; |
| 208 current_params_.frame_per_second = capability.max_fps; | 219 current_params_.frame_per_second = capability.max_fps; |
| 209 DLOG(INFO) << "StartCapture: resolution (" | 220 DLOG(INFO) << "StartCapture: resolution (" |
| 210 << current_params_.width << ", " << current_params_.height << ")"; | 221 << current_params_.width << ", " << current_params_.height << ")"; |
| 211 | 222 |
| 212 StartCaptureInternal(); | 223 StartCaptureInternal(); |
| 213 } | 224 } |
| 214 | 225 |
| 215 void VideoCaptureImpl::DoStopCapture( | 226 void VideoCaptureImpl::DoStopCapture( |
| 216 media::VideoCapture::EventHandler* handler) { | 227 media::VideoCapture::EventHandler* handler, |
| 228 base::WaitableEvent* completion) { |
| 217 DCHECK(ml_proxy_->BelongsToCurrentThread()); | 229 DCHECK(ml_proxy_->BelongsToCurrentThread()); |
| 218 | 230 |
| 219 ClientInfo::iterator it = pending_clients_.find(handler); | 231 ClientInfo::iterator it = pending_clients_.find(handler); |
| 220 if (it != pending_clients_.end()) { | 232 if (it != pending_clients_.end()) { |
| 221 handler->OnStopped(this); | |
| 222 pending_clients_.erase(it); | 233 pending_clients_.erase(it); |
| 234 if (!completion) |
| 235 handler->OnStopped(this); |
| 236 else |
| 237 completion->Signal(); |
| 223 return; | 238 return; |
| 224 } | 239 } |
| 225 | 240 |
| 226 if (clients_.find(handler) == clients_.end()) | 241 if (clients_.find(handler) == clients_.end()) |
| 227 return; | 242 return; |
| 228 | 243 |
| 229 handler->OnStopped(this); | 244 if (!completion) |
| 245 handler->OnStopped(this); |
| 246 else |
| 247 completion->Signal(); |
| 230 clients_.erase(handler); | 248 clients_.erase(handler); |
| 231 master_clients_.remove(handler); | 249 master_clients_.remove(handler); |
| 232 | 250 |
| 233 // Still have at least one master client. | 251 // Still have at least one master client. |
| 234 if (master_clients_.size() > 0) | 252 if (master_clients_.size() > 0) |
| 235 return; | 253 return; |
| 236 | 254 |
| 237 // TODO(wjia): Is it really needed to handle resolution change for non-master | 255 // TODO(wjia): Is it really needed to handle resolution change for non-master |
| 238 // clients, except no client case? | 256 // clients, except no client case? |
| 239 if (clients_.size() > 0) { | 257 if (clients_.size() > 0) { |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 } | 464 } |
| 447 | 465 |
| 448 void VideoCaptureImpl::Send(IPC::Message* message) { | 466 void VideoCaptureImpl::Send(IPC::Message* message) { |
| 449 base::MessageLoopProxy* io_message_loop_proxy = | 467 base::MessageLoopProxy* io_message_loop_proxy = |
| 450 ChildProcess::current()->io_message_loop_proxy(); | 468 ChildProcess::current()->io_message_loop_proxy(); |
| 451 | 469 |
| 452 io_message_loop_proxy->PostTask(FROM_HERE, | 470 io_message_loop_proxy->PostTask(FROM_HERE, |
| 453 NewRunnableMethod(message_filter_.get(), | 471 NewRunnableMethod(message_filter_.get(), |
| 454 &VideoCaptureMessageFilter::Send, message)); | 472 &VideoCaptureMessageFilter::Send, message)); |
| 455 } | 473 } |
| OLD | NEW |