libobs: Add high-precision sRGB support

This commit is contained in:
jpark37
2022-04-08 17:19:23 -07:00
committed by Jim
parent 848e128435
commit 06111d5b10
10 changed files with 329 additions and 101 deletions
+19 -14
View File
@@ -832,12 +832,16 @@ void obs_transition_video_render2(
static enum gs_color_space mix_spaces(enum gs_color_space a,
enum gs_color_space b)
{
assert((a == GS_CS_SRGB) || (a == GS_CS_709_EXTENDED));
assert((b == GS_CS_SRGB) || (b == GS_CS_709_EXTENDED));
assert((a == GS_CS_SRGB) || (a == GS_CS_SRGB_16F) ||
(a == GS_CS_709_EXTENDED));
assert((b == GS_CS_SRGB) || (b == GS_CS_SRGB_16F) ||
(b == GS_CS_709_EXTENDED));
return ((a == GS_CS_709_EXTENDED) || (b == GS_CS_709_EXTENDED))
? GS_CS_709_EXTENDED
: GS_CS_SRGB;
if ((a == GS_CS_709_EXTENDED) || (b == GS_CS_709_EXTENDED))
return GS_CS_709_EXTENDED;
if ((a == GS_CS_SRGB_16F) || (b == GS_CS_SRGB_16F))
return GS_CS_SRGB_16F;
return GS_CS_SRGB;
}
enum gs_color_space
@@ -846,25 +850,26 @@ obs_transition_video_get_color_space(obs_source_t *transition)
obs_source_t *source0 = transition->transition_sources[0];
obs_source_t *source1 = transition->transition_sources[1];
const enum gs_color_space dual_spaces[] = {
const enum gs_color_space preferred_spaces[] = {
GS_CS_SRGB,
GS_CS_SRGB_16F,
GS_CS_709_EXTENDED,
};
enum gs_color_space space = GS_CS_SRGB;
if (source0) {
space = mix_spaces(space,
obs_source_get_color_space(
source0, OBS_COUNTOF(dual_spaces),
dual_spaces));
space = mix_spaces(space, obs_source_get_color_space(
source0,
OBS_COUNTOF(preferred_spaces),
preferred_spaces));
}
if (source1) {
space = mix_spaces(space,
obs_source_get_color_space(
source1, OBS_COUNTOF(dual_spaces),
dual_spaces));
space = mix_spaces(space, obs_source_get_color_space(
source1,
OBS_COUNTOF(preferred_spaces),
preferred_spaces));
}
return space;