diff --git a/plugins/obs-filters/color-correction-filter.c b/plugins/obs-filters/color-correction-filter.c index 9b4656368..ba3fab393 100644 --- a/plugins/obs-filters/color-correction-filter.c +++ b/plugins/obs-filters/color-correction-filter.c @@ -20,6 +20,7 @@ along with this program. If not, see . /* clang-format off */ +#define SETTING_SDR_ONLY_INFO "sdr_only_info" #define SETTING_GAMMA "gamma" #define SETTING_CONTRAST "contrast" #define SETTING_BRIGHTNESS "brightness" @@ -30,6 +31,7 @@ along with this program. If not, see . #define SETTING_COLOR_MULTIPLY "color_multiply" #define SETTING_COLOR_ADD "color_add" +#define TEXT_SDR_ONLY_INFO obs_module_text("SdrOnlyInfo") #define TEXT_GAMMA obs_module_text("Gamma") #define TEXT_CONTRAST obs_module_text("Contrast") #define TEXT_BRIGHTNESS obs_module_text("Brightness") @@ -599,25 +601,41 @@ static void color_correction_filter_render_v1(void *data, gs_effect_t *effect) static void color_correction_filter_render_v2(void *data, gs_effect_t *effect) { + UNUSED_PARAMETER(effect); + struct color_correction_filter_data_v2 *filter = data; - if (!obs_source_process_filter_begin(filter->context, GS_RGBA, - OBS_ALLOW_DIRECT_RENDERING)) - return; + const enum gs_color_space preferred_spaces[] = { + GS_CS_SRGB, + GS_CS_SRGB_16F, + GS_CS_709_EXTENDED, + }; - /* Now pass the interface variables to the .effect file. */ - gs_effect_set_float(filter->gamma_param, filter->gamma); - gs_effect_set_matrix4(filter->final_matrix_param, - &filter->final_matrix); + const enum gs_color_space source_space = obs_source_get_color_space( + obs_filter_get_parent(filter->context), + OBS_COUNTOF(preferred_spaces), preferred_spaces); + if (source_space == GS_CS_709_EXTENDED) { + obs_source_skip_video_filter(filter->context); + } else { + const enum gs_color_format format = + gs_get_format_from_space(source_space); + if (obs_source_process_filter_begin_with_color_space( + filter->context, format, source_space, + OBS_ALLOW_DIRECT_RENDERING)) { + /* Now pass the interface variables to the .effect file. */ + gs_effect_set_float(filter->gamma_param, filter->gamma); + gs_effect_set_matrix4(filter->final_matrix_param, + &filter->final_matrix); - gs_blend_state_push(); - gs_blend_function(GS_BLEND_ONE, GS_BLEND_INVSRCALPHA); + gs_blend_state_push(); + gs_blend_function(GS_BLEND_ONE, GS_BLEND_INVSRCALPHA); - obs_source_process_filter_end(filter->context, filter->effect, 0, 0); + obs_source_process_filter_end(filter->context, + filter->effect, 0, 0); - gs_blend_state_pop(); - - UNUSED_PARAMETER(effect); + gs_blend_state_pop(); + } + } } /* @@ -654,6 +672,9 @@ static obs_properties_t *color_correction_filter_properties_v2(void *data) { obs_properties_t *props = obs_properties_create(); + obs_properties_add_text(props, SETTING_SDR_ONLY_INFO, + TEXT_SDR_ONLY_INFO, OBS_TEXT_INFO); + obs_properties_add_float_slider(props, SETTING_GAMMA, TEXT_GAMMA, -3.0, 3.0, 0.01); @@ -706,6 +727,23 @@ static void color_correction_filter_defaults_v2(obs_data_t *settings) obs_data_set_default_int(settings, SETTING_COLOR_ADD, 0x00000000); } +static enum gs_color_space color_correction_filter_get_color_space( + void *data, size_t count, const enum gs_color_space *preferred_spaces) +{ + const enum gs_color_space potential_spaces[] = { + GS_CS_SRGB, + GS_CS_SRGB_16F, + GS_CS_709_EXTENDED, + }; + + struct color_correction_filter_data_v2 *const filter = data; + const enum gs_color_space source_space = obs_source_get_color_space( + obs_filter_get_parent(filter->context), + OBS_COUNTOF(potential_spaces), potential_spaces); + + return source_space; +} + /* * So how does OBS keep track of all these plug-ins/filters? How does OBS know * which function to call when it needs to update a setting? Or a source? Or @@ -741,4 +779,5 @@ struct obs_source_info color_filter_v2 = { .update = color_correction_filter_update_v2, .get_properties = color_correction_filter_properties_v2, .get_defaults = color_correction_filter_defaults_v2, + .video_get_color_space = color_correction_filter_get_color_space, }; diff --git a/plugins/obs-filters/data/locale/en-US.ini b/plugins/obs-filters/data/locale/en-US.ini index 2faf242db..9f349a6a3 100644 --- a/plugins/obs-filters/data/locale/en-US.ini +++ b/plugins/obs-filters/data/locale/en-US.ini @@ -30,6 +30,7 @@ Opacity="Opacity" Contrast="Contrast" Brightness="Brightness" Gamma="Gamma" +SdrOnlyInfo="Info: Settings only apply to SDR video." BrowsePath.Images="All Image Files" BrowsePath.AllFiles="All Files" KeyColorType="Key Color Type"