mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
asfmux: handle streams with different start times
Prevents losing sync when remuxing streams with different start times. The smallest start time is selected as the base time and all timestamps are subtracted from it to get the actual time to be used when muxing and building indexes Fixes #586848
This commit is contained in:
parent
d70afdccd1
commit
48a2bbd6ad
2 changed files with 26 additions and 1 deletions
|
@ -216,6 +216,7 @@ gst_asf_mux_reset (GstAsfMux * asfmux)
|
|||
asfmux->total_data_packets = 0;
|
||||
asfmux->file_size = 0;
|
||||
asfmux->packet_size = 0;
|
||||
asfmux->first_ts = GST_CLOCK_TIME_NONE;
|
||||
|
||||
if (asfmux->payloads) {
|
||||
GSList *walk;
|
||||
|
@ -1763,8 +1764,12 @@ gst_asf_mux_process_buffer (GstAsfMux * asfmux, GstAsfPad * pad,
|
|||
gst_asf_payload_free (payload);
|
||||
return GST_FLOW_ERROR;
|
||||
}
|
||||
|
||||
g_assert (GST_CLOCK_TIME_IS_VALID (asfmux->first_ts));
|
||||
g_assert (GST_CLOCK_TIME_IS_VALID (pad->first_ts));
|
||||
|
||||
payload->presentation_time = asfmux->preroll +
|
||||
(GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND);
|
||||
((GST_BUFFER_TIMESTAMP (buf) - asfmux->first_ts) / GST_MSECOND);
|
||||
|
||||
/* update counting values */
|
||||
pad->media_object_number = (pad->media_object_number + 1) % 256;
|
||||
|
@ -1833,6 +1838,21 @@ gst_asf_mux_collected (GstCollectPads * collect, gpointer data)
|
|||
continue;
|
||||
}
|
||||
time = GST_BUFFER_TIMESTAMP (buf);
|
||||
|
||||
/* check the ts for getting the first time */
|
||||
if (!GST_CLOCK_TIME_IS_VALID (pad->first_ts) &&
|
||||
GST_CLOCK_TIME_IS_VALID (time)) {
|
||||
GST_DEBUG_OBJECT (asfmux, "First ts for stream number %" G_GUINT16_FORMAT
|
||||
": %" GST_TIME_FORMAT, pad->stream_number, GST_TIME_ARGS (time));
|
||||
pad->first_ts = time;
|
||||
if (!GST_CLOCK_TIME_IS_VALID (asfmux->first_ts) ||
|
||||
time < asfmux->first_ts) {
|
||||
GST_DEBUG_OBJECT (asfmux, "New first ts for file %" GST_TIME_FORMAT,
|
||||
GST_TIME_ARGS (time));
|
||||
asfmux->first_ts = time;
|
||||
}
|
||||
}
|
||||
|
||||
gst_buffer_unref (buf);
|
||||
|
||||
if (best_pad == NULL || !GST_CLOCK_TIME_IS_VALID (time) ||
|
||||
|
@ -1887,6 +1907,8 @@ gst_asf_mux_pad_reset (GstAsfPad * pad)
|
|||
gst_tag_list_free (pad->taglist);
|
||||
pad->taglist = NULL;
|
||||
|
||||
pad->first_ts = GST_CLOCK_TIME_NONE;
|
||||
|
||||
if (pad->is_audio) {
|
||||
GstAsfAudioPad *audiopad = (GstAsfAudioPad *) pad;
|
||||
audiopad->audioinfo.rate = 0;
|
||||
|
|
|
@ -65,6 +65,7 @@ struct _GstAsfPad
|
|||
guint32 bitrate;
|
||||
|
||||
GstClockTime play_duration;
|
||||
GstClockTime first_ts;
|
||||
|
||||
GstBuffer *codec_data;
|
||||
|
||||
|
@ -136,6 +137,8 @@ struct _GstAsfMux
|
|||
guint64 preroll; /* milisecs */
|
||||
gboolean merge_stream_tags;
|
||||
|
||||
GstClockTime first_ts;
|
||||
|
||||
/* pads */
|
||||
GstPad *srcpad;
|
||||
|
||||
|
|
Loading…
Reference in a new issue