video osx: bump libav patch
New developments in libav allow size selection.
This patch adds this ability in our OSX video device implementation.
Tuleap: #166
Change-Id: Ibe9c38e85b5ce2a0bee4b0528390aae716a1aee7
diff --git a/src/media/video/osxvideo/video_device_impl.mm b/src/media/video/osxvideo/video_device_impl.mm
index f1ed03c..f298e15 100644
--- a/src/media/video/osxvideo/video_device_impl.mm
+++ b/src/media/video/osxvideo/video_device_impl.mm
@@ -35,6 +35,13 @@
namespace ring { namespace video {
+class OSXVideoSize {
+ public:
+ OSXVideoSize(const unsigned width, const unsigned height);
+ unsigned width;
+ unsigned height;
+};
+
class VideoDeviceImpl {
public:
/**
@@ -57,42 +64,71 @@
DeviceParams getDeviceParams() const;
private:
+ const OSXVideoSize extractSize(const std::string &name) const;
+
AVCaptureDevice* avDevice_;
+ std::vector<OSXVideoSize> available_sizes_;
+ OSXVideoSize current_size_;
};
VideoDeviceImpl::VideoDeviceImpl(const std::string& uniqueID)
: device(uniqueID)
+ , current_size_(-1, -1)
, avDevice_([AVCaptureDevice deviceWithUniqueID:
[NSString stringWithCString:uniqueID.c_str() encoding:[NSString defaultCStringEncoding]]])
{
name = [[avDevice_ localizedName] UTF8String];
+
+ for (AVCaptureDeviceFormat* format in avDevice_.formats) {
+ std::stringstream ss;
+ auto dimensions = CMVideoFormatDescriptionGetDimensions(format.formatDescription);
+ OSXVideoSize size(dimensions.width, dimensions.height);
+ available_sizes_.push_back(size);
+ }
// Set default settings
applySettings(VideoSettings());
}
+OSXVideoSize::OSXVideoSize(const unsigned width, const unsigned height) :
+ width(width), height(height) {}
+
void
VideoDeviceImpl::applySettings(VideoSettings settings)
{
-//TODO: not supported for now on OSX
-// Set preferences or fallback to defaults.
-// channel_ = getChannel(settings["channel"]);
-// size_ = channel_.getSize(settings["size"]);
+//TODO: add framerate
// rate_ = size_.getRate(settings["rate"]);
+ current_size_ = extractSize(settings.video_size);
}
+const OSXVideoSize
+VideoDeviceImpl::extractSize(const std::string &name) const
+{
+ for (const auto item : available_sizes_) {
+ std::stringstream ss;
+ ss << item.width << "x" << item.height;
+ if (ss.str() == name)
+ return item;
+ }
+
+ // fallback to last size
+ if (!available_sizes_.empty()) {
+ return available_sizes_.back();
+ }
+ return OSXVideoSize(-1, -1);
+}
+
+
DeviceParams
VideoDeviceImpl::getDeviceParams() const
{
DeviceParams params;
params.input = "[" + device + "]";
params.format = "avfoundation";
-// No channel support for now
-// params.channel = channel_.idx;
+
+ params.width = current_size_.width;
+ params.height = current_size_.height;
+
auto format = [avDevice_ activeFormat];
- CMVideoDimensions dimensions =
- CMVideoFormatDescriptionGetDimensions(format.formatDescription);
- params.width = dimensions.width;
- params.height = dimensions.height;
auto frameRate = (AVFrameRateRange*)
[format.videoSupportedFrameRateRanges objectAtIndex:0];
params.framerate = frameRate.maxFrameRate;
@@ -159,12 +195,12 @@
{
std::vector<std::string> v;
- for (AVCaptureDeviceFormat* format in avDevice_.formats) {
- std::stringstream ss;
- auto dimensions = CMVideoFormatDescriptionGetDimensions(format.formatDescription);
- ss << dimensions.width << "x" << dimensions.height;
+ for (const auto &item : available_sizes_) {
+ std::stringstream ss;
+ ss << item.width << "x" << item.height;
v.push_back(ss.str());
}
+
return v;
}