From b4167b175b374ce84cd58ebdb2ca6cd79fc0b333 Mon Sep 17 00:00:00 2001
From: kkostiuk <kateryna.kostiuk@savoirfairelinux.com>
Date: Fri, 26 Nov 2021 17:36:02 -0500
Subject: [PATCH] screensharing: add framerate for macOS

Change-Id: I2a22e80a8ea826641afef9a82bf3b17ca35fcaed
---
 src/media/video/osxvideo/video_device_impl.mm | 29 ++++++++++++++++++-
 .../osxvideo/video_device_monitor_impl.mm     |  1 +
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/src/media/video/osxvideo/video_device_impl.mm b/src/media/video/osxvideo/video_device_impl.mm
index 7888c21664..09053d3e76 100644
--- a/src/media/video/osxvideo/video_device_impl.mm
+++ b/src/media/video/osxvideo/video_device_impl.mm
@@ -61,6 +61,16 @@ class VideoDeviceImpl {
         VideoSize current_size_;
         FrameRate rate_ {};
         std::map<VideoSize, std::vector<FrameRate>> available_rates_;
+        FrameRate desktopFrameRate_ = {30};
+        std::vector<FrameRate> desktopFrameRates_ = {FrameRate(5),
+                                                     FrameRate(10),
+                                                     FrameRate(15),
+                                                     FrameRate(20),
+                                                     FrameRate(25),
+                                                     FrameRate(30),
+                                                     FrameRate(60),
+                                                     FrameRate(120),
+                                                     FrameRate(144)};
 };
 
 VideoDeviceImpl::VideoDeviceImpl(const std::string& uniqueID)
@@ -69,6 +79,14 @@ VideoDeviceImpl::VideoDeviceImpl(const std::string& uniqueID)
     , avDevice_([AVCaptureDevice deviceWithUniqueID:
         [NSString stringWithCString:uniqueID.c_str() encoding:[NSString defaultCStringEncoding]]])
 {
+
+    if (id == DEVICE_DESKTOP) {
+          name = DEVICE_DESKTOP;
+          VideoSize size {0, 0};
+          available_sizes_.emplace_back(size);
+          available_rates_[size] = desktopFrameRates_;
+          return;
+      }
     name = [[avDevice_ localizedName] UTF8String];
 
     available_sizes_.reserve(avDevice_.formats.count);
@@ -111,9 +129,13 @@ DeviceParams
 VideoDeviceImpl::getDeviceParams() const
 {
     DeviceParams params;
-    params.name = [[avDevice_ localizedName] UTF8String];
     params.unique_id = id;
     params.input = id;
+    if (id == DEVICE_DESKTOP) {
+        params.framerate = desktopFrameRate_;
+        return params;
+    }
+    params.name = [[avDevice_ localizedName] UTF8String];
     params.framerate = rate_;
     params.format = "avfoundation";
     params.pixel_format = "nv12";
@@ -125,6 +147,11 @@ VideoDeviceImpl::getDeviceParams() const
 void
 VideoDeviceImpl::setDeviceParams(const DeviceParams& params)
 {
+    if (id == DEVICE_DESKTOP) {
+        name = DEVICE_DESKTOP;
+        desktopFrameRate_ = params.framerate;
+        return;
+    }
     rate_ = params.framerate;
     current_size_ = extractSize({params.width, params.height});
 }
diff --git a/src/media/video/osxvideo/video_device_monitor_impl.mm b/src/media/video/osxvideo/video_device_monitor_impl.mm
index f5908dbf50..9910c0208d 100644
--- a/src/media/video/osxvideo/video_device_monitor_impl.mm
+++ b/src/media/video/osxvideo/video_device_monitor_impl.mm
@@ -127,6 +127,7 @@ VideoDeviceMonitor::VideoDeviceMonitor() :
     monitorImpl_(new VideoDeviceMonitorImpl(this))
 {
     monitorImpl_->start();
+    addDevice(DEVICE_DESKTOP, {});
 }
 
 VideoDeviceMonitor::~VideoDeviceMonitor()
-- 
GitLab