matroskamux: wrong timestamps when muxing 2 streams not starting from pts=0 with offset-to-zero=true
See the following example muxing 2 live streams not starting from ts 0 with offset-to-zero=true
.
use gst::prelude::*;
fn main() {
gst::init().unwrap();
let pipeline = gst::parse_launch(
"audiotestsrc is-live=true num-buffers=30 ! avenc_aac ! matroskamux name=mux offset-to-zero=true ! fakesink videotestsrc is-live=true num-buffers=30 ! x264enc ! mux.",
)
.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");
}
The timestamps produced by matroskamux
are not increasing. It's like if the buffers are alternating with two different scales, one starting at 0
and the other at the actual first pts:
0:00:01.110768053 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa4d3b900, pts 0:00:00.000000000, dts 99:99:99.999999999, dur 99:99:99.999999999, size 32, offset 0, offset_end 32, flags 0x6440
0:00:01.111052039 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa4d3b7e0, pts 0:00:00.000000000, dts 99:99:99.999999999, dur 99:99:99.999999999, size 448, offset 32, offset_end 480, flags 0x6400
0:00:01.111105323 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14240, pts 0:00:00.002746153, dts 99:99:99.999999999, dur 99:99:99.999999999, size 15, offset 480, offset_end 495, flags 0x4000
0:00:01.111136018 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14360, pts 0:00:00.002746153, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 495, offset_end 502, flags 0x6000
0:00:01.111162210 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14480, pts 63:40:49.373482124, dts 63:40:49.306815458, dur 0:00:00.033333333, size 7110, offset 502, offset_end 7612, flags 0x2200
0:00:01.111898769 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14120, pts 0:00:00.136079486, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 7612, offset_end 7619, flags 0x6000
0:00:01.111938140 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14000, pts 63:40:49.506815457, dts 63:40:49.340148791, dur 0:00:00.033333333, size 5015, offset 7619, offset_end 12634, flags 0x2200
0:00:01.113260784 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14360, pts 0:00:00.000000000, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 12634, offset_end 12641, flags 0x6000
0:00:01.113292468 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14240, pts 63:40:49.370735971, dts 63:40:49.370735971, dur 0:00:00.023219954, size 194, offset 12641, offset_end 12835, flags 0x2000
0:00:01.113795581 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x55fdd7eb05a0, pts 0:00:00.069412819, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 12835, offset_end 12842, flags 0x6000
0:00:01.113837833 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x55fdd7eb07e0, pts 63:40:49.440148790, dts 63:40:49.373482124, dur 0:00:00.033333334, size 5123, offset 12842, offset_end 17965, flags 0x2200
0:00:01.114506691 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14120, pts 0:00:00.023219954, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 17965, offset_end 17972, flags 0x6000
0:00:01.114546110 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14480, pts 63:40:49.393955925, dts 63:40:49.393955925, dur 0:00:00.023219955, size 253, offset 17972, offset_end 18225, flags 0x2000
0:00:01.114884561 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa4d3bea0, pts 0:00:00.036079486, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 18225, offset_end 18232, flags 0x6000
0:00:01.114931175 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x55fdd7eb0a20, pts 63:40:49.406815457, dts 63:40:49.406815457, dur 0:00:00.033333333, size 4923, offset 18232, offset_end 23155, flags 0x2200
0:00:01.115023172 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14360, pts 0:00:00.046439909, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 23155, offset_end 23162, flags 0x6000
0:00:01.115040745 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14000, pts 63:40:49.417175880, dts 63:40:49.417175880, dur 0:00:00.023219954, size 191, offset 23162, offset_end 23353, flags 0x2000
0:00:01.115289244 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14240, pts 0:00:00.102746153, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 23353, offset_end 23360, flags 0x6000
0:00:01.115322443 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa4d3bea0, pts 63:40:49.473482124, dts 63:40:49.440148790, dur 0:00:00.033333333, size 4893, offset 23360, offset_end 28253, flags 0x2200
0:00:01.115414261 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14120, pts 0:00:00.069659863, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 28253, offset_end 28260, flags 0x6000
0:00:01.115432788 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x55fdd7eb07e0, pts 63:40:49.440395834, dts 63:40:49.440395834, dur 0:00:00.023219955, size 171, offset 28260, offset_end 28431, flags 0x2000
0:00:01.115724215 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x55fdd7eb05a0, pts 0:00:00.092879818, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 28431, offset_end 28438, flags 0x6000
0:00:01.115748994 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa4d3bb40, pts 63:40:49.463615789, dts 63:40:49.463615789, dur 0:00:00.023219955, size 181, offset 28438, offset_end 28619, flags 0x2000
0:00:01.116026105 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14000, pts 0:00:00.269412819, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 28619, offset_end 28626, flags 0x6000
0:00:01.116051859 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x55fdd7eb05a0, pts 63:40:49.640148790, dts 63:40:49.473482124, dur 0:00:00.033333334, size 5128, offset 28626, offset_end 33754, flags 0x2200
0:00:01.116841187 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14360, pts 0:00:00.116099773, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 33754, offset_end 33761, flags 0x6000
0:00:01.116913605 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x55fdd7eb0a20, pts 63:40:49.486835744, dts 63:40:49.486835744, dur 0:00:00.023219954, size 192, offset 33761, offset_end 33953, flags 0x2000
0:00:01.117515988 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14240, pts 0:00:00.202746153, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 33953, offset_end 33960, flags 0x6000
0:00:01.117544591 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa4d3bc60, pts 63:40:49.573482124, dts 63:40:49.506815457, dur 0:00:00.033333333, size 5095, offset 33960, offset_end 39055, flags 0x2200
0:00:01.118009013 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14120, pts 0:00:00.139319727, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 39055, offset_end 39062, flags 0x6000
0:00:01.118037798 779880 0x55fdd7b58760 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa4d3bea0, pts 63:40:49.510055698, dts 63:40:49.510055698, dur 0:00:00.023219955, size 136, offset 39062, offset_end 39198, flags 0x2000
0:00:01.118311011 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa4d3bb40, pts 0:00:00.162539682, dts 99:99:99.999999999, dur 99:99:99.999999999, size 7, offset 39198, offset_end 39205, flags 0x6000
0:00:01.118338143 779880 0x55fdd7fe9000 DEBUG GST_SCHEDULING gstpad.c:4446:gst_pad_chain_data_unchecked:<fakesink0:sink> calling chainfunction &gst_base_sink_chain with buffer buffer: 0x7fefa5f14240, pts 63:40:49.533275653, dts 63:40:49.533275653, dur 0:00:00.023219955, size 208, offset 39205, offset_end 39413, flags 0x2000
The headers buffers starting at 0
is #1480