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

Unified Diff: content/browser/renderer_host/media/video_capture_host.cc

Issue 8304017: enable video capture to support sharing across multiple renderer processes (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 2 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: content/browser/renderer_host/media/video_capture_host.cc
===================================================================
--- content/browser/renderer_host/media/video_capture_host.cc (revision 107671)
+++ content/browser/renderer_host/media/video_capture_host.cc (working copy)
@@ -8,6 +8,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/stl_util.h"
#include "content/browser/renderer_host/media/media_stream_manager.h"
+#include "content/browser/renderer_host/media/video_capture_manager.h"
#include "content/browser/resource_context.h"
#include "content/common/media/video_capture_messages.h"
@@ -24,11 +25,12 @@
// Since the IPC channel is gone, close all requested VideCaptureDevices.
for (EntryMap::iterator it = entries_.begin(); it != entries_.end(); it++) {
VideoCaptureController* controller = it->second;
- // Since the channel is closing we need a task to make sure VideoCaptureHost
- // is not deleted before VideoCaptureController.
- controller->StopCapture(
- base::Bind(&VideoCaptureHost::OnReadyToDelete, this, it->first));
+ VideoCaptureControllerID controller_id(it->first);
+ controller->StopCapture(controller_id, this, true);
+ GetVideoCaptureManager()->RemoveController(controller, this);
}
+ entries_.clear();
+ entry_state_.clear();
}
void VideoCaptureHost::OnDestruct() const {
@@ -108,7 +110,7 @@
EntryMap::iterator it = entries_.find(id);
if (it != entries_.end()) {
VideoCaptureController* controller = it->second;
- controller->StopCapture(base::Closure());
+ controller->StopCapture(id, this, false);
}
}
@@ -146,31 +148,63 @@
void VideoCaptureHost::OnStartCapture(int device_id,
const media::VideoCaptureParams& params) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ VideoCaptureControllerID controller_id(device_id);
+ DCHECK(entries_.find(controller_id) == entries_.end());
+ DCHECK(entry_state_.find(controller_id) == entry_state_.end());
+ entry_state_[controller_id] = media::VideoCapture::kStarted;
+ GetVideoCaptureManager()->AddController(
+ params, this, base::Bind(&VideoCaptureHost::OnControllerAdded, this,
+ device_id, params));
+}
+
+void VideoCaptureHost::OnControllerAdded(
+ int device_id, const media::VideoCaptureParams& params,
+ VideoCaptureController* controller) {
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(&VideoCaptureHost::DoControllerAddedOnIOThreead,
+ this, device_id, params, make_scoped_refptr(controller)));
+}
+
+void VideoCaptureHost::DoControllerAddedOnIOThreead(
+ int device_id, const media::VideoCaptureParams params,
+ VideoCaptureController* controller) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
VideoCaptureControllerID controller_id(device_id);
-
DCHECK(entries_.find(controller_id) == entries_.end());
+ DCHECK(entry_state_.find(controller_id) != entry_state_.end());
- scoped_refptr<VideoCaptureController> controller =
- new VideoCaptureController(
- controller_id, peer_handle(), this,
- resource_context_->media_stream_manager()->video_capture_manager());
+ if (controller == NULL) {
+ Send(new VideoCaptureMsg_StateChanged(device_id,
+ media::VideoCapture::kError));
+ return;
+ }
+
entries_.insert(std::make_pair(controller_id, controller));
- controller->StartCapture(params);
+ if (entry_state_[controller_id] == media::VideoCapture::kStarted) {
+ controller->StartCapture(controller_id, this, peer_handle(), params);
+ } else if (entry_state_[controller_id] == media::VideoCapture::kStopped) {
+ controller->StopCapture(controller_id, this, false);
+ }
}
void VideoCaptureHost::OnStopCapture(int device_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ VideoCaptureControllerID controller_id(device_id);
- VideoCaptureControllerID controller_id(device_id);
+ if (entry_state_.find(controller_id) == entry_state_.end()) {
+ // It does not exist. So it must have been stopped already.
+ Send(new VideoCaptureMsg_StateChanged(device_id,
+ media::VideoCapture::kStopped));
+ }
+
+ entry_state_[controller_id] = media::VideoCapture::kStopped;
+
EntryMap::iterator it = entries_.find(controller_id);
if (it != entries_.end()) {
scoped_refptr<VideoCaptureController> controller = it->second;
- controller->StopCapture(base::Closure());
- } else {
- // It does not exist so it must have been stopped already.
- Send(new VideoCaptureMsg_StateChanged(device_id,
- media::VideoCapture::kStopped));
+ controller->StopCapture(controller_id, this, false);
}
}
@@ -188,7 +222,7 @@
EntryMap::iterator it = entries_.find(controller_id);
if (it != entries_.end()) {
scoped_refptr<VideoCaptureController> controller = it->second;
- controller->ReturnBuffer(buffer_id);
+ controller->ReturnBuffer(controller_id, this, buffer_id);
}
}
@@ -199,5 +233,15 @@
// Report that the device have successfully been stopped.
Send(new VideoCaptureMsg_StateChanged(id.device_id,
media::VideoCapture::kStopped));
+ EntryMap::iterator it = entries_.find(id);
+ if (it != entries_.end()) {
+ GetVideoCaptureManager()->RemoveController(it->second, this);
+ }
entries_.erase(id);
+ entry_state_.erase(id);
}
+
+media_stream::VideoCaptureManager* VideoCaptureHost::GetVideoCaptureManager() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ return resource_context_->media_stream_manager()->video_capture_manager();
+}

Powered by Google App Engine
This is Rietveld 408576698