Преглед на файлове

libobs: Default 10-bit video to sRGB instead of PQ

Matches how VLC operates. HDR is only in effect with proper metadata.
jpark37 преди 3 години
родител
ревизия
d233065d60
променени са 2 файла, в които са добавени 25 реда и са изтрити 46 реда
  1. 9 2
      libobs/obs-internal.h
  2. 16 44
      libobs/obs-source.c

+ 9 - 2
libobs/obs-internal.h

@@ -912,8 +912,15 @@ static inline enum gs_color_space convert_video_space(enum video_format format,
 {
 	enum gs_color_space space = GS_CS_SRGB;
 	if (convert_video_format(format, trc) == GS_RGBA16F) {
-		space = (trc == VIDEO_TRC_SRGB) ? GS_CS_SRGB_16F
-						: GS_CS_709_EXTENDED;
+		switch (trc) {
+		case VIDEO_TRC_DEFAULT:
+		case VIDEO_TRC_SRGB:
+			space = GS_CS_SRGB_16F;
+			break;
+		case VIDEO_TRC_PQ:
+		case VIDEO_TRC_HLG:
+			space = GS_CS_709_EXTENDED;
+		}
 	}
 
 	return space;

+ 16 - 44
libobs/obs-source.c

@@ -1560,12 +1560,8 @@ enum convert_type {
 	CONVERT_800,
 	CONVERT_RGB_LIMITED,
 	CONVERT_BGR3,
-	CONVERT_I010_SRGB,
-	CONVERT_I010_PQ_2020_709,
-	CONVERT_I010_HLG_2020_709,
-	CONVERT_P010_SRGB,
-	CONVERT_P010_PQ_2020_709,
-	CONVERT_P010_HLG_2020_709,
+	CONVERT_I010,
+	CONVERT_P010,
 };
 
 static inline enum convert_type get_convert_type(enum video_format format,
@@ -1617,27 +1613,11 @@ static inline enum convert_type get_convert_type(enum video_format format,
 	case VIDEO_FORMAT_AYUV:
 		return CONVERT_444_A_PACK;
 
-	case VIDEO_FORMAT_I010: {
-		switch (trc) {
-		case VIDEO_TRC_SRGB:
-			return CONVERT_I010_SRGB;
-		case VIDEO_TRC_HLG:
-			return CONVERT_I010_HLG_2020_709;
-		default:
-			return CONVERT_I010_PQ_2020_709;
-		}
-	}
+	case VIDEO_FORMAT_I010:
+		return CONVERT_I010;
 
-	case VIDEO_FORMAT_P010: {
-		switch (trc) {
-		case VIDEO_TRC_SRGB:
-			return CONVERT_P010_SRGB;
-		case VIDEO_TRC_HLG:
-			return CONVERT_P010_HLG_2020_709;
-		default:
-			return CONVERT_P010_PQ_2020_709;
-		}
-	}
+	case VIDEO_FORMAT_P010:
+		return CONVERT_P010;
 	}
 
 	return CONVERT_NONE;
@@ -1979,14 +1959,10 @@ static inline bool init_gpu_conversion(struct obs_source *source,
 	case CONVERT_444_A_PACK:
 		return set_packed444_alpha_sizes(source, frame);
 
-	case CONVERT_I010_SRGB:
-	case CONVERT_I010_PQ_2020_709:
-	case CONVERT_I010_HLG_2020_709:
+	case CONVERT_I010:
 		return set_i010_sizes(source, frame);
 
-	case CONVERT_P010_SRGB:
-	case CONVERT_P010_PQ_2020_709:
-	case CONVERT_P010_HLG_2020_709:
+	case CONVERT_P010:
 		return set_p010_sizes(source, frame);
 
 	case CONVERT_NONE:
@@ -2079,12 +2055,8 @@ static void upload_raw_frame(gs_texture_t *tex[MAX_AV_PLANES],
 	case CONVERT_444_A:
 	case CONVERT_444P12LE_A:
 	case CONVERT_444_A_PACK:
-	case CONVERT_I010_SRGB:
-	case CONVERT_I010_PQ_2020_709:
-	case CONVERT_I010_HLG_2020_709:
-	case CONVERT_P010_SRGB:
-	case CONVERT_P010_PQ_2020_709:
-	case CONVERT_P010_HLG_2020_709:
+	case CONVERT_I010:
+	case CONVERT_P010:
 		for (size_t c = 0; c < MAX_AV_PLANES; c++) {
 			if (tex[c])
 				gs_texture_set_image(tex[c], frame->data[c],
@@ -2153,23 +2125,23 @@ static const char *select_conversion_technique(enum video_format format,
 
 	case VIDEO_FORMAT_I010: {
 		switch (trc) {
-		case VIDEO_TRC_SRGB:
-			return "I010_SRGB_Reverse";
+		case VIDEO_TRC_PQ:
+			return "I010_PQ_2020_709_Reverse";
 		case VIDEO_TRC_HLG:
 			return "I010_HLG_2020_709_Reverse";
 		default:
-			return "I010_PQ_2020_709_Reverse";
+			return "I010_SRGB_Reverse";
 		}
 	}
 
 	case VIDEO_FORMAT_P010: {
 		switch (trc) {
-		case VIDEO_TRC_SRGB:
-			return "P010_SRGB_Reverse";
+		case VIDEO_TRC_PQ:
+			return "P010_PQ_2020_709_Reverse";
 		case VIDEO_TRC_HLG:
 			return "P010_HLG_2020_709_Reverse";
 		default:
-			return "P010_PQ_2020_709_Reverse";
+			return "P010_SRGB_Reverse";
 		}
 	}