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

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

Issue 1477363002: Add logging of video device details on device open and close. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed VideoCaptureManagerTest.OpenNotExisting test. Created 5 years 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_manager.cc
diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc
index 43788fb01d9b61bedbc8d5e06f4c862a87bc4577..a91f8d56cef850660a73779957a60b9ba5967401 100644
--- a/content/browser/renderer_host/media/video_capture_manager.cc
+++ b/content/browser/renderer_host/media/video_capture_manager.cc
@@ -15,6 +15,7 @@
#include "base/metrics/histogram_macros.h"
#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
+#include "base/strings/stringprintf.h"
#include "base/task_runner_util.h"
#include "base/thread_task_runner_handle.h"
#include "base/threading/sequenced_worker_pool.h"
@@ -296,6 +297,9 @@ void VideoCaptureManager::DoStopDevice(DeviceEntry* entry) {
DVLOG(3) << "DoStopDevice. Send stop request for device = " << entry->id
<< " serial_id = " << entry->serial_id << ".";
+ entry->video_capture_controller()->DoLogOnIOThread(
+ base::StringPrintf("Stopping device: id: %s\n", entry->id.c_str()));
+
if (entry->video_capture_device()) {
// |entry->video_capture_device| can be null if creating the device fails.
device_task_runner_->PostTask(
@@ -327,17 +331,67 @@ void VideoCaptureManager::HandleQueuedStartRequest() {
DVLOG(3) << "HandleQueuedStartRequest, Post start to device thread, device = "
<< entry->id << " start id = " << entry->serial_id;
+
+ base::Callback<scoped_ptr<media::VideoCaptureDevice>(void)>
+ start_capture_function;
+
+ switch (entry->stream_type) {
+ case MEDIA_DEVICE_VIDEO_CAPTURE: {
+ // We look up the device id from the renderer in our local enumeration
+ // since the renderer does not have all the information that might be
+ // held in the browser-side VideoCaptureDevice::Name structure.
+ const media::VideoCaptureDeviceInfo* found =
+ FindDeviceInfoById(entry->id, devices_info_cache_);
+ if (found) {
+ entry->video_capture_controller()->DoLogOnIOThread(base::StringPrintf(
+ "Starting device: id: %s, name: %s, api: %s",
+ found->name.id().c_str(), found->name.GetNameAndModel().c_str(),
+ found->name.GetCaptureApiTypeString()));
+
+ start_capture_function = base::Bind(
+ &VideoCaptureManager::DoStartDeviceCaptureOnDeviceThread, this,
+ found->name, request->params(),
+ base::Passed(entry->video_capture_controller()->NewDeviceClient()));
+ } else {
+ // Errors from DoStartDeviceCaptureOnDeviceThread go via
+ // VideoCaptureDeviceClient::OnError, which needs some thread
+ // dancing to get errors processed on the IO thread. But since
+ // we're on that thread, we call VideoCaptureController
+ // methods directly.
+ const std::string log_message = base::StringPrintf(
+ "Error on %s:%d: device %s unknown. Maybe recently disconnected?",
+ __FILE__, __LINE__, entry->id.c_str());
+ DLOG(ERROR) << log_message;
+ entry->video_capture_controller()->DoLogOnIOThread(log_message);
+ entry->video_capture_controller()->DoErrorOnIOThread();
+ // Drop the failed start request.
+ device_start_queue_.pop_front();
+
+ return;
+ }
+ break;
+ }
+ case MEDIA_TAB_VIDEO_CAPTURE:
+ start_capture_function = base::Bind(
+ &VideoCaptureManager::DoStartTabCaptureOnDeviceThread, this,
+ entry->id, request->params(),
+ base::Passed(entry->video_capture_controller()->NewDeviceClient()));
+ break;
+
+ case MEDIA_DESKTOP_VIDEO_CAPTURE:
+ start_capture_function = base::Bind(
+ &VideoCaptureManager::DoStartDesktopCaptureOnDeviceThread, this,
+ entry->id, request->params(),
+ base::Passed(entry->video_capture_controller()->NewDeviceClient()));
+ break;
+
+ default: {
+ NOTIMPLEMENTED();
+ return;
+ }
+ }
base::PostTaskAndReplyWithResult(
- device_task_runner_.get(),
- FROM_HERE,
- base::Bind(
- &VideoCaptureManager::DoStartDeviceOnDeviceThread,
- this,
- request->session_id(),
- entry->id,
- entry->stream_type,
- request->params(),
- base::Passed(entry->video_capture_controller()->NewDeviceClient())),
+ device_task_runner_.get(), FROM_HERE, start_capture_function,
base::Bind(&VideoCaptureManager::OnDeviceStarted, this,
request->serial_id()));
}
@@ -349,7 +403,8 @@ void VideoCaptureManager::OnDeviceStarted(
DCHECK(serial_id == device_start_queue_.begin()->serial_id());
DVLOG(3) << "OnDeviceStarted";
if (device_start_queue_.front().abort_start()) {
- // |device| can be null if creation failed in DoStartDeviceOnDeviceThread.
+ // |device| can be null if creation failed in
+ // DoStartDeviceCaptureOnDeviceThread.
// The device is no longer wanted. Stop the device again.
DVLOG(3) << "OnDeviceStarted but start request have been aborted.";
media::VideoCaptureDevice* device_ptr = device.get();
@@ -383,52 +438,64 @@ void VideoCaptureManager::OnDeviceStarted(
}
scoped_ptr<media::VideoCaptureDevice>
-VideoCaptureManager::DoStartDeviceOnDeviceThread(
- media::VideoCaptureSessionId session_id,
+VideoCaptureManager::DoStartDeviceCaptureOnDeviceThread(
+ const media::VideoCaptureDevice::Name& name,
+ const media::VideoCaptureParams& params,
+ scoped_ptr<media::VideoCaptureDevice::Client> device_client) {
+ SCOPED_UMA_HISTOGRAM_TIMER("Media.VideoCaptureManager.StartDeviceTime");
+ DCHECK(IsOnDeviceThread());
+
+ scoped_ptr<media::VideoCaptureDevice> video_capture_device;
+ video_capture_device = video_capture_device_factory_->Create(name);
+
+ if (!video_capture_device) {
+ device_client->OnError(FROM_HERE, "Could not create capture device");
+ return nullptr;
+ }
+
+ video_capture_device->AllocateAndStart(params, device_client.Pass());
+ return video_capture_device.Pass();
+}
+
+scoped_ptr<media::VideoCaptureDevice>
+VideoCaptureManager::DoStartTabCaptureOnDeviceThread(
+ const std::string& id,
+ const media::VideoCaptureParams& params,
+ scoped_ptr<media::VideoCaptureDevice::Client> device_client) {
+ SCOPED_UMA_HISTOGRAM_TIMER("Media.VideoCaptureManager.StartDeviceTime");
+ DCHECK(IsOnDeviceThread());
+
+ scoped_ptr<media::VideoCaptureDevice> video_capture_device;
+ video_capture_device.reset(WebContentsVideoCaptureDevice::Create(id));
+
+ if (!video_capture_device) {
+ device_client->OnError(FROM_HERE, "Could not create capture device");
+ return nullptr;
+ }
+
+ video_capture_device->AllocateAndStart(params, device_client.Pass());
+ return video_capture_device.Pass();
+}
+
+scoped_ptr<media::VideoCaptureDevice>
+VideoCaptureManager::DoStartDesktopCaptureOnDeviceThread(
const std::string& id,
- MediaStreamType stream_type,
const media::VideoCaptureParams& params,
scoped_ptr<media::VideoCaptureDevice::Client> device_client) {
SCOPED_UMA_HISTOGRAM_TIMER("Media.VideoCaptureManager.StartDeviceTime");
DCHECK(IsOnDeviceThread());
scoped_ptr<media::VideoCaptureDevice> video_capture_device;
- switch (stream_type) {
- case MEDIA_DEVICE_VIDEO_CAPTURE: {
- // We look up the device id from the renderer in our local enumeration
- // since the renderer does not have all the information that might be
- // held in the browser-side VideoCaptureDevice::Name structure.
- const media::VideoCaptureDeviceInfo* found =
- FindDeviceInfoById(id, devices_info_cache_);
- if (found) {
- video_capture_device =
- video_capture_device_factory_->Create(found->name);
- }
- break;
- }
- case MEDIA_TAB_VIDEO_CAPTURE: {
- video_capture_device.reset(
- WebContentsVideoCaptureDevice::Create(id));
- break;
- }
- case MEDIA_DESKTOP_VIDEO_CAPTURE: {
#if defined(ENABLE_SCREEN_CAPTURE)
- DesktopMediaID desktop_id = DesktopMediaID::Parse(id);
- if (!desktop_id.is_null()) {
+ DesktopMediaID desktop_id = DesktopMediaID::Parse(id);
+ if (!desktop_id.is_null()) {
#if defined(USE_AURA)
- video_capture_device = DesktopCaptureDeviceAura::Create(desktop_id);
+ video_capture_device = DesktopCaptureDeviceAura::Create(desktop_id);
#endif
- if (!video_capture_device)
- video_capture_device = DesktopCaptureDevice::Create(desktop_id);
- }
-#endif // defined(ENABLE_SCREEN_CAPTURE)
- break;
- }
- default: {
- NOTIMPLEMENTED();
- break;
- }
+ if (!video_capture_device)
+ video_capture_device = DesktopCaptureDevice::Create(desktop_id);
}
+#endif // defined(ENABLE_SCREEN_CAPTURE)
if (!video_capture_device) {
device_client->OnError(FROM_HERE, "Could not create capture device");

Powered by Google App Engine
This is Rietveld 408576698