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 "content/common/child_process.h" | 7 #include "content/common/child_process.h" |
8 #include "content/common/video_capture_messages.h" | 8 #include "content/common/video_capture_messages.h" |
9 | 9 |
10 VideoCaptureImpl::DIBBuffer::DIBBuffer( | 10 VideoCaptureImpl::DIBBuffer::DIBBuffer( |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 io_message_loop_proxy->PostTask(FROM_HERE, | 61 io_message_loop_proxy->PostTask(FROM_HERE, |
62 NewRunnableMethod(this, &VideoCaptureImpl::AddDelegateOnIOThread)); | 62 NewRunnableMethod(this, &VideoCaptureImpl::AddDelegateOnIOThread)); |
63 return; | 63 return; |
64 } | 64 } |
65 | 65 |
66 AddDelegateOnIOThread(); | 66 AddDelegateOnIOThread(); |
67 } | 67 } |
68 | 68 |
69 void VideoCaptureImpl::DeInit(Task* task) { | 69 void VideoCaptureImpl::DeInit(Task* task) { |
70 if (state_ == kStarted) | 70 if (state_ == kStarted) |
71 message_filter_->Send(new VideoCaptureHostMsg_Stop(0, device_id_)); | 71 Send(new VideoCaptureHostMsg_Stop(0, device_id_)); |
72 | 72 |
73 base::MessageLoopProxy* io_message_loop_proxy = | 73 base::MessageLoopProxy* io_message_loop_proxy = |
74 ChildProcess::current()->io_message_loop_proxy(); | 74 ChildProcess::current()->io_message_loop_proxy(); |
75 | 75 |
76 if (!io_message_loop_proxy->BelongsToCurrentThread()) { | 76 if (!io_message_loop_proxy->BelongsToCurrentThread()) { |
77 io_message_loop_proxy->PostTask(FROM_HERE, | 77 io_message_loop_proxy->PostTask(FROM_HERE, |
78 NewRunnableMethod(this, &VideoCaptureImpl::RemoveDelegateOnIOThread, | 78 NewRunnableMethod(this, &VideoCaptureImpl::RemoveDelegateOnIOThread, |
79 task)); | 79 task)); |
80 return; | 80 return; |
81 } | 81 } |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 void VideoCaptureImpl::OnBufferReceived(TransportDIB::Handle handle, | 222 void VideoCaptureImpl::OnBufferReceived(TransportDIB::Handle handle, |
223 base::Time timestamp) { | 223 base::Time timestamp) { |
224 if (!ml_proxy_->BelongsToCurrentThread()) { | 224 if (!ml_proxy_->BelongsToCurrentThread()) { |
225 ml_proxy_->PostTask(FROM_HERE, | 225 ml_proxy_->PostTask(FROM_HERE, |
226 NewRunnableMethod(this, &VideoCaptureImpl::OnBufferReceived, | 226 NewRunnableMethod(this, &VideoCaptureImpl::OnBufferReceived, |
227 handle, timestamp)); | 227 handle, timestamp)); |
228 return; | 228 return; |
229 } | 229 } |
230 | 230 |
231 if (state_ != kStarted) { | 231 if (state_ != kStarted) { |
232 message_filter_->Send( | 232 Send(new VideoCaptureHostMsg_BufferReady(0, device_id_, handle)); |
233 new VideoCaptureHostMsg_BufferReady(0, device_id_, handle)); | |
234 return; | 233 return; |
235 } | 234 } |
236 | 235 |
237 media::VideoCapture::VideoFrameBuffer* buffer; | 236 media::VideoCapture::VideoFrameBuffer* buffer; |
238 CachedDIB::iterator it; | 237 CachedDIB::iterator it; |
239 for (it = cached_dibs_.begin(); it != cached_dibs_.end(); it++) { | 238 for (it = cached_dibs_.begin(); it != cached_dibs_.end(); it++) { |
240 if ((*it)->dib->handle() == handle) | 239 if ((*it)->dib->handle() == handle) |
241 break; | 240 break; |
242 } | 241 } |
243 if (it == cached_dibs_.end()) { | 242 if (it == cached_dibs_.end()) { |
244 TransportDIB* dib = TransportDIB::Map(handle); | 243 TransportDIB* dib = TransportDIB::Map(handle); |
245 buffer = new VideoFrameBuffer(); | 244 buffer = new VideoFrameBuffer(); |
246 buffer->memory_pointer = dib->memory(); | 245 buffer->memory_pointer = dib->memory(); |
247 buffer->buffer_size = dib->size(); | 246 buffer->buffer_size = dib->size(); |
248 buffer->width = width_; | 247 buffer->width = width_; |
249 buffer->height = height_; | 248 buffer->height = height_; |
250 | 249 |
251 DIBBuffer* dib_buffer = new DIBBuffer(dib, buffer); | 250 DIBBuffer* dib_buffer = new DIBBuffer(dib, buffer); |
252 cached_dibs_.push_back(dib_buffer); | 251 cached_dibs_.push_back(dib_buffer); |
253 } else { | 252 } else { |
254 buffer = (*it)->mapped_memory; | 253 buffer = (*it)->mapped_memory; |
255 } | 254 } |
256 | 255 |
257 // TODO(wjia): handle buffer sharing with downstream modules. | 256 // TODO(wjia): handle buffer sharing with downstream modules. |
258 for (ClientInfo::iterator it = clients_.begin(); it != clients_.end(); it++) { | 257 for (ClientInfo::iterator it = clients_.begin(); it != clients_.end(); it++) { |
259 it->first->OnBufferReady(this, buffer); | 258 it->first->OnBufferReady(this, buffer); |
260 } | 259 } |
261 | 260 |
262 message_filter_->Send( | 261 Send(new VideoCaptureHostMsg_BufferReady(0, device_id_, handle)); |
263 new VideoCaptureHostMsg_BufferReady(0, device_id_, handle)); | |
264 } | 262 } |
265 | 263 |
266 void VideoCaptureImpl::OnStateChanged( | 264 void VideoCaptureImpl::OnStateChanged( |
267 const media::VideoCapture::State& state) { | 265 const media::VideoCapture::State& state) { |
268 if (!ml_proxy_->BelongsToCurrentThread()) { | 266 if (!ml_proxy_->BelongsToCurrentThread()) { |
269 ml_proxy_->PostTask(FROM_HERE, | 267 ml_proxy_->PostTask(FROM_HERE, |
270 NewRunnableMethod(this, &VideoCaptureImpl::OnStateChanged, state)); | 268 NewRunnableMethod(this, &VideoCaptureImpl::OnStateChanged, state)); |
271 return; | 269 return; |
272 } | 270 } |
273 | 271 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 | 333 |
336 void VideoCaptureImpl::StopDevice() { | 334 void VideoCaptureImpl::StopDevice() { |
337 if (!ml_proxy_->BelongsToCurrentThread()) { | 335 if (!ml_proxy_->BelongsToCurrentThread()) { |
338 ml_proxy_->PostTask(FROM_HERE, | 336 ml_proxy_->PostTask(FROM_HERE, |
339 NewRunnableMethod(this, &VideoCaptureImpl::StopDevice)); | 337 NewRunnableMethod(this, &VideoCaptureImpl::StopDevice)); |
340 return; | 338 return; |
341 } | 339 } |
342 | 340 |
343 if (state_ == kStarted) { | 341 if (state_ == kStarted) { |
344 state_ = kStopping; | 342 state_ = kStopping; |
345 message_filter_->Send(new VideoCaptureHostMsg_Stop(0, device_id_)); | 343 Send(new VideoCaptureHostMsg_Stop(0, device_id_)); |
346 width_ = height_ = 0; | 344 width_ = height_ = 0; |
347 } | 345 } |
348 } | 346 } |
349 | 347 |
350 void VideoCaptureImpl::RestartCapture() { | 348 void VideoCaptureImpl::RestartCapture() { |
351 DCHECK(ml_proxy_->BelongsToCurrentThread()); | 349 DCHECK(ml_proxy_->BelongsToCurrentThread()); |
352 DCHECK_EQ(state_, kStopped); | 350 DCHECK_EQ(state_, kStopped); |
353 | 351 |
354 width_ = new_width_; | 352 width_ = new_width_; |
355 height_ = new_height_; | 353 height_ = new_height_; |
356 new_width_ = 0; | 354 new_width_ = 0; |
357 new_height_ = 0; | 355 new_height_ = 0; |
358 | 356 |
359 DLOG(INFO) << "RestartCapture, " << width_ << ", " << height_; | 357 DLOG(INFO) << "RestartCapture, " << width_ << ", " << height_; |
360 StartCaptureInternal(); | 358 StartCaptureInternal(); |
361 } | 359 } |
362 | 360 |
363 void VideoCaptureImpl::StartCaptureInternal() { | 361 void VideoCaptureImpl::StartCaptureInternal() { |
364 DCHECK(ml_proxy_->BelongsToCurrentThread()); | 362 DCHECK(ml_proxy_->BelongsToCurrentThread()); |
365 DCHECK(device_id_); | 363 DCHECK(device_id_); |
366 | 364 |
367 media::VideoCaptureParams params; | 365 media::VideoCaptureParams params; |
368 params.width = width_; | 366 params.width = width_; |
369 params.height = height_; | 367 params.height = height_; |
370 params.session_id = session_id_; | 368 params.session_id = session_id_; |
371 | 369 |
372 message_filter_->Send(new VideoCaptureHostMsg_Start(0, device_id_, params)); | 370 Send(new VideoCaptureHostMsg_Start(0, device_id_, params)); |
373 state_ = kStarted; | 371 state_ = kStarted; |
374 for (ClientInfo::iterator it = clients_.begin(); it != clients_.end(); it++) { | 372 for (ClientInfo::iterator it = clients_.begin(); it != clients_.end(); it++) { |
375 it->first->OnStarted(this); | 373 it->first->OnStarted(this); |
376 } | 374 } |
377 } | 375 } |
378 | 376 |
379 void VideoCaptureImpl::AddDelegateOnIOThread() { | 377 void VideoCaptureImpl::AddDelegateOnIOThread() { |
380 message_filter_->AddDelegate(this); | 378 message_filter_->AddDelegate(this); |
381 } | 379 } |
382 | 380 |
383 void VideoCaptureImpl::RemoveDelegateOnIOThread(Task* task) { | 381 void VideoCaptureImpl::RemoveDelegateOnIOThread(Task* task) { |
384 base::ScopedTaskRunner task_runner(task); | 382 base::ScopedTaskRunner task_runner(task); |
385 message_filter_->RemoveDelegate(this); | 383 message_filter_->RemoveDelegate(this); |
386 } | 384 } |
| 385 |
| 386 void VideoCaptureImpl::Send(IPC::Message* message) { |
| 387 base::MessageLoopProxy* io_message_loop_proxy = |
| 388 ChildProcess::current()->io_message_loop_proxy(); |
| 389 |
| 390 io_message_loop_proxy->PostTask(FROM_HERE, |
| 391 NewRunnableMethod(message_filter_.get(), |
| 392 &VideoCaptureMessageFilter::Send, message)); |
| 393 } |
OLD | NEW |