summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authormcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-14 20:07:57 +0000
committermcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-14 20:07:57 +0000
commit1ac077eab9446eb6905a15daea470036ca18c9ef (patch)
tree278095a171e39017f03b778598dd254fbf6a8be0 /media
parentb96240bee73f5d0f4ab36eb38c3a4f3956c177df (diff)
downloadchromium_src-1ac077eab9446eb6905a15daea470036ca18c9ef.zip
chromium_src-1ac077eab9446eb6905a15daea470036ca18c9ef.tar.gz
chromium_src-1ac077eab9446eb6905a15daea470036ca18c9ef.tar.bz2
Added video capture capabilities retrieval and caching to VideoCaptureManager.
The local cache of video capture names and capabilities is created in a codepath starting in EnumerateDevices. The cache is update during StartCaptureForClient() and StopCaptureForClient(). Also added unittests (http://goo.gl/QQbpXW). BUG=309554 Review URL: https://codereview.chromium.org/29423003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@235223 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r--media/video/capture/fake_video_capture_device.cc33
-rw-r--r--media/video/capture/fake_video_capture_device.h3
-rw-r--r--media/video/capture/mac/video_capture_device_mac.mm11
-rw-r--r--media/video/capture/video_capture_device.cc9
-rw-r--r--media/video/capture/video_capture_device.h10
5 files changed, 38 insertions, 28 deletions
diff --git a/media/video/capture/fake_video_capture_device.cc b/media/video/capture/fake_video_capture_device.cc
index c36670c..90778a2 100644
--- a/media/video/capture/fake_video_capture_device.cc
+++ b/media/video/capture/fake_video_capture_device.cc
@@ -19,15 +19,23 @@ namespace media {
static const int kFakeCaptureTimeoutMs = 50;
static const int kFakeCaptureBeepCycle = 20; // Visual beep every 1s.
static const int kFakeCaptureCapabilityChangePeriod = 30;
-enum { kNumberOfFakeDevices = 2 };
+int FakeVideoCaptureDevice::number_of_fake_devices_ = 2;
bool FakeVideoCaptureDevice::fail_next_create_ = false;
+void FakeVideoCaptureDevice::SetNumberOfFakeDevices(int num) {
+ number_of_fake_devices_ = num;
+}
+
+int FakeVideoCaptureDevice::NumberOfFakeDevices(void) {
+ return number_of_fake_devices_;
+}
+
void FakeVideoCaptureDevice::GetDeviceNames(Names* const device_names) {
// Empty the name list.
device_names->erase(device_names->begin(), device_names->end());
- for (int n = 0; n < kNumberOfFakeDevices; n++) {
+ for (int n = 0; n < number_of_fake_devices_; n++) {
Name name(base::StringPrintf("fake_device_%d", n),
base::StringPrintf("/dev/video%d", n));
device_names->push_back(name);
@@ -37,12 +45,19 @@ void FakeVideoCaptureDevice::GetDeviceNames(Names* const device_names) {
void FakeVideoCaptureDevice::GetDeviceSupportedFormats(
const Name& device,
VideoCaptureCapabilities* formats) {
- VideoCaptureCapability capture_format;
- capture_format.color = media::PIXEL_FORMAT_I420;
- capture_format.width = 640;
- capture_format.height = 480;
- capture_format.frame_rate = 1000 / kFakeCaptureTimeoutMs;
- formats->push_back(capture_format);
+ formats->clear();
+ VideoCaptureCapability capture_format_640x480;
+ capture_format_640x480.color = media::PIXEL_FORMAT_I420;
+ capture_format_640x480.width = 640;
+ capture_format_640x480.height = 480;
+ capture_format_640x480.frame_rate = 1000 / kFakeCaptureTimeoutMs;
+ formats->push_back(capture_format_640x480);
+ VideoCaptureCapability capture_format_320x240;
+ capture_format_320x240.color = media::PIXEL_FORMAT_I420;
+ capture_format_320x240.width = 320;
+ capture_format_320x240.height = 240;
+ capture_format_320x240.frame_rate = 1000 / kFakeCaptureTimeoutMs;
+ formats->push_back(capture_format_320x240);
}
VideoCaptureDevice* FakeVideoCaptureDevice::Create(const Name& device_name) {
@@ -50,7 +65,7 @@ VideoCaptureDevice* FakeVideoCaptureDevice::Create(const Name& device_name) {
fail_next_create_ = false;
return NULL;
}
- for (int n = 0; n < kNumberOfFakeDevices; ++n) {
+ for (int n = 0; n < number_of_fake_devices_; ++n) {
std::string possible_id = base::StringPrintf("/dev/video%d", n);
if (device_name.id().compare(possible_id) == 0) {
return new FakeVideoCaptureDevice();
diff --git a/media/video/capture/fake_video_capture_device.h b/media/video/capture/fake_video_capture_device.h
index 174ba06a..c69fbdf 100644
--- a/media/video/capture/fake_video_capture_device.h
+++ b/media/video/capture/fake_video_capture_device.h
@@ -23,6 +23,8 @@ class MEDIA_EXPORT FakeVideoCaptureDevice : public VideoCaptureDevice {
// Used for testing. This will make sure the next call to Create will
// return NULL;
static void SetFailNextCreate();
+ static void SetNumberOfFakeDevices(int num);
+ static int NumberOfFakeDevices();
static void GetDeviceNames(Names* device_names);
static void GetDeviceSupportedFormats(const Name& device,
@@ -63,6 +65,7 @@ class MEDIA_EXPORT FakeVideoCaptureDevice : public VideoCaptureDevice {
std::vector<VideoCaptureCapability> capabilities_roster_;
int capabilities_roster_index_;
+ static int number_of_fake_devices_;
static bool fail_next_create_;
DISALLOW_COPY_AND_ASSIGN(FakeVideoCaptureDevice);
diff --git a/media/video/capture/mac/video_capture_device_mac.mm b/media/video/capture/mac/video_capture_device_mac.mm
index b353b12..60b193e 100644
--- a/media/video/capture/mac/video_capture_device_mac.mm
+++ b/media/video/capture/mac/video_capture_device_mac.mm
@@ -208,10 +208,17 @@ bool VideoCaptureDeviceMac::Init() {
DCHECK_EQ(loop_proxy_, base::MessageLoopProxy::current());
DCHECK_EQ(state_, kNotInitialized);
+ // TODO(mcasas): The following check might not be necessary; if the device has
+ // disappeared after enumeration and before coming here, opening would just
+ // fail but not necessarily produce a crash.
Names device_names;
GetDeviceNames(&device_names);
- Name* found = device_names.FindById(device_name_.id());
- if (!found)
+ Names::iterator it = device_names.begin();
+ for (; it != device_names.end(); ++it) {
+ if (it->id() == device_name_.id())
+ break;
+ }
+ if (it == device_names.end())
return false;
capture_device_ =
diff --git a/media/video/capture/video_capture_device.cc b/media/video/capture/video_capture_device.cc
index cd1f535..c370d09 100644
--- a/media/video/capture/video_capture_device.cc
+++ b/media/video/capture/video_capture_device.cc
@@ -17,15 +17,6 @@ const std::string VideoCaptureDevice::Name::GetNameAndModel() const {
return device_name_ + suffix;
}
-VideoCaptureDevice::Name*
-VideoCaptureDevice::Names::FindById(const std::string& id) {
- for (iterator it = begin(); it != end(); ++it) {
- if (it->id() == id)
- return &(*it);
- }
- return NULL;
-}
-
VideoCaptureDevice::~VideoCaptureDevice() {}
} // namespace media
diff --git a/media/video/capture/video_capture_device.h b/media/video/capture/video_capture_device.h
index 824cdb4..38600c5 100644
--- a/media/video/capture/video_capture_device.h
+++ b/media/video/capture/video_capture_device.h
@@ -18,6 +18,7 @@
#include "base/logging.h"
#include "base/time/time.h"
#include "media/base/media_export.h"
+#include "media/base/video_frame.h"
#include "media/video/capture/video_capture_types.h"
namespace media {
@@ -109,14 +110,7 @@ class MEDIA_EXPORT VideoCaptureDevice {
};
// Manages a list of Name entries.
- class MEDIA_EXPORT Names
- : public NON_EXPORTED_BASE(std::list<Name>) {
- public:
- // Returns NULL if no entry was found by that ID.
- Name* FindById(const std::string& id);
-
- // Allow generated copy constructor and assignment.
- };
+ typedef std::list<Name> Names;
class MEDIA_EXPORT Client {
public: