From da836c01c9262430d2696ac108d956fd248cb600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 22 Mar 2025 10:55:03 +0200 Subject: [PATCH] dav1ddec: Only update unknown parts of the upstream colorimetry and not all of it And also don't replace the whole upstream video-info but modify it. Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/673 Part-of: --- video/dav1d/src/dav1ddec/imp.rs | 50 ++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/video/dav1d/src/dav1ddec/imp.rs b/video/dav1d/src/dav1ddec/imp.rs index 8495ad9e1..ca7defdc8 100644 --- a/video/dav1d/src/dav1ddec/imp.rs +++ b/video/dav1d/src/dav1ddec/imp.rs @@ -293,32 +293,56 @@ impl Dav1dDec { ); let input_state = state.input_state.clone(); - let input_info = input_state.info(); let input_caps = input_state.caps().ok_or(gst::FlowError::NotNegotiated)?; let input_structure = input_caps .structure(0) .ok_or(gst::FlowError::NotNegotiated)?; - let input_colorimetry = input_info.colorimetry(); drop(state_guard); let instance = self.obj(); let mut output_state = instance.set_output_state(format, pic.width(), pic.height(), Some(&input_state))?; - let mut info_builder = gst_video::VideoInfo::builder(format, pic.width(), pic.height()); + let info = output_state.info(); + let mut info_builder = gst_video::VideoInfo::builder_from_info(&info); let mut update_output_state = false; - let colorimetry = self.colorimetry_from_dav1d_picture(pic); - if !input_structure.has_field("colorimetry") - || input_colorimetry.range() == gst_video::VideoColorRange::Unknown - || input_colorimetry.matrix() == gst_video::VideoColorMatrix::Unknown - || input_colorimetry.transfer() == gst_video::VideoTransferFunction::Unknown - || input_colorimetry.primaries() == gst_video::VideoColorPrimaries::Unknown - { - if let Some(colorimetry) = colorimetry.as_ref() { - info_builder = info_builder.colorimetry(colorimetry); - update_output_state = true; + let input_colorimetry = info.colorimetry(); + let dec_colorimetry = self.colorimetry_from_dav1d_picture(pic); + if let Some(ref dec_colorimetry) = dec_colorimetry { + let mut range = input_colorimetry.range(); + let mut matrix = input_colorimetry.matrix(); + let mut transfer = input_colorimetry.transfer(); + let mut primaries = input_colorimetry.primaries(); + + if !input_structure.has_field("colorimetry") + || range == gst_video::VideoColorRange::Unknown + { + range = dec_colorimetry.range(); } + + if !input_structure.has_field("colorimetry") + || matrix == gst_video::VideoColorMatrix::Unknown + { + matrix = dec_colorimetry.matrix(); + } + + if !input_structure.has_field("colorimetry") + || transfer == gst_video::VideoTransferFunction::Unknown + { + transfer = dec_colorimetry.transfer(); + } + + if !input_structure.has_field("colorimetry") + || primaries == gst_video::VideoColorPrimaries::Unknown + { + primaries = dec_colorimetry.primaries(); + } + + info_builder = info_builder.colorimetry(&gst_video::VideoColorimetry::new( + range, matrix, transfer, primaries, + )); + update_output_state = true; } if !input_structure.has_field("chroma-site") {