diff options
Diffstat (limited to 'chromium/content/renderer/media/video_capture_impl.cc')
-rw-r--r-- | chromium/content/renderer/media/video_capture_impl.cc | 423 |
1 files changed, 218 insertions, 205 deletions
diff --git a/chromium/content/renderer/media/video_capture_impl.cc b/chromium/content/renderer/media/video_capture_impl.cc index 30b43ddfcf4..a9d6240ea1c 100644 --- a/chromium/content/renderer/media/video_capture_impl.cc +++ b/chromium/content/renderer/media/video_capture_impl.cc @@ -1,6 +1,13 @@ // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// +// Notes about usage of this object by VideoCaptureImplManager. +// +// VideoCaptureImplManager access this object by using a Unretained() +// binding and tasks on the IO thread. It is then important that +// VideoCaptureImpl never post task to itself. All operations must be +// synchronous. #include "content/renderer/media/video_capture_impl.h" @@ -8,7 +15,7 @@ #include "base/stl_util.h" #include "content/child/child_process.h" #include "content/common/media/video_capture_messages.h" -#include "media/base/bind_to_loop.h" +#include "media/base/bind_to_current_loop.h" #include "media/base/limits.h" #include "media/base/video_frame.h" @@ -32,143 +39,81 @@ class VideoCaptureImpl::ClientBuffer DISALLOW_COPY_AND_ASSIGN(ClientBuffer); }; -bool VideoCaptureImpl::CaptureStarted() { - return state_ == VIDEO_CAPTURE_STATE_STARTED; -} - -int VideoCaptureImpl::CaptureFrameRate() { - return last_frame_format_.frame_rate; -} +VideoCaptureImpl::ClientInfo::ClientInfo() {} +VideoCaptureImpl::ClientInfo::~ClientInfo() {} 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()), + : message_filter_(filter), device_id_(0), session_id_(session_id), suspended_(false), state_(VIDEO_CAPTURE_STATE_STOPPED), - weak_this_factory_(this) { + weak_factory_(this) { DCHECK(filter); + thread_checker_.DetachFromThread(); } -VideoCaptureImpl::~VideoCaptureImpl() {} - -void VideoCaptureImpl::Init() { - 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 task) { - capture_message_loop_proxy_->PostTask(FROM_HERE, - base::Bind(&VideoCaptureImpl::DoDeInitOnCaptureThread, - base::Unretained(this), task)); -} - -void VideoCaptureImpl::StartCapture( - media::VideoCapture::EventHandler* handler, - const media::VideoCaptureParams& params) { - capture_message_loop_proxy_->PostTask(FROM_HERE, - base::Bind(&VideoCaptureImpl::DoStartCaptureOnCaptureThread, - base::Unretained(this), handler, params)); -} - -void VideoCaptureImpl::StopCapture(media::VideoCapture::EventHandler* handler) { - capture_message_loop_proxy_->PostTask(FROM_HERE, - base::Bind(&VideoCaptureImpl::DoStopCaptureOnCaptureThread, - base::Unretained(this), handler)); -} - -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::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::Time timestamp, - const media::VideoCaptureFormat& format) { - capture_message_loop_proxy_->PostTask(FROM_HERE, - base::Bind(&VideoCaptureImpl::DoBufferReceivedOnCaptureThread, - base::Unretained(this), buffer_id, timestamp, format)); +VideoCaptureImpl::~VideoCaptureImpl() { + DCHECK(thread_checker_.CalledOnValidThread()); } -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::Init() { + DCHECK(thread_checker_.CalledOnValidThread()); + message_filter_->AddDelegate(this); } -void VideoCaptureImpl::DoDeInitOnCaptureThread(base::Closure task) { +void VideoCaptureImpl::DeInit() { + DCHECK(thread_checker_.CalledOnValidThread()); if (state_ == VIDEO_CAPTURE_STATE_STARTED) Send(new VideoCaptureHostMsg_Stop(device_id_)); + message_filter_->RemoveDelegate(this); +} - io_message_loop_proxy_->PostTask(FROM_HERE, - base::Bind(&VideoCaptureImpl::RemoveDelegateOnIOThread, - base::Unretained(this), task)); +void VideoCaptureImpl::SuspendCapture(bool suspend) { + DCHECK(thread_checker_.CalledOnValidThread()); + suspended_ = suspend; } -void VideoCaptureImpl::DoStartCaptureOnCaptureThread( - media::VideoCapture::EventHandler* handler, - const media::VideoCaptureParams& params) { - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); +void VideoCaptureImpl::StartCapture( + int client_id, + const media::VideoCaptureParams& params, + const VideoCaptureStateUpdateCB& state_update_cb, + const VideoCaptureDeliverFrameCB& deliver_frame_cb) { + DCHECK(thread_checker_.CalledOnValidThread()); + ClientInfo client_info; + client_info.params = params; + client_info.state_update_cb = state_update_cb; + client_info.deliver_frame_cb = deliver_frame_cb; if (state_ == VIDEO_CAPTURE_STATE_ERROR) { - handler->OnError(this, 1); - handler->OnRemoved(this); - } else if ((clients_pending_on_filter_.find(handler) != - clients_pending_on_filter_.end()) || - (clients_pending_on_restart_.find(handler) != - clients_pending_on_restart_.end()) || - clients_.find(handler) != clients_.end() ) { - // This client has started. + state_update_cb.Run(VIDEO_CAPTURE_STATE_ERROR); + } else if (clients_pending_on_filter_.count(client_id) || + clients_pending_on_restart_.count(client_id) || + clients_.count(client_id)) { + LOG(FATAL) << "This client has already started."; } else if (!device_id_) { - clients_pending_on_filter_[handler] = params; + clients_pending_on_filter_[client_id] = client_info; } else { - handler->OnStarted(this); + // Note: |state_| might not be started at this point. But we tell + // client that we have started. + state_update_cb.Run(VIDEO_CAPTURE_STATE_STARTED); if (state_ == VIDEO_CAPTURE_STATE_STARTED) { - clients_[handler] = params; + clients_[client_id] = client_info; + // TODO(sheu): Allowing resolution change will require that all + // outstanding clients of a capture session support resolution change. + DCHECK_EQ(params_.allow_resolution_change, + params.allow_resolution_change); } else if (state_ == VIDEO_CAPTURE_STATE_STOPPING) { - clients_pending_on_restart_[handler] = params; + clients_pending_on_restart_[client_id] = client_info; DVLOG(1) << "StartCapture: Got new resolution " << params.requested_format.frame_size.ToString() << " during stopping."; } else { - // TODO(sheu): Allowing resolution change will require that all - // outstanding clients of a capture session support resolution change. - DCHECK(!params.allow_resolution_change); - clients_[handler] = params; - DCHECK_EQ(1ul, clients_.size()); + clients_[client_id] = client_info; + if (state_ == VIDEO_CAPTURE_STATE_STARTED) + return; params_ = params; if (params_.requested_format.frame_rate > media::limits::kMaxFramesPerSecond) { @@ -177,35 +122,54 @@ void VideoCaptureImpl::DoStartCaptureOnCaptureThread( } DVLOG(1) << "StartCapture: starting with first resolution " << params_.requested_format.frame_size.ToString(); - + first_frame_timestamp_ = base::TimeTicks(); StartCaptureInternal(); } } } -void VideoCaptureImpl::DoStopCaptureOnCaptureThread( - media::VideoCapture::EventHandler* handler) { - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); +void VideoCaptureImpl::StopCapture(int client_id) { + DCHECK(thread_checker_.CalledOnValidThread()); - // A handler can be in only one client list. - // If this handler is in any client list, we can just remove it from + // A client ID can be in only one client list. + // If this ID is in any client list, we can just remove it from // that client list and don't have to run the other following RemoveClient(). - RemoveClient(handler, &clients_pending_on_filter_) || - RemoveClient(handler, &clients_pending_on_restart_) || - RemoveClient(handler, &clients_); + if (!RemoveClient(client_id, &clients_pending_on_filter_)) { + if (!RemoveClient(client_id, &clients_pending_on_restart_)) { + RemoveClient(client_id, &clients_); + } + } if (clients_.empty()) { DVLOG(1) << "StopCapture: No more client, stopping ..."; StopDevice(); client_buffers_.clear(); - weak_this_factory_.InvalidateWeakPtrs(); + weak_factory_.InvalidateWeakPtrs(); } } -void VideoCaptureImpl::DoBufferCreatedOnCaptureThread( +void VideoCaptureImpl::GetDeviceSupportedFormats( + const VideoCaptureDeviceFormatsCB& callback) { + DCHECK(thread_checker_.CalledOnValidThread()); + device_formats_cb_queue_.push_back(callback); + if (device_formats_cb_queue_.size() == 1) + Send(new VideoCaptureHostMsg_GetDeviceSupportedFormats(device_id_, + session_id_)); +} + +void VideoCaptureImpl::GetDeviceFormatsInUse( + const VideoCaptureDeviceFormatsCB& callback) { + DCHECK(thread_checker_.CalledOnValidThread()); + device_formats_in_use_cb_queue_.push_back(callback); + if (device_formats_in_use_cb_queue_.size() == 1) + Send( + new VideoCaptureHostMsg_GetDeviceFormatsInUse(device_id_, session_id_)); +} + +void VideoCaptureImpl::OnBufferCreated( base::SharedMemoryHandle handle, int length, int buffer_id) { - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); + DCHECK(thread_checker_.CalledOnValidThread()); // In case client calls StopCapture before the arrival of created buffer, // just close this buffer and return. @@ -216,7 +180,7 @@ void VideoCaptureImpl::DoBufferCreatedOnCaptureThread( scoped_ptr<base::SharedMemory> shm(new base::SharedMemory(handle, false)); if (!shm->Map(length)) { - DLOG(ERROR) << "DoBufferCreatedOnCaptureThread: Map() failed."; + DLOG(ERROR) << "OnBufferCreated: Map failed."; return; } @@ -228,8 +192,8 @@ void VideoCaptureImpl::DoBufferCreatedOnCaptureThread( DCHECK(inserted); } -void VideoCaptureImpl::DoBufferDestroyedOnCaptureThread(int buffer_id) { - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); +void VideoCaptureImpl::OnBufferDestroyed(int buffer_id) { + DCHECK(thread_checker_.CalledOnValidThread()); ClientBufferMap::iterator iter = client_buffers_.find(buffer_id); if (iter == client_buffers_.end()) @@ -240,18 +204,30 @@ void VideoCaptureImpl::DoBufferDestroyedOnCaptureThread(int buffer_id) { client_buffers_.erase(iter); } -void VideoCaptureImpl::DoBufferReceivedOnCaptureThread( - int buffer_id, - base::Time timestamp, - const media::VideoCaptureFormat& format) { - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); +void VideoCaptureImpl::OnBufferReceived(int buffer_id, + const media::VideoCaptureFormat& format, + base::TimeTicks timestamp) { + DCHECK(thread_checker_.CalledOnValidThread()); + + // The capture pipeline supports only I420 for now. + DCHECK_EQ(format.pixel_format, media::PIXEL_FORMAT_I420); if (state_ != VIDEO_CAPTURE_STATE_STARTED || suspended_) { - Send(new VideoCaptureHostMsg_BufferReady(device_id_, buffer_id)); + Send(new VideoCaptureHostMsg_BufferReady( + device_id_, buffer_id, std::vector<uint32>())); return; } last_frame_format_ = format; + if (first_frame_timestamp_.is_null()) + first_frame_timestamp_ = timestamp; + + // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc + TRACE_EVENT_INSTANT2( + "cast_perf_test", "OnBufferReceived", + TRACE_EVENT_SCOPE_THREAD, + "timestamp", timestamp.ToInternalValue(), + "time_delta", (timestamp - first_frame_timestamp_).ToInternalValue()); ClientBufferMap::iterator iter = client_buffers_.find(buffer_id); DCHECK(iter != client_buffers_.end()); @@ -265,64 +241,104 @@ void VideoCaptureImpl::DoBufferReceivedOnCaptureThread( reinterpret_cast<uint8*>(buffer->buffer->memory()), buffer->buffer_size, buffer->buffer->handle(), - // TODO(sheu): convert VideoCaptureMessageFilter::Delegate to use - // base::TimeTicks instead of base::Time. http://crbug.com/249215 - timestamp - base::Time::UnixEpoch(), - media::BindToLoop( - capture_message_loop_proxy_, - 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); + timestamp - first_frame_timestamp_, + media::BindToCurrentLoop( + base::Bind(&VideoCaptureImpl::OnClientBufferFinished, + weak_factory_.GetWeakPtr(), + buffer_id, + buffer, + std::vector<uint32>()))); + + for (ClientInfoMap::iterator it = clients_.begin(); it != clients_.end(); + ++it) { + it->second.deliver_frame_cb.Run(frame, format, timestamp); + } +} + +static void NullReadPixelsCB(const SkBitmap& bitmap) { NOTIMPLEMENTED(); } + +void VideoCaptureImpl::OnMailboxBufferReceived( + int buffer_id, + const gpu::MailboxHolder& mailbox_holder, + const media::VideoCaptureFormat& format, + base::TimeTicks timestamp) { + DCHECK(thread_checker_.CalledOnValidThread()); + + if (state_ != VIDEO_CAPTURE_STATE_STARTED || suspended_) { + Send(new VideoCaptureHostMsg_BufferReady( + device_id_, buffer_id, std::vector<uint32>())); + return; + } + + last_frame_format_ = format; + if (first_frame_timestamp_.is_null()) + first_frame_timestamp_ = timestamp; + + scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapNativeTexture( + make_scoped_ptr(new gpu::MailboxHolder(mailbox_holder)), + media::BindToCurrentLoop( + base::Bind(&VideoCaptureImpl::OnClientBufferFinished, + weak_factory_.GetWeakPtr(), + buffer_id, + scoped_refptr<ClientBuffer>())), + last_frame_format_.frame_size, + gfx::Rect(last_frame_format_.frame_size), + last_frame_format_.frame_size, + timestamp - first_frame_timestamp_, + base::Bind(&NullReadPixelsCB)); + + for (ClientInfoMap::iterator it = clients_.begin(); it != clients_.end(); + ++it) { + it->second.deliver_frame_cb.Run(frame, format, timestamp); + } } -void VideoCaptureImpl::DoClientBufferFinishedOnCaptureThread( +void VideoCaptureImpl::OnClientBufferFinished( int buffer_id, - const scoped_refptr<ClientBuffer>& buffer) { - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); - Send(new VideoCaptureHostMsg_BufferReady(device_id_, buffer_id)); + const scoped_refptr<ClientBuffer>& /* ignored_buffer */, + const std::vector<uint32>& release_sync_points) { + DCHECK(thread_checker_.CalledOnValidThread()); + Send(new VideoCaptureHostMsg_BufferReady( + device_id_, buffer_id, release_sync_points)); } -void VideoCaptureImpl::DoStateChangedOnCaptureThread(VideoCaptureState state) { - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); +void VideoCaptureImpl::OnStateChanged(VideoCaptureState state) { + DCHECK(thread_checker_.CalledOnValidThread()); switch (state) { case VIDEO_CAPTURE_STATE_STARTED: + // Camera has started in the browser process. Since we have already + // told all clients that we have started there's nothing to do. break; case VIDEO_CAPTURE_STATE_STOPPED: state_ = VIDEO_CAPTURE_STATE_STOPPED; DVLOG(1) << "OnStateChanged: stopped!, device_id = " << device_id_; client_buffers_.clear(); - weak_this_factory_.InvalidateWeakPtrs(); + weak_factory_.InvalidateWeakPtrs(); if (!clients_.empty() || !clients_pending_on_restart_.empty()) RestartCapture(); break; case VIDEO_CAPTURE_STATE_PAUSED: - for (ClientInfo::iterator it = clients_.begin(); + for (ClientInfoMap::iterator it = clients_.begin(); it != clients_.end(); ++it) { - it->first->OnPaused(this); + it->second.state_update_cb.Run(VIDEO_CAPTURE_STATE_PAUSED); } break; case VIDEO_CAPTURE_STATE_ERROR: DVLOG(1) << "OnStateChanged: error!, device_id = " << device_id_; - for (ClientInfo::iterator it = clients_.begin(); + for (ClientInfoMap::iterator it = clients_.begin(); it != clients_.end(); ++it) { - // TODO(wjia): browser process would send error code. - it->first->OnError(this, 1); - it->first->OnRemoved(this); + it->second.state_update_cb.Run(VIDEO_CAPTURE_STATE_ERROR); } clients_.clear(); state_ = VIDEO_CAPTURE_STATE_ERROR; break; case VIDEO_CAPTURE_STATE_ENDED: DVLOG(1) << "OnStateChanged: ended!, device_id = " << device_id_; - for (ClientInfo::iterator it = clients_.begin(); + for (ClientInfoMap::iterator it = clients_.begin(); it != clients_.end(); ++it) { - it->first->OnRemoved(this); + // We'll only notify the client that the stream has stopped. + it->second.state_update_cb.Run(VIDEO_CAPTURE_STATE_STOPPED); } clients_.clear(); state_ = VIDEO_CAPTURE_STATE_ENDED; @@ -332,29 +348,43 @@ void VideoCaptureImpl::DoStateChangedOnCaptureThread(VideoCaptureState state) { } } -void VideoCaptureImpl::DoDelegateAddedOnCaptureThread(int32 device_id) { - DVLOG(1) << "DoDelegateAdded: device_id " << device_id; - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); +void VideoCaptureImpl::OnDeviceSupportedFormatsEnumerated( + const media::VideoCaptureFormats& supported_formats) { + DCHECK(thread_checker_.CalledOnValidThread()); + for (size_t i = 0; i < device_formats_cb_queue_.size(); ++i) + device_formats_cb_queue_[i].Run(supported_formats); + device_formats_cb_queue_.clear(); +} + +void VideoCaptureImpl::OnDeviceFormatsInUseReceived( + const media::VideoCaptureFormats& formats_in_use) { + DCHECK(thread_checker_.CalledOnValidThread()); + for (size_t i = 0; i < device_formats_in_use_cb_queue_.size(); ++i) + device_formats_in_use_cb_queue_[i].Run(formats_in_use); + device_formats_in_use_cb_queue_.clear(); +} + +void VideoCaptureImpl::OnDelegateAdded(int32 device_id) { + DCHECK(thread_checker_.CalledOnValidThread()); + DVLOG(1) << "OnDelegateAdded: device_id " << device_id; device_id_ = device_id; - for (ClientInfo::iterator it = clients_pending_on_filter_.begin(); + for (ClientInfoMap::iterator it = clients_pending_on_filter_.begin(); it != clients_pending_on_filter_.end(); ) { - media::VideoCapture::EventHandler* handler = it->first; - const media::VideoCaptureParams params = it->second; + int client_id = it->first; + VideoCaptureStateUpdateCB state_update_cb = + it->second.state_update_cb; + VideoCaptureDeliverFrameCB deliver_frame_cb = + it->second.deliver_frame_cb; + const media::VideoCaptureParams params = it->second.params; clients_pending_on_filter_.erase(it++); - StartCapture(handler, params); + StartCapture(client_id, params, state_update_cb, + deliver_frame_cb); } } -void VideoCaptureImpl::DoSuspendCaptureOnCaptureThread(bool suspend) { - DVLOG(1) << "DoSuspendCapture: suspend " << (suspend ? "yes" : "no"); - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); - - suspended_ = suspend; -} - void VideoCaptureImpl::StopDevice() { - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); + DCHECK(thread_checker_.CalledOnValidThread()); if (state_ == VIDEO_CAPTURE_STATE_STARTED) { state_ = VIDEO_CAPTURE_STATE_STOPPING; @@ -364,22 +394,20 @@ void VideoCaptureImpl::StopDevice() { } void VideoCaptureImpl::RestartCapture() { - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); + DCHECK(thread_checker_.CalledOnValidThread()); DCHECK_EQ(state_, VIDEO_CAPTURE_STATE_STOPPED); int width = 0; int height = 0; - for (ClientInfo::iterator it = clients_.begin(); + clients_.insert(clients_pending_on_restart_.begin(), + clients_pending_on_restart_.end()); + clients_pending_on_restart_.clear(); + for (ClientInfoMap::iterator it = clients_.begin(); it != clients_.end(); ++it) { - width = std::max(width, it->second.requested_format.frame_size.width()); - height = std::max(height, it->second.requested_format.frame_size.height()); - } - for (ClientInfo::iterator it = clients_pending_on_restart_.begin(); - it != clients_pending_on_restart_.end(); ) { - width = std::max(width, it->second.requested_format.frame_size.width()); - height = std::max(height, it->second.requested_format.frame_size.height()); - clients_[it->first] = it->second; - clients_pending_on_restart_.erase(it++); + width = std::max(width, + it->second.params.requested_format.frame_size.width()); + height = std::max(height, + it->second.params.requested_format.frame_size.height()); } params_.requested_format.frame_size.SetSize(width, height); DVLOG(1) << "RestartCapture, " @@ -388,40 +416,25 @@ void VideoCaptureImpl::RestartCapture() { } void VideoCaptureImpl::StartCaptureInternal() { - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); + DCHECK(thread_checker_.CalledOnValidThread()); 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), - message_filter_.get(), message)); + DCHECK(thread_checker_.CalledOnValidThread()); + message_filter_->Send(message); } -bool VideoCaptureImpl::RemoveClient( - media::VideoCapture::EventHandler* handler, - ClientInfo* clients) { - DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread()); +bool VideoCaptureImpl::RemoveClient(int client_id, ClientInfoMap* clients) { + DCHECK(thread_checker_.CalledOnValidThread()); bool found = false; - ClientInfo::iterator it = clients->find(handler); + ClientInfoMap::iterator it = clients->find(client_id); if (it != clients->end()) { - handler->OnStopped(this); - handler->OnRemoved(this); + it->second.state_update_cb.Run(VIDEO_CAPTURE_STATE_STOPPED); clients->erase(it); found = true; } |