matroskamux: headers should have GST_CLOCK_TIME_NONE as pts instead of 0
matroskamux
always set 0:00:00.000000000
as pts on the headers buffers, even if its input does not start at 0
.
This breaks clock sync and may fully fill queues having a max-size-time
.
This can be reproduced using this test app:
use gst::prelude::*;
fn main() {
gst::init().unwrap();
let pipeline = gst::parse_launch(
"audiotestsrc is-live=true num-buffers=30 ! avenc_aac ! matroskamux ! fakesink",
)
.unwrap()
.downcast::<gst::Pipeline>()
.unwrap();
pipeline.use_clock(Some(&gst::SystemClock::obtain()));
pipeline.set_start_time(gst::ClockTime::NONE);
pipeline.set_base_time(gst::ClockTime::ZERO);
let bus = pipeline.bus().unwrap();
pipeline
.set_state(gst::State::Playing)
.expect("Unable to set the pipeline to the `Playing` state");
for msg in bus.iter_timed(gst::ClockTime::NONE) {
use gst::MessageView;
match msg.view() {
MessageView::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)
.expect("Unable to set the pipeline to the `Null` state");
}
See the pts of the buffers:
gstpad.c:4446:gst_pad_chain_data_unchecked:<avenc_aac0:sink> calling chainfunction &gst_audio_encoder_chain with buffer buffer: 0x563d0d3765a0, pts 63:08:44.941758719, dts 99:99:99.999999999, dur 0:00:00.023219954, size 4096, offset 0, offset_end 1024, flags 0x40
gstpad.c:4446:gst_pad_chain_data_unchecked:<avenc_aac0:sink> calling chainfunction &gst_audio_encoder_chain with buffer buffer: 0x563d0d376900, pts 63:08:44.964978673, dts 99:99:99.999999999, dur 0:00:00.023219955, size 4096, offset 1024, offset_end 2048, flags 0x0
gstpad.c:4446:gst_pad_chain_data_unchecked:<avenc_aac0:sink> calling chainfunction &gst_audio_encoder_chain with buffer buffer: 0x7f8bb40aa000, pts 63:08:44.988198628, dts 99:99:99.999999999, dur 0:00:00.023219954, size 4096, offset 2048, offset_end 3072, flags 0x0
gstpad.c:4446:gst_pad_chain_data_unchecked:<matroskamux0:audio_0> calling chainfunction &gst_collect_pads_chain with buffer buffer: 0x563d0d3767e0, pts 63:08:44.941758719, dts 63:08:44.941758719, dur 0:00:00.023219954, size 194, offset 0, offset_end 194, flags 0x40
gstpad.c:4446:gst_pad_chain_data_unchecked:<matroskamux0:audio_0> calling chainfunction &gst_collect_pads_chain with buffer buffer: 0x563d0d376a20, pts 63:08:44.964978673, dts 63:08:44.964978673, dur 0:00:00.023219955, size 253, offset 194, offset_end 447, flags 0x0
gstpad.c:4446:gst_pad_chain_data_unchecked:<matroskamux0:audio_0> calling chainfunction &gst_collect_pads_chain with buffer buffer: 0x563d0d376c60, pts 63:08:44.988198628, dts 63:08:44.988198628, dur 0:00:00.023219954, size 191, offset 447, offset_end 638, flags 0x0
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x563d0d376ea0, pts 0:00:00.000000000, dts 99:99:99.999999999, dur 99:99:99.999999999, size 32, offset 0, offset_end 32, flags 0x6440
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7f8bb40aa000, pts 0:00:00.000000000, dts 99:99:99.999999999, dur 99:99:99.999999999, size 221, offset 32, offset_end 253, flags 0x6400
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x563d0d376b40, pts 63:08:44.941758719, dts 99:99:99.999999999, dur 99:99:99.999999999, size 18, offset 253, offset_end 271, flags 0x4000
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x563d0d376d80, pts 63:08:44.941758719, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 271, offset_end 278, flags 0x6000
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x563d0d376b40, pts 63:08:44.941758719, dts 63:08:44.941758719, dur 0:00:00.023219954, size 194, offset 278, offset_end 472, flags 0x2000
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x563d0d376d80, pts 63:08:44.964978673, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 472, offset_end 479, flags 0x6000
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x563d0d376b40, pts 63:08:44.964978673, dts 63:08:44.964978673, dur 0:00:00.023219955, size 253, offset 479, offset_end 732, flags 0x2000
I think the headers buffers should use GST_CLOCK_TIME_NONE
as mp4mux
does:
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x5642a0956b40, pts 99:99:99.999999999, dts 99:99:99.999999999, dur 99:99:99.999999999, size 32, offset none, offset_end none, flags 0x4000
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x5642a0956c60, pts 99:99:99.999999999, dts 99:99:99.999999999, dur 99:99:99.999999999, size 8, offset none, offset_end none, flags 0x0
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x5642a09567e0, pts 63:10:30.384196669, dts 63:10:30.384196669, dur 0:00:00.023219954, size 194, offset 0, offset_end 194, flags 0x40
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fcf7c00a120, pts 63:10:30.407416623, dts 63:10:30.407416623, dur 0:00:00.023219955, size 253, offset 194, offset_end 447, flags 0x0
gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fcf7c00a480, pts 63:10:30.430636578, dts 63:10:30.430636578, dur 0:00:00.023219954, size 191, offset 447, offset_end 638, flags 0x0