From bbe2df07e4478ee4152d336a995b17f7fbe172d9 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Sat, 18 Apr 2026 21:17:46 -0400 Subject: [PATCH] fix(rtsp): ignore clientRefreshRateX100 if more than 1% variance from framerate Co-Authored-By: Andy Grundman <105828+andygrundman@users.noreply.github.com> --- src/rtsp.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/rtsp.cpp b/src/rtsp.cpp index 754ada23c73..4dd8b12c8e0 100644 --- a/src/rtsp.cpp +++ b/src/rtsp.cpp @@ -990,6 +990,16 @@ namespace rtsp_stream { config.monitor.width = (int) util::from_view(args.at("x-nv-video[0].clientViewportWd"sv)); config.monitor.framerate = (int) util::from_view(args.at("x-nv-video[0].maxFPS"sv)); config.monitor.framerateX100 = (int) util::from_view(args.at("x-nv-video[0].clientRefreshRateX100"sv)); + // Validate framerateX100 against framerate. Some clients (e.g. Moonlight Android) send the + // client display's refresh rate as clientRefreshRateX100, which may differ from the requested + // streaming framerate. Discard framerateX100 if the derived fps is not within 1% of framerate. + if (config.monitor.framerateX100 > 0) { + double fps_strict = config.monitor.framerateX100 / 100.0; + double ratio = fps_strict / config.monitor.framerate; + if (ratio < 0.99 || ratio > 1.01) { + config.monitor.framerateX100 = 0; + } + } config.monitor.bitrate = (int) util::from_view(args.at("x-nv-vqos[0].bw.maximumBitrateKbps"sv)); config.monitor.slicesPerFrame = (int) util::from_view(args.at("x-nv-video[0].videoEncoderSlicesPerFrame"sv)); config.monitor.numRefFrames = (int) util::from_view(args.at("x-nv-video[0].maxNumReferenceFrames"sv));