video_device: add default settings selection logic
* use default settings if no preference exists
* logic requires unformated parameters (added related methods)
* current logic: largest resolution <= 720P, framerate >= 10 FPS
* support new pixel format
* report pixel format to libav/ffmpeg for decoding
Tuleap: #294
Change-Id: Ia9b61814b49e7057ae4eb5fef9d0b814706cafff
diff --git a/src/media/video/osxvideo/video_device_impl.mm b/src/media/video/osxvideo/video_device_impl.mm
index 5795fb9..3f05fa9 100644
--- a/src/media/video/osxvideo/video_device_impl.mm
+++ b/src/media/video/osxvideo/video_device_impl.mm
@@ -35,13 +35,6 @@
namespace ring { namespace video {
-class OSXVideoSize {
- public:
- OSXVideoSize(const unsigned width, const unsigned height);
- unsigned width;
- unsigned height;
-};
-
class VideoDeviceImpl {
public:
/**
@@ -53,22 +46,19 @@
std::string name;
std::vector<std::string> getChannelList() const;
- std::vector<std::string> getSizeList(const std::string& channel) const;
- std::vector<std::string> getSizeList() const;
- std::vector<std::string> getRateList(const std::string& channel, const std::string& size) const;
- float getRate(unsigned rate) const;
-
- VideoSettings getSettings() const;
- void applySettings(VideoSettings settings);
+ std::vector<VideoSize> getSizeList(const std::string& channel) const;
+ std::vector<VideoSize> getSizeList() const;
+ std::vector<FrameRate> getRateList(const std::string& channel, VideoSize size) const;
DeviceParams getDeviceParams() const;
+ void setDeviceParams(const DeviceParams&);
private:
- const OSXVideoSize extractSize(const std::string &name) const;
+ VideoSize extractSize(VideoSize) const;
AVCaptureDevice* avDevice_;
- std::vector<OSXVideoSize> available_sizes_;
- OSXVideoSize current_size_;
+ std::vector<VideoSize> available_sizes_;
+ VideoSize current_size_;
};
VideoDeviceImpl::VideoDeviceImpl(const std::string& uniqueID)
@@ -79,34 +69,18 @@
{
name = [[avDevice_ localizedName] UTF8String];
+ available_sizes_.reserve(avDevice_.formats.count);
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);
+ available_sizes_.emplace_back(dimensions.width, dimensions.height);
}
- // Set default settings
- applySettings(VideoSettings());
}
-OSXVideoSize::OSXVideoSize(const unsigned width, const unsigned height) :
- width(width), height(height) {}
-
-void
-VideoDeviceImpl::applySettings(VideoSettings settings)
-{
-//TODO: add framerate
-// rate_ = size_.getRate(settings["rate"]);
- current_size_ = extractSize(settings.video_size);
-}
-
-const OSXVideoSize
-VideoDeviceImpl::extractSize(const std::string &name) const
+VideoSize
+VideoDeviceImpl::extractSize(VideoSize size) const
{
for (const auto item : available_sizes_) {
- std::stringstream ss;
- ss << item.width << "x" << item.height;
- if (ss.str() == name)
+ if (item.first == size.first && item.second == size.second)
return item;
}
@@ -114,19 +88,19 @@
if (!available_sizes_.empty()) {
return available_sizes_.back();
}
- return OSXVideoSize(-1, -1);
+ return VideoSize(0, 0);
}
-
DeviceParams
VideoDeviceImpl::getDeviceParams() const
{
DeviceParams params;
+ params.name = [[avDevice_ localizedName] UTF8String];
params.input = "[" + device + "]";
params.format = "avfoundation";
- params.width = current_size_.width;
- params.height = current_size_.height;
+ params.width = current_size_.first;
+ params.height = current_size_.second;
auto format = [avDevice_ activeFormat];
auto frameRate = (AVFrameRateRange*)
@@ -135,21 +109,41 @@
return params;
}
-VideoSettings
-VideoDeviceImpl::getSettings() const
+void
+VideoDeviceImpl::setDeviceParams(const DeviceParams& params)
{
- VideoSettings settings;
+//TODO: add framerate
+// rate_ = size_.getRate(settings["rate"]);
+ current_size_ = extractSize({params.width, params.height});
+}
- settings.name = [[avDevice_ localizedName] UTF8String];
+std::vector<VideoSize>
+VideoDeviceImpl::getSizeList() const
+{
+ return getSizeList("default");
+}
+std::vector<FrameRate>
+VideoDeviceImpl::getRateList(const std::string& channel, VideoSize size) const
+{
auto format = [avDevice_ activeFormat];
- auto frameRate = (AVFrameRateRange*)
- [format.videoSupportedFrameRateRanges objectAtIndex:0];
- settings.framerate = frameRate.maxFrameRate;
- settings.video_size = std::to_string(current_size_.width) +
- "x" + std::to_string(current_size_.height);
+ std::vector<FrameRate> v;
+ v.reserve(format.videoSupportedFrameRateRanges.count);
+ for (AVFrameRateRange* frameRateRange in format.videoSupportedFrameRateRanges)
+ v.emplace_back(frameRateRange.maxFrameRate);
+ return v;
+}
- return settings;
+std::vector<VideoSize>
+VideoDeviceImpl::getSizeList(const std::string& channel) const
+{
+ return available_sizes_;
+}
+
+std::vector<std::string>
+VideoDeviceImpl::getChannelList() const
+{
+ return {"default"};
}
VideoDevice::VideoDevice(const std::string& path) :
@@ -166,66 +160,27 @@
}
void
-VideoDevice::applySettings(VideoSettings settings)
+VideoDevice::setDeviceParams(const DeviceParams& params)
{
- deviceImpl_->applySettings(settings);
-}
-
-VideoSettings
-VideoDevice::getSettings() const
-{
- return deviceImpl_->getSettings();
+ return deviceImpl_->setDeviceParams(params);
}
std::vector<std::string>
-VideoDeviceImpl::getSizeList() const
+VideoDevice::getChannelList() const
{
- return getSizeList("default");
+ return deviceImpl_->getChannelList();
}
-std::vector<std::string>
-VideoDeviceImpl::getRateList(const std::string& channel, const std::string& size) const
+std::vector<VideoSize>
+VideoDevice::getSizeList(const std::string& channel) const
{
- auto format = [avDevice_ activeFormat];
- std::vector<std::string> v;
-
- for (AVFrameRateRange* frameRateRange in format.videoSupportedFrameRateRanges) {
- std::stringstream ss;
- ss << frameRateRange.maxFrameRate;
- v.push_back(ss.str());
- }
- return v;
+ return deviceImpl_->getSizeList(channel);
}
-std::vector<std::string>
-VideoDeviceImpl::getSizeList(const std::string& channel) const
+std::vector<FrameRate>
+VideoDevice::getRateList(const std::string& channel, VideoSize size) const
{
- std::vector<std::string> v;
-
- for (const auto &item : available_sizes_) {
- std::stringstream ss;
- ss << item.width << "x" << item.height;
- v.push_back(ss.str());
- }
-
- return v;
-}
-
-std::vector<std::string> VideoDeviceImpl::getChannelList() const
-{
- return {"default"};
-}
-
-DRing::VideoCapabilities
-VideoDevice::getCapabilities() const
-{
- DRing::VideoCapabilities cap;
-
- for (const auto& chan : deviceImpl_->getChannelList())
- for (const auto& size : deviceImpl_->getSizeList(chan))
- cap[chan][size] = deviceImpl_->getRateList(chan, size);
-
- return cap;
+ return deviceImpl_->getRateList(channel, size);
}
VideoDevice::~VideoDevice()