diff options
author | mcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-14 20:07:57 +0000 |
---|---|---|
committer | mcasas@chromium.org <mcasas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-14 20:07:57 +0000 |
commit | 1ac077eab9446eb6905a15daea470036ca18c9ef (patch) | |
tree | 278095a171e39017f03b778598dd254fbf6a8be0 /media | |
parent | b96240bee73f5d0f4ab36eb38c3a4f3956c177df (diff) | |
download | chromium_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.cc | 33 | ||||
-rw-r--r-- | media/video/capture/fake_video_capture_device.h | 3 | ||||
-rw-r--r-- | media/video/capture/mac/video_capture_device_mac.mm | 11 | ||||
-rw-r--r-- | media/video/capture/video_capture_device.cc | 9 | ||||
-rw-r--r-- | media/video/capture/video_capture_device.h | 10 |
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: |