diff options
author | Arun Raghavan <arun@asymptotic.io> | 2022-05-11 16:59:49 +0300 |
---|---|---|
committer | Arun Raghavan <arun@asymptotic.io> | 2022-05-11 17:02:27 +0300 |
commit | 557917b92a398f07435bedbe0d535c4634f28c4a (patch) | |
tree | 88345b4ddc51561ddfcd21a8ffcd4edb597898c4 /video/dav1d | |
parent | 2c3514a5a104bf7c7385516afbfe810146db4391 (diff) |
dav1ddec: Write src_query() in match syntax for easier extensibility
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/698>
Diffstat (limited to 'video/dav1d')
-rw-r--r-- | video/dav1d/src/dav1ddec/imp.rs | 105 |
1 files changed, 53 insertions, 52 deletions
diff --git a/video/dav1d/src/dav1ddec/imp.rs b/video/dav1d/src/dav1ddec/imp.rs index 8b792a187..922b09255 100644 --- a/video/dav1d/src/dav1ddec/imp.rs +++ b/video/dav1d/src/dav1ddec/imp.rs @@ -615,62 +615,63 @@ impl ElementImpl for Dav1dDec { impl VideoDecoderImpl for Dav1dDec { fn src_query(&self, element: &Self::Type, query: &mut gst::QueryRef) -> bool { - if let gst::QueryViewMut::Latency(q) = query.view_mut() { - let state_guard = self.state.lock().unwrap(); - let max_frame_delay = { - let settings = self.settings.lock().unwrap(); - settings.max_frame_delay - }; - - match *state_guard { - Some(ref state) => match state.output_info { - Some(ref info) => { - let mut upstream_latency = gst::query::Latency::new(); - let sinkpad = element.sink_pad(); - - if sinkpad.peer_query(&mut upstream_latency) { - let (live, mut min, mut max) = upstream_latency.result(); - // For autodetection: 1 if live, else whatever dav1d gives us - let frame_latency: u64 = if max_frame_delay < 0 && live { - 1 + match query.view_mut() { + gst::QueryViewMut::Latency(q) => { + let state_guard = self.state.lock().unwrap(); + let max_frame_delay = { + let settings = self.settings.lock().unwrap(); + settings.max_frame_delay + }; + + match *state_guard { + Some(ref state) => match state.output_info { + Some(ref info) => { + let mut upstream_latency = gst::query::Latency::new(); + let sinkpad = element.sink_pad(); + + if sinkpad.peer_query(&mut upstream_latency) { + let (live, mut min, mut max) = upstream_latency.result(); + // For autodetection: 1 if live, else whatever dav1d gives us + let frame_latency: u64 = if max_frame_delay < 0 && live { + 1 + } else { + self.estimate_frame_delay( + max_frame_delay as u32, + state.n_cpus as u32, + ) + .into() + }; + + let fps_n = match info.fps().numer() { + 0 => 30, // Pretend we're at 30fps if we don't know latency, + n => n, + }; + + let latency = frame_latency + * (info.fps().denom() as u64) + * gst::ClockTime::SECOND + / (fps_n as u64); + + gst::debug!(CAT, obj: element, "Reporting latency of {}", latency); + + min += latency; + max = max.opt_add(latency); + q.set(live, min, max); + + true } else { - self.estimate_frame_delay( - max_frame_delay as u32, - state.n_cpus as u32, - ) - .into() - }; - - let fps_n = match info.fps().numer() { - 0 => 30, // Pretend we're at 30fps if we don't know latency, - n => n, - }; - - let latency = frame_latency - * (info.fps().denom() as u64) - * gst::ClockTime::SECOND - / (fps_n as u64); - - gst::debug!(CAT, obj: element, "Reporting latency of {}", latency); - - min += latency; - max = max.opt_add(latency); - q.set(live, min, max); - - true - } else { - // peer latency query failed - false + // peer latency query failed + false + } } - } - // output info not available => fps unknown + // output info not available => fps unknown + None => false, + }, + // no state yet None => false, - }, - // no state yet - None => false, + } } - } else { - VideoDecoderImplExt::parent_src_query(self, element, query) + _ => VideoDecoderImplExt::parent_src_query(self, element, query), } } |