Browse Source

win-dshow: Ignore FFmpeg colorspace if overridden

Verified MJPEG devices are no longer locked to Rec. 601.
jpark37 3 years ago
parent
commit
47f4c18a95

+ 6 - 4
plugins/win-dshow/ffmpeg-decode.c

@@ -312,7 +312,7 @@ convert_color_space(enum AVColorSpace s, enum AVColorTransferCharacteristic trc,
 }
 
 bool ffmpeg_decode_video(struct ffmpeg_decode *decode, uint8_t *data,
-			 size_t size, long long *ts,
+			 size_t size, long long *ts, enum video_colorspace cs,
 			 enum video_range_type range,
 			 struct obs_source_frame2 *frame, bool *got_output)
 {
@@ -396,9 +396,11 @@ bool ffmpeg_decode_video(struct ffmpeg_decode *decode, uint8_t *data,
 				: VIDEO_RANGE_PARTIAL;
 	}
 
-	const enum video_colorspace cs = convert_color_space(
-		decode->frame->colorspace, decode->frame->color_trc,
-		decode->frame->color_primaries);
+	if (cs == VIDEO_CS_DEFAULT) {
+		cs = convert_color_space(decode->frame->colorspace,
+					 decode->frame->color_trc,
+					 decode->frame->color_primaries);
+	}
 
 	const bool success = video_format_get_parameters_for_format(
 		cs, range, format, frame->color_matrix, frame->color_range_min,

+ 1 - 0
plugins/win-dshow/ffmpeg-decode.h

@@ -59,6 +59,7 @@ extern bool ffmpeg_decode_audio(struct ffmpeg_decode *decode, uint8_t *data,
 
 extern bool ffmpeg_decode_video(struct ffmpeg_decode *decode, uint8_t *data,
 				size_t size, long long *ts,
+				enum video_colorspace cs,
 				enum video_range_type range,
 				struct obs_source_frame2 *frame,
 				bool *got_output);

+ 3 - 2
plugins/win-dshow/win-dshow.cpp

@@ -198,6 +198,7 @@ struct DShowInput {
 	VideoConfig videoConfig;
 	AudioConfig audioConfig;
 
+	enum video_colorspace cs;
 	obs_source_frame2 frame;
 	obs_source_audio audio;
 	long lastRotation = 0;
@@ -505,7 +506,7 @@ void DShowInput::OnEncodedVideoData(enum AVCodecID id, unsigned char *data,
 	}
 
 	bool got_output;
-	bool success = ffmpeg_decode_video(video_decoder, data, size, &ts,
+	bool success = ffmpeg_decode_video(video_decoder, data, size, &ts, cs,
 					   frame.range, &frame, &got_output);
 	if (!success) {
 		blog(LOG_WARNING, "Error decoding video");
@@ -1155,7 +1156,7 @@ inline bool DShowInput::Activate(obs_data_t *settings)
 	if (device.Start() != Result::Success)
 		return false;
 
-	const enum video_colorspace cs = GetColorSpace(settings);
+	cs = GetColorSpace(settings);
 	const enum video_range_type range = GetColorRange(settings);
 
 	enum video_trc trc = VIDEO_TRC_DEFAULT;