win-dshow: Ignore FFmpeg colorspace if overridden

Verified MJPEG devices are no longer locked to Rec. 601.
This commit is contained in:
jpark37 2022-11-30 22:08:40 -08:00 committed by Jim
parent 3d87b3b948
commit 47f4c18a95
3 changed files with 10 additions and 6 deletions

View file

@ -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,

View file

@ -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);

View file

@ -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;