| Index: trunk/src/content/renderer/media/video_capture_impl.cc
|
| ===================================================================
|
| --- trunk/src/content/renderer/media/video_capture_impl.cc (revision 244357)
|
| +++ trunk/src/content/renderer/media/video_capture_impl.cc (working copy)
|
| @@ -42,9 +42,11 @@
|
|
|
| VideoCaptureImpl::VideoCaptureImpl(
|
| const media::VideoCaptureSessionId session_id,
|
| + base::MessageLoopProxy* capture_message_loop_proxy,
|
| VideoCaptureMessageFilter* filter)
|
| : VideoCapture(),
|
| message_filter_(filter),
|
| + capture_message_loop_proxy_(capture_message_loop_proxy),
|
| io_message_loop_proxy_(ChildProcess::current()->io_message_loop_proxy()),
|
| device_id_(0),
|
| session_id_(session_id),
|
| @@ -57,62 +59,90 @@
|
| VideoCaptureImpl::~VideoCaptureImpl() {}
|
|
|
| void VideoCaptureImpl::Init() {
|
| - io_message_loop_proxy_->PostTask(FROM_HERE,
|
| - base::Bind(&VideoCaptureImpl::InitOnIOThread,
|
| - base::Unretained(this)));
|
| + if (!io_message_loop_proxy_->BelongsToCurrentThread()) {
|
| + io_message_loop_proxy_->PostTask(FROM_HERE,
|
| + base::Bind(&VideoCaptureImpl::AddDelegateOnIOThread,
|
| + base::Unretained(this)));
|
| + } else {
|
| + AddDelegateOnIOThread();
|
| + }
|
| }
|
|
|
| -void VideoCaptureImpl::DeInit(base::Closure done_cb) {
|
| - io_message_loop_proxy_->PostTask(FROM_HERE,
|
| - base::Bind(&VideoCaptureImpl::DeInitOnIOThread,
|
| - base::Unretained(this),
|
| - done_cb));
|
| +void VideoCaptureImpl::DeInit(base::Closure task) {
|
| + capture_message_loop_proxy_->PostTask(FROM_HERE,
|
| + base::Bind(&VideoCaptureImpl::DoDeInitOnCaptureThread,
|
| + base::Unretained(this), task));
|
| }
|
|
|
| -void VideoCaptureImpl::SuspendCapture(bool suspend) {
|
| - io_message_loop_proxy_->PostTask(FROM_HERE,
|
| - base::Bind(&VideoCaptureImpl::SuspendCaptureOnIOThread,
|
| - base::Unretained(this),
|
| - suspend));
|
| -}
|
| -
|
| void VideoCaptureImpl::StartCapture(
|
| media::VideoCapture::EventHandler* handler,
|
| const media::VideoCaptureParams& params) {
|
| - io_message_loop_proxy_->PostTask(FROM_HERE,
|
| - base::Bind(&VideoCaptureImpl::StartCaptureOnIOThread,
|
| + capture_message_loop_proxy_->PostTask(FROM_HERE,
|
| + base::Bind(&VideoCaptureImpl::DoStartCaptureOnCaptureThread,
|
| base::Unretained(this), handler, params));
|
| }
|
|
|
| -void VideoCaptureImpl::StopCapture(
|
| - media::VideoCapture::EventHandler* handler) {
|
| - io_message_loop_proxy_->PostTask(FROM_HERE,
|
| - base::Bind(&VideoCaptureImpl::StopCaptureOnIOThread,
|
| +void VideoCaptureImpl::StopCapture(media::VideoCapture::EventHandler* handler) {
|
| + capture_message_loop_proxy_->PostTask(FROM_HERE,
|
| + base::Bind(&VideoCaptureImpl::DoStopCaptureOnCaptureThread,
|
| base::Unretained(this), handler));
|
| }
|
|
|
| -void VideoCaptureImpl::InitOnIOThread() {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| - message_filter_->AddDelegate(this);
|
| +void VideoCaptureImpl::OnBufferCreated(
|
| + base::SharedMemoryHandle handle,
|
| + int length, int buffer_id) {
|
| + capture_message_loop_proxy_->PostTask(FROM_HERE,
|
| + base::Bind(&VideoCaptureImpl::DoBufferCreatedOnCaptureThread,
|
| + base::Unretained(this), handle, length, buffer_id));
|
| }
|
|
|
| -void VideoCaptureImpl::DeInitOnIOThread(base::Closure done_cb) {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| +void VideoCaptureImpl::OnBufferDestroyed(int buffer_id) {
|
| + capture_message_loop_proxy_->PostTask(FROM_HERE,
|
| + base::Bind(&VideoCaptureImpl::DoBufferDestroyedOnCaptureThread,
|
| + base::Unretained(this), buffer_id));
|
| +}
|
| +
|
| +void VideoCaptureImpl::OnBufferReceived(
|
| + int buffer_id,
|
| + base::TimeTicks timestamp,
|
| + const media::VideoCaptureFormat& format) {
|
| + capture_message_loop_proxy_->PostTask(FROM_HERE,
|
| + base::Bind(&VideoCaptureImpl::DoBufferReceivedOnCaptureThread,
|
| + base::Unretained(this), buffer_id, timestamp, format));
|
| +}
|
| +
|
| +void VideoCaptureImpl::OnStateChanged(VideoCaptureState state) {
|
| + capture_message_loop_proxy_->PostTask(FROM_HERE,
|
| + base::Bind(&VideoCaptureImpl::DoStateChangedOnCaptureThread,
|
| + base::Unretained(this), state));
|
| +}
|
| +
|
| +void VideoCaptureImpl::OnDelegateAdded(int32 device_id) {
|
| + capture_message_loop_proxy_->PostTask(FROM_HERE,
|
| + base::Bind(&VideoCaptureImpl::DoDelegateAddedOnCaptureThread,
|
| + base::Unretained(this), device_id));
|
| +}
|
| +
|
| +void VideoCaptureImpl::SuspendCapture(bool suspend) {
|
| + capture_message_loop_proxy_->PostTask(FROM_HERE,
|
| + base::Bind(&VideoCaptureImpl::DoSuspendCaptureOnCaptureThread,
|
| + base::Unretained(this), suspend));
|
| +}
|
| +
|
| +void VideoCaptureImpl::DoDeInitOnCaptureThread(base::Closure task) {
|
| if (state_ == VIDEO_CAPTURE_STATE_STARTED)
|
| Send(new VideoCaptureHostMsg_Stop(device_id_));
|
| - message_filter_->RemoveDelegate(this);
|
| - done_cb.Run();
|
| -}
|
|
|
| -void VideoCaptureImpl::SuspendCaptureOnIOThread(bool suspend) {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| - suspended_ = suspend;
|
| + io_message_loop_proxy_->PostTask(FROM_HERE,
|
| + base::Bind(&VideoCaptureImpl::RemoveDelegateOnIOThread,
|
| + base::Unretained(this), task));
|
| }
|
|
|
| -void VideoCaptureImpl::StartCaptureOnIOThread(
|
| +void VideoCaptureImpl::DoStartCaptureOnCaptureThread(
|
| media::VideoCapture::EventHandler* handler,
|
| const media::VideoCaptureParams& params) {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
| +
|
| if (state_ == VIDEO_CAPTURE_STATE_ERROR) {
|
| handler->OnError(this, 1);
|
| handler->OnRemoved(this);
|
| @@ -153,9 +183,9 @@
|
| }
|
| }
|
|
|
| -void VideoCaptureImpl::StopCaptureOnIOThread(
|
| +void VideoCaptureImpl::DoStopCaptureOnCaptureThread(
|
| media::VideoCapture::EventHandler* handler) {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
|
|
| // A handler can be in only one client list.
|
| // If this handler is in any client list, we can just remove it from
|
| @@ -172,10 +202,10 @@
|
| }
|
| }
|
|
|
| -void VideoCaptureImpl::OnBufferCreated(
|
| +void VideoCaptureImpl::DoBufferCreatedOnCaptureThread(
|
| base::SharedMemoryHandle handle,
|
| int length, int buffer_id) {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
|
|
| // In case client calls StopCapture before the arrival of created buffer,
|
| // just close this buffer and return.
|
| @@ -186,7 +216,7 @@
|
|
|
| scoped_ptr<base::SharedMemory> shm(new base::SharedMemory(handle, false));
|
| if (!shm->Map(length)) {
|
| - DLOG(ERROR) << "OnBufferCreated: Map failed.";
|
| + DLOG(ERROR) << "DoBufferCreatedOnCaptureThread: Map() failed.";
|
| return;
|
| }
|
|
|
| @@ -198,8 +228,8 @@
|
| DCHECK(inserted);
|
| }
|
|
|
| -void VideoCaptureImpl::OnBufferDestroyed(int buffer_id) {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| +void VideoCaptureImpl::DoBufferDestroyedOnCaptureThread(int buffer_id) {
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
|
|
| ClientBufferMap::iterator iter = client_buffers_.find(buffer_id);
|
| if (iter == client_buffers_.end())
|
| @@ -210,11 +240,11 @@
|
| client_buffers_.erase(iter);
|
| }
|
|
|
| -void VideoCaptureImpl::OnBufferReceived(
|
| +void VideoCaptureImpl::DoBufferReceivedOnCaptureThread(
|
| int buffer_id,
|
| base::TimeTicks timestamp,
|
| const media::VideoCaptureFormat& format) {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
|
|
| if (state_ != VIDEO_CAPTURE_STATE_STARTED || suspended_) {
|
| Send(new VideoCaptureHostMsg_BufferReady(device_id_, buffer_id));
|
| @@ -238,26 +268,25 @@
|
| buffer->buffer_size,
|
| buffer->buffer->handle(),
|
| timestamp - first_frame_timestamp_,
|
| - media::BindToCurrentLoop(
|
| - base::Bind(
|
| - &VideoCaptureImpl::OnClientBufferFinished,
|
| - weak_this_factory_.GetWeakPtr(),
|
| - buffer_id,
|
| - buffer)));
|
| + media::BindToCurrentLoop(base::Bind(
|
| + &VideoCaptureImpl::DoClientBufferFinishedOnCaptureThread,
|
| + weak_this_factory_.GetWeakPtr(),
|
| + buffer_id,
|
| + buffer)));
|
|
|
| for (ClientInfo::iterator it = clients_.begin(); it != clients_.end(); ++it)
|
| it->first->OnFrameReady(this, frame);
|
| }
|
|
|
| -void VideoCaptureImpl::OnClientBufferFinished(
|
| +void VideoCaptureImpl::DoClientBufferFinishedOnCaptureThread(
|
| int buffer_id,
|
| const scoped_refptr<ClientBuffer>& buffer) {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
| Send(new VideoCaptureHostMsg_BufferReady(device_id_, buffer_id));
|
| }
|
|
|
| -void VideoCaptureImpl::OnStateChanged(VideoCaptureState state) {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| +void VideoCaptureImpl::DoStateChangedOnCaptureThread(VideoCaptureState state) {
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
|
|
| switch (state) {
|
| case VIDEO_CAPTURE_STATE_STARTED:
|
| @@ -301,9 +330,9 @@
|
| }
|
| }
|
|
|
| -void VideoCaptureImpl::OnDelegateAdded(int32 device_id) {
|
| - DVLOG(1) << "OnDelegateAdded: device_id " << device_id;
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| +void VideoCaptureImpl::DoDelegateAddedOnCaptureThread(int32 device_id) {
|
| + DVLOG(1) << "DoDelegateAdded: device_id " << device_id;
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
|
|
| device_id_ = device_id;
|
| for (ClientInfo::iterator it = clients_pending_on_filter_.begin();
|
| @@ -315,8 +344,15 @@
|
| }
|
| }
|
|
|
| +void VideoCaptureImpl::DoSuspendCaptureOnCaptureThread(bool suspend) {
|
| + DVLOG(1) << "DoSuspendCapture: suspend " << (suspend ? "yes" : "no");
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
| +
|
| + suspended_ = suspend;
|
| +}
|
| +
|
| void VideoCaptureImpl::StopDevice() {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
|
|
| if (state_ == VIDEO_CAPTURE_STATE_STARTED) {
|
| state_ = VIDEO_CAPTURE_STATE_STOPPING;
|
| @@ -326,7 +362,7 @@
|
| }
|
|
|
| void VideoCaptureImpl::RestartCapture() {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
| DCHECK_EQ(state_, VIDEO_CAPTURE_STATE_STOPPED);
|
|
|
| int width = 0;
|
| @@ -350,13 +386,24 @@
|
| }
|
|
|
| void VideoCaptureImpl::StartCaptureInternal() {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
| DCHECK(device_id_);
|
|
|
| Send(new VideoCaptureHostMsg_Start(device_id_, session_id_, params_));
|
| state_ = VIDEO_CAPTURE_STATE_STARTED;
|
| }
|
|
|
| +void VideoCaptureImpl::AddDelegateOnIOThread() {
|
| + DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + message_filter_->AddDelegate(this);
|
| +}
|
| +
|
| +void VideoCaptureImpl::RemoveDelegateOnIOThread(base::Closure task) {
|
| + DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + message_filter_->RemoveDelegate(this);
|
| + capture_message_loop_proxy_->PostTask(FROM_HERE, task);
|
| +}
|
| +
|
| void VideoCaptureImpl::Send(IPC::Message* message) {
|
| io_message_loop_proxy_->PostTask(FROM_HERE,
|
| base::Bind(base::IgnoreResult(&VideoCaptureMessageFilter::Send),
|
| @@ -366,7 +413,7 @@
|
| bool VideoCaptureImpl::RemoveClient(
|
| media::VideoCapture::EventHandler* handler,
|
| ClientInfo* clients) {
|
| - DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());
|
| bool found = false;
|
|
|
| ClientInfo::iterator it = clients->find(handler);
|
|
|