From e0410462e254a9942e545ae0849914f9671f69eb Mon Sep 17 00:00:00 2001 From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> Date: Fri, 28 Jun 2019 17:15:06 -0400 Subject: [PATCH] avmodel: sort resolutions by descending resolution width Change-Id: I348db733613346f3c9f4e5243a354367bda4cddd --- src/api/newvideo.h | 4 ++-- src/avmodel.cpp | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/api/newvideo.h b/src/api/newvideo.h index 7e024df6..5630f1ed 100644 --- a/src/api/newvideo.h +++ b/src/api/newvideo.h @@ -44,14 +44,14 @@ namespace api namespace video { - constexpr static const char PREVIEW_RENDERER_ID[] = "local"; using Channel = std::string; using Resolution = std::string; using Framerate = float; using FrameratesList = std::vector<Framerate>; -using Capabilities = std::map<Channel, std::map<Resolution, FrameratesList>>; +using ResRateList = std::vector<std::pair<Resolution, FrameratesList>>; +using Capabilities = std::map<Channel, ResRateList>; /** * This class is used by Renderer class to expose video data frame diff --git a/src/avmodel.cpp b/src/avmodel.cpp index b099d403..edb159ff 100644 --- a/src/avmodel.cpp +++ b/src/avmodel.cpp @@ -237,16 +237,24 @@ AVModel::getDeviceCapabilities(const std::string& name) const VideoManager::instance().getCapabilities(name.c_str()); video::Capabilities result; for (auto& channel : capabilites.toStdMap()) { - std::map<video::Resolution, video::FrameratesList> channelCapabilities; + video::ResRateList channelCapabilities; for (auto& resToRates : channel.second.toStdMap()) { video::FrameratesList rates; QVectorIterator<QString> itRates(resToRates.second); while (itRates.hasNext()) { rates.emplace_back(itRates.next().toFloat()); } - channelCapabilities.insert( + channelCapabilities.emplace_back( std::make_pair(resToRates.first.toStdString(), rates)); } + // sort by resolution widths + std::sort(channelCapabilities.begin(), channelCapabilities.end(), + [](const std::pair<video::Resolution, video::FrameratesList>& lhs, + const std::pair<video::Resolution, video::FrameratesList>& rhs) { + auto lhsWidth = stoull(lhs.first.substr(0, lhs.first.find("x"))); + auto rhsWidth = stoull(rhs.first.substr(0, rhs.first.find("x"))); + return lhsWidth > rhsWidth; + }); result.insert( std::make_pair(channel.first.toStdString(), channelCapabilities)); } -- GitLab