diff --git a/utils/livesync/src/livesync/imp.rs b/utils/livesync/src/livesync/imp.rs index f4d644a7..e02de58d 100644 --- a/utils/livesync/src/livesync/imp.rs +++ b/utils/livesync/src/livesync/imp.rs @@ -39,7 +39,12 @@ fn audio_info_from_caps( fn duration_from_caps(caps: &gst::CapsRef) -> Option { caps.structure(0) .filter(|s| s.name().starts_with("video/") || s.name().starts_with("image/")) - .and_then(|s| s.get::("framerate").ok()) + .and_then(|s| { + s.get::("framerate") + .ok() + .filter(|f| f.denom() != 1 || f.numer() != 0) + .or_else(|| s.get::("max-framerate").ok()) + }) .filter(|framerate| framerate.denom() > 0 && framerate.numer() > 0) .and_then(|framerate| { gst::ClockTime::SECOND.mul_div_round(framerate.denom() as u64, framerate.numer() as u64) diff --git a/utils/livesync/tests/livesync.rs b/utils/livesync/tests/livesync.rs index f768e462..bf75b4c2 100644 --- a/utils/livesync/tests/livesync.rs +++ b/utils/livesync/tests/livesync.rs @@ -120,6 +120,32 @@ fn test_video_negotiate_framerate_fixed() { assert_eq!(current_caps, src_caps); } +#[test] +fn test_video_negotiate_framerate_variable() { + init(); + + let mut h = gst_check::Harness::new("livesync"); + + let src_caps = gst::Caps::builder("video/x-raw") + .field("framerate", gst::Fraction::new(0, 1)) + .field("max-framerate", gst::Fraction::new(30, 1)) + .build(); + h.set_src_caps(src_caps.clone()); + + h.play(); + + let buffer = gst::Buffer::new(); + assert!(h.push_and_pull(buffer).is_ok()); + + let current_caps = h + .sinkpad() + .expect("harness has no sinkpad") + .current_caps() + .expect("current caps missing"); + + assert_eq!(current_caps, src_caps); +} + fn test_video(singlesegment: bool) { init();