Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(409)

Unified Diff: trunk/src/content/renderer/media/video_capture_impl.cc

Issue 135683002: Revert 244074 "Eliminate video capture thread in renderer" (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
« no previous file with comments | « trunk/src/content/renderer/media/video_capture_impl.h ('k') | trunk/src/content/renderer/media/video_capture_impl_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698