From cd22df09c9c0abe1a3b93fb80c031170107118d7 Mon Sep 17 00:00:00 2001 From: jpark37 Date: Sun, 20 Feb 2022 20:31:30 -0800 Subject: [PATCH] libobs, UI: Add SDR white nits option --- UI/data/locale/en-US.ini | 1 + UI/forms/OBSBasicSettings.ui | 100 ++++++++++++++++++++++----------- UI/window-basic-main.cpp | 3 + UI/window-basic-settings.cpp | 5 ++ docs/sphinx/reference-core.rst | 16 +++++- libobs/obs-internal.h | 1 + libobs/obs.c | 14 +++++ libobs/obs.h | 6 ++ 8 files changed, 113 insertions(+), 33 deletions(-) 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);