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