diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini
index 9993538e1..9f553bcaf 100644
--- a/UI/data/locale/en-US.ini
+++ b/UI/data/locale/en-US.ini
@@ -1036,6 +1036,7 @@ Basic.Settings.Advanced.Video.ColorSpace="Color Space"
Basic.Settings.Advanced.Video.ColorRange="Color Range"
Basic.Settings.Advanced.Video.ColorRange.Partial="Partial"
Basic.Settings.Advanced.Video.ColorRange.Full="Full"
+Basic.Settings.Advanced.Video.SdrWhiteLevel="SDR White Level (nits)"
Basic.Settings.Advanced.Audio.MonitoringDevice="Monitoring Device"
Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Default"
Basic.Settings.Advanced.Audio.DisableAudioDucking="Disable Windows audio ducking"
diff --git a/UI/forms/OBSBasicSettings.ui b/UI/forms/OBSBasicSettings.ui
index 2f4c02e4a..b7b9712f6 100644
--- a/UI/forms/OBSBasicSettings.ui
+++ b/UI/forms/OBSBasicSettings.ui
@@ -4989,35 +4989,15 @@
- -
-
-
- 0
+
-
+
+
+ Basic.Settings.Advanced.Video.ColorSpace
-
- 0
+
+ colorSpace
-
- 0
-
-
- 0
-
-
-
-
-
- DisableOSXVSync
-
-
-
- -
-
-
- ResetOSXVSyncOnExit
-
-
-
-
+
-
@@ -5073,17 +5053,73 @@
- -
-
+
-
+
- Basic.Settings.Advanced.Video.ColorSpace
+ Basic.Settings.Advanced.Video.SdrWhiteLevel
- colorSpace
+ sdrWhiteLevel
- -
+
-
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ 80
+
+
+ 480
+
+
+
+
+
+ -
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ DisableOSXVSync
+
+
+
+ -
+
+
+ ResetOSXVSyncOnExit
+
+
+
+
+
+ -
Qt::Horizontal
diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp
index b36c26f0e..98418aebd 100644
--- a/UI/window-basic-main.cpp
+++ b/UI/window-basic-main.cpp
@@ -1490,6 +1490,7 @@ bool OBSBasic::InitBasicConfigDefaults()
config_set_default_string(basicConfig, "Video", "ColorSpace", "709");
config_set_default_string(basicConfig, "Video", "ColorRange",
"Partial");
+ config_set_default_uint(basicConfig, "Video", "SdrWhiteLevel", 300);
config_set_default_string(basicConfig, "Audio", "MonitoringDeviceId",
"default");
@@ -4392,6 +4393,8 @@ int OBSBasic::ResetVideo()
}
if (ret == OBS_VIDEO_SUCCESS) {
+ obs_set_video_sdr_white_level((float)config_get_uint(
+ basicConfig, "Video", "SdrWhiteLevel"));
OBSBasicStats::InitializeValues();
OBSProjector::UpdateMultiviewProjectors();
}
diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp
index 5f2587ac6..c6d99d74b 100644
--- a/UI/window-basic-settings.cpp
+++ b/UI/window-basic-settings.cpp
@@ -531,6 +531,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
HookWidget(ui->colorFormat, COMBO_CHANGED, ADV_CHANGED);
HookWidget(ui->colorSpace, COMBO_CHANGED, ADV_CHANGED);
HookWidget(ui->colorRange, COMBO_CHANGED, ADV_CHANGED);
+ HookWidget(ui->sdrWhiteLevel, SCROLL_CHANGED, ADV_CHANGED);
HookWidget(ui->disableOSXVSync, CHECK_CHANGED, ADV_CHANGED);
HookWidget(ui->resetOSXVSync, CHECK_CHANGED, ADV_CHANGED);
if (obs_audio_monitoring_available())
@@ -2521,6 +2522,8 @@ void OBSBasicSettings::LoadAdvancedSettings()
config_get_string(main->Config(), "Video", "ColorSpace");
const char *videoColorRange =
config_get_string(main->Config(), "Video", "ColorRange");
+ uint32_t sdrWhiteLevel = (uint32_t)config_get_uint(
+ main->Config(), "Video", "SdrWhiteLevel");
QString monDevName;
QString monDevId;
@@ -2592,6 +2595,7 @@ void OBSBasicSettings::LoadAdvancedSettings()
SetComboByName(ui->colorFormat, videoColorFormat);
SetComboByName(ui->colorSpace, videoColorSpace);
SetComboByValue(ui->colorRange, videoColorRange);
+ ui->sdrWhiteLevel->setValue(sdrWhiteLevel);
if (!SetComboByValue(ui->bindToIP, bindIP))
SetInvalidValue(ui->bindToIP, bindIP, bindIP);
@@ -3297,6 +3301,7 @@ void OBSBasicSettings::SaveAdvancedSettings()
SaveCombo(ui->colorFormat, "Video", "ColorFormat");
SaveCombo(ui->colorSpace, "Video", "ColorSpace");
SaveComboData(ui->colorRange, "Video", "ColorRange");
+ SaveSpinBox(ui->sdrWhiteLevel, "Video", "SdrWhiteLevel");
if (obs_audio_monitoring_available()) {
SaveCombo(ui->monitoringDevice, "Audio",
"MonitoringDeviceName");
diff --git a/docs/sphinx/reference-core.rst b/docs/sphinx/reference-core.rst
index a01b61667..79ba786c5 100644
--- a/docs/sphinx/reference-core.rst
+++ b/docs/sphinx/reference-core.rst
@@ -147,11 +147,25 @@ Initialization, Shutdown, and Information
.. function:: bool obs_get_video_info(struct obs_video_info *ovi)
Gets the current video settings.
-
+
:return: *false* if no video
---------------------
+.. function:: float obs_get_video_sdr_white_level(void)
+
+ Gets the current SDR white level.
+
+ :return: SDR white level, 300.f if no video
+
+---------------------
+
+.. function:: void obs_set_video_sdr_white_level(float sdr_white_level)
+
+ Sets the current SDR white level.
+
+---------------------
+
.. function:: bool obs_get_audio_info(struct obs_audio_info *oai)
Gets the current audio settings.
diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h
index f7f7e3468..cb7aca5fa 100644
--- a/libobs/obs-internal.h
+++ b/libobs/obs-internal.h
@@ -321,6 +321,7 @@ struct obs_core_video {
gs_effect_t *deinterlace_yadif_2x_effect;
struct obs_video_info ovi;
+ uint32_t sdr_white_level;
pthread_mutex_t task_mutex;
struct circlebuf tasks;
diff --git a/libobs/obs.c b/libobs/obs.c
index 7f5fd25bb..4ad3964fc 100644
--- a/libobs/obs.c
+++ b/libobs/obs.c
@@ -1301,6 +1301,20 @@ bool obs_get_video_info(struct obs_video_info *ovi)
return true;
}
+float obs_get_video_sdr_white_level(void)
+{
+ struct obs_core_video *video = &obs->video;
+ return video->graphics ? video->sdr_white_level : 300.f;
+}
+
+void obs_set_video_sdr_white_level(float sdr_white_level)
+{
+ struct obs_core_video *video = &obs->video;
+ assert(video->graphics);
+
+ video->sdr_white_level = (uint32_t)sdr_white_level;
+}
+
bool obs_get_audio_info(struct obs_audio_info *oai)
{
struct obs_core_audio *audio = &obs->audio;
diff --git a/libobs/obs.h b/libobs/obs.h
index 763ede1d4..b6346f185 100644
--- a/libobs/obs.h
+++ b/libobs/obs.h
@@ -410,6 +410,12 @@ EXPORT bool obs_reset_audio(const struct obs_audio_info *oai);
/** Gets the current video settings, returns false if no video */
EXPORT bool obs_get_video_info(struct obs_video_info *ovi);
+/** Gets the SDR white level, returns 300.0 if no video */
+EXPORT float obs_get_video_sdr_white_level(void);
+
+/** Sets the SDR white level */
+EXPORT void obs_set_video_sdr_white_level(float sdr_white_level);
+
/** Gets the current audio settings, returns false if no audio */
EXPORT bool obs_get_audio_info(struct obs_audio_info *oai);