diff --git a/src/media/video/osxvideo/video_device_impl.mm b/src/media/video/osxvideo/video_device_impl.mm
index d205ee8c8a81a49404cc3f3b6925e88562b0b542..df114bf069f102084dca6233922a7e510b1ec58f 100644
--- a/src/media/video/osxvideo/video_device_impl.mm
+++ b/src/media/video/osxvideo/video_device_impl.mm
@@ -59,7 +59,8 @@ class VideoDeviceImpl {
         FrameRate rate_ {};
         std::map<VideoSize, std::vector<FrameRate>> available_rates_;
         FrameRate desktopFrameRate_ = {30};
-        std::vector<FrameRate> desktopFrameRates_ = {FrameRate(5),
+        std::vector<FrameRate> desktopFrameRates_ = {FrameRate(1),
+                                                     FrameRate(5),
                                                      FrameRate(10),
                                                      FrameRate(15),
                                                      FrameRate(20),
diff --git a/src/media/video/v4l2/video_device_impl.cpp b/src/media/video/v4l2/video_device_impl.cpp
index 9a2f3497e3fca0110387ef7211180bc4087566d3..1bd9db2cab8e80d904f25714fdfb533f49946997 100644
--- a/src/media/video/v4l2/video_device_impl.cpp
+++ b/src/media/video/v4l2/video_device_impl.cpp
@@ -537,7 +537,8 @@ vector<FrameRate>
 VideoDeviceImpl::getRateList(const string& channel, VideoSize size) const
 {
     if (unique_id == DEVICE_DESKTOP) {
-        return {FrameRate(5),
+        return {FrameRate(1),
+                FrameRate(5),
                 FrameRate(10),
                 FrameRate(15),
                 FrameRate(20),
diff --git a/src/media/video/video_input.cpp b/src/media/video/video_input.cpp
index 90404cbe26a5563c31eb7b0dbe294a1d23ec6533..423c0e2db22ca9c10766ff279bf2f5fdbd566d4c 100644
--- a/src/media/video/video_input.cpp
+++ b/src/media/video/video_input.cpp
@@ -433,9 +433,18 @@ VideoInput::initLinuxGrab(const std::string& display)
 
     DeviceParams p = jami::getVideoDeviceMonitor().getDeviceParams(DEVICE_DESKTOP);
     if (winIdPos != std::string::npos) {
-        p.window_id = display.substr(winIdPos + windowIdStr.size()); // "0x0340021e";
+        size_t endPos = display.find(' ', winIdPos + windowIdStr.size());
+        p.window_id = display.substr(winIdPos + windowIdStr.size(),
+                                     endPos - (winIdPos + windowIdStr.size())); // "0x0340021e";
         p.is_area = 0;
     }
+    std::string fpsStr = "fps:";
+    if (display.find(fpsStr) != std::string::npos) {
+        size_t fpsPos = display.find(fpsStr) + fpsStr.size();
+        int fps = std::stoi(display.substr(fpsPos));
+        p.framerate = fps;
+        JAMI_LOG("Custom framerate set to {} fps", fps);
+    }
     if (display.find("pipewire") != std::string::npos) {
         std::string pidStr = "pid:";
         std::string fdStr = "fd:";
@@ -534,8 +543,11 @@ VideoInput::initWindowsGrab(const std::string& display)
 
     DeviceParams p = jami::getVideoDeviceMonitor().getDeviceParams(DEVICE_DESKTOP);
     if (winHandlePos != std::string::npos) {
-        p.input = display.substr(winHandlePos + windowIdStr.size()); // "HANDLE";
-        p.name = display.substr(winHandlePos + windowIdStr.size());  // "HANDLE";
+        size_t endPos = display.find(' ', winHandlePos + windowIdStr.size());
+        p.input = display.substr(winHandlePos + windowIdStr.size(),
+                                 endPos - (winHandlePos + windowIdStr.size())); // "HANDLE";
+        p.name = display.substr(winHandlePos + windowIdStr.size(),
+                                endPos - (winHandlePos + windowIdStr.size())); // "HANDLE";
         p.is_area = 0;
     } else {
         p.input = display.substr(1);
@@ -562,6 +574,13 @@ VideoInput::initWindowsGrab(const std::string& display)
             p.height = default_grab_height;
         }
     }
+    std::string fpsStr = "fps:";
+    if (display.find(fpsStr) != std::string::npos) {
+        size_t fpsPos = display.find(fpsStr) + fpsStr.size();
+        int fps = std::stoi(display.substr(fpsPos));
+        p.framerate = fps;
+        JAMI_LOG("Custom framerate set to {} fps", fps);
+    }
 
     auto dec = std::make_unique<MediaDecoder>();
     if (dec->openInput(p) < 0 || dec->setupVideo() < 0)
diff --git a/src/media/video/winvideo/video_device_impl.cpp b/src/media/video/winvideo/video_device_impl.cpp
index f614d97f3beb9b4a6e20074a26163b55c4c3ba98..4d44818efe731682c14f5c3650cc61a957db2025 100644
--- a/src/media/video/winvideo/video_device_impl.cpp
+++ b/src/media/video/winvideo/video_device_impl.cpp
@@ -80,7 +80,8 @@ VideoDeviceImpl::setup()
         name = DEVICE_DESKTOP;
         VideoSize size {0, 0};
         sizeList_.emplace_back(size);
-        rateList_[size] = {FrameRate(5),
+        rateList_[size] = {FrameRate(1),
+                           FrameRate(5),
                            FrameRate(10),
                            FrameRate(15),
                            FrameRate(20),