decodebin3: gapless playback not working
See the test app below playing the same video file over using uridecodebin3
.
The file is played fine during the first iteration but not after. I noticed at least two issues:
- Most of the buffers are discarded by the
videoconvert
downstream ofuridecodebin3
:
GST_QOS gstbasetransform.c:2100:default_submit_input_buffer:<videoconvert0> skipping transform: qostime 0:00:00.233000000 <= 0:00:01.934448690
- The buffers reaching the sink are late:
0:00:05.946904496 76793 0x7fe9d4011060 DEBUG GST_PERFORMANCE gstbasesink.c:3134:gst_base_sink_is_too_late:<ximagesink0> buffer is too late 0:00:05.184158822 > 0:00:02.005333333
use gst::prelude::*;
const MKV: &str = "https://gitlab.freedesktop.org/gdesmott/karapulse/-/raw/main/tests/medias/video-2s.mkv?inline=false";
fn main() -> anyhow::Result<()> {
gst::init()?;
let pipeline = gst::Pipeline::new(None);
let uridecodebin = gst::ElementFactory::make("uridecodebin3").build()?;
uridecodebin.set_property("uri", MKV);
let videoconvert = gst::ElementFactory::make("videoconvert").build()?;
let videosink = gst::ElementFactory::make("ximagesink").build()?;
pipeline.add(&uridecodebin)?;
pipeline.add(&videoconvert)?;
pipeline.add(&videosink)?;
videoconvert.link(&videosink)?;
uridecodebin.connect_pad_added(move |_uridecodebin, pad| {
pad.link(&videoconvert.static_pad("sink").unwrap()).unwrap();
});
uridecodebin.connect("about-to-finish", false, move |args| {
let uridecodebin = args[0].get::<gst::Element>().unwrap();
dbg!("finish");
uridecodebin.set_property("uri", MKV);
None
});
let bus = pipeline.bus().unwrap();
pipeline.set_state(gst::State::Playing)?;
for msg in bus.iter_timed(gst::ClockTime::NONE) {
use gst::MessageView;
match msg.view() {
MessageView::Eos(..) => {
dbg!("eos");
break;
}
MessageView::Error(err) => {
println!(
"Error from {:?}: {} ({:?})",
err.src().map(|s| s.path_string()),
err.error(),
err.debug()
);
break;
}
_ => (),
}
}
pipeline.set_state(gst::State::Null)?;
Ok(())
}