diff --git a/docs/configuration.md b/docs/configuration.md
index f5e31f727f0..1f31d74c3e4 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -1316,6 +1316,29 @@ editing the `conf` file in a text editor. Use the examples as reference.
+### max_bitrate
+
+
+
+ Description
+
+ The maximum bitrate (in Kbps) that Sunshine will encode the stream at. If set to 0, it will always use the bitrate requested by Moonlight.
+
+
+
+ Default
+ @code{}
+ 0
+ @endcode
+
+
+ Example
+ @code{}
+ max_bitrate = 5000
+ @endcode
+
+
+
### min_fps_factor
diff --git a/src/config.cpp b/src/config.cpp
index 5809fc16eec..e97de9f523d 100644
--- a/src/config.cpp
+++ b/src/config.cpp
@@ -509,7 +509,8 @@ namespace config {
{} // wa
}, // display_device
- 1 // min_fps_factor
+ 1, // min_fps_factor
+ 0 // max_bitrate
};
audio_t audio {
@@ -1138,6 +1139,7 @@ namespace config {
bool_f(vars, "dd_wa_hdr_toggle", video.dd.wa.hdr_toggle);
int_between_f(vars, "min_fps_factor", video.min_fps_factor, {1, 3});
+ int_f(vars, "max_bitrate", video.max_bitrate);
path_f(vars, "pkey", nvhttp.pkey);
path_f(vars, "cert", nvhttp.cert);
diff --git a/src/config.h b/src/config.h
index 7b06e234fbb..fe6629da3b4 100644
--- a/src/config.h
+++ b/src/config.h
@@ -138,6 +138,7 @@ namespace config {
} dd;
int min_fps_factor; // Minimum fps target, determines minimum frame time
+ int max_bitrate; // Maximum bitrate, sets ceiling in kbps for bitrate requested from client
};
struct audio_t {
diff --git a/src/video.cpp b/src/video.cpp
index f06e2360332..f75cfa34d7f 100644
--- a/src/video.cpp
+++ b/src/video.cpp
@@ -1687,7 +1687,8 @@ namespace video {
}
}
- auto bitrate = config.bitrate * 1000;
+ auto bitrate = ((config::video.max_bitrate > 0) ? std::min(config.bitrate, config::video.max_bitrate) : config.bitrate) * 1000;
+ BOOST_LOG(info) << "Max bitrate is " << config::video.max_bitrate;
ctx->rc_max_rate = bitrate;
ctx->bit_rate = bitrate;
diff --git a/src_assets/common/assets/web/config.html b/src_assets/common/assets/web/config.html
index 3b74b922306..8fd43c4101f 100644
--- a/src_assets/common/assets/web/config.html
+++ b/src_assets/common/assets/web/config.html
@@ -179,6 +179,7 @@ {{ $t('config.configuration') }}
"dd_mode_remapping": {"mixed": [], "resolution_only": [], "refresh_rate_only": []},
"dd_wa_hdr_toggle": "disabled",
"min_fps_factor": 1,
+ "max_bitrate": 0,
},
},
{
diff --git a/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayModesSettings.vue b/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayModesSettings.vue
index c74d4a6c1b5..2bf997baea6 100644
--- a/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayModesSettings.vue
+++ b/src_assets/common/assets/web/configs/tabs/audiovideo/DisplayModesSettings.vue
@@ -17,6 +17,13 @@ const config = ref(props.config)
{{ $t('config.min_fps_factor_desc') }}
+
+
+
+
{{ $t("config.max_bitrate") }}
+
+
{{ $t("config.max_bitrate_desc") }}
+