mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
matroskademux: Clean up position/duration handling
Also use the last end time for closing the segment, not the start time of the last buffer.
This commit is contained in:
parent
0766a54138
commit
cd888c0531
2 changed files with 30 additions and 19 deletions
|
@ -388,6 +388,7 @@ gst_matroska_demux_reset (GstElement * element)
|
||||||
|
|
||||||
gst_segment_init (&demux->segment, GST_FORMAT_TIME);
|
gst_segment_init (&demux->segment, GST_FORMAT_TIME);
|
||||||
demux->duration = -1;
|
demux->duration = -1;
|
||||||
|
demux->last_stop_end = GST_CLOCK_TIME_NONE;
|
||||||
|
|
||||||
if (demux->close_segment) {
|
if (demux->close_segment) {
|
||||||
gst_event_unref (demux->close_segment);
|
gst_event_unref (demux->close_segment);
|
||||||
|
@ -4349,6 +4350,8 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux,
|
||||||
GST_BUFFER_TIMESTAMP (sub) = lace_time;
|
GST_BUFFER_TIMESTAMP (sub) = lace_time;
|
||||||
|
|
||||||
if (GST_CLOCK_TIME_IS_VALID (lace_time)) {
|
if (GST_CLOCK_TIME_IS_VALID (lace_time)) {
|
||||||
|
GstClockTime last_stop_end;
|
||||||
|
|
||||||
/* Check if this stream is after segment stop */
|
/* Check if this stream is after segment stop */
|
||||||
if (GST_CLOCK_TIME_IS_VALID (demux->segment.stop) &&
|
if (GST_CLOCK_TIME_IS_VALID (demux->segment.stop) &&
|
||||||
lace_time >= demux->segment.stop) {
|
lace_time >= demux->segment.stop) {
|
||||||
|
@ -4361,18 +4364,6 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!GST_CLOCK_TIME_IS_VALID (demux->segment.last_stop)
|
|
||||||
|| demux->segment.last_stop < lace_time) {
|
|
||||||
demux->segment.last_stop = lace_time;
|
|
||||||
|
|
||||||
if (demux->duration < lace_time) {
|
|
||||||
demux->duration = lace_time;
|
|
||||||
gst_element_post_message (GST_ELEMENT_CAST (demux),
|
|
||||||
gst_message_new_duration (GST_OBJECT_CAST (demux),
|
|
||||||
GST_FORMAT_TIME, GST_CLOCK_TIME_NONE));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GST_CLOCK_TIME_IS_VALID (stream->pos)) {
|
if (GST_CLOCK_TIME_IS_VALID (stream->pos)) {
|
||||||
GstClockTimeDiff diff = GST_CLOCK_DIFF (stream->pos, lace_time);
|
GstClockTimeDiff diff = GST_CLOCK_DIFF (stream->pos, lace_time);
|
||||||
|
|
||||||
|
@ -4386,15 +4377,34 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux,
|
||||||
demux->segment.stop, lace_time));
|
demux->segment.stop, lace_time));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!GST_CLOCK_TIME_IS_VALID (demux->segment.last_stop)
|
||||||
|
|| demux->segment.last_stop < lace_time) {
|
||||||
|
demux->segment.last_stop = lace_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
last_stop_end = lace_time;
|
||||||
|
if (duration) {
|
||||||
|
GST_BUFFER_DURATION (sub) = duration / laces;
|
||||||
|
last_stop_end += GST_BUFFER_DURATION (sub);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!GST_CLOCK_TIME_IS_VALID (demux->last_stop_end) ||
|
||||||
|
demux->last_stop_end < last_stop_end)
|
||||||
|
demux->last_stop_end = last_stop_end;
|
||||||
|
|
||||||
|
if (demux->duration == -1 || demux->duration < lace_time) {
|
||||||
|
demux->duration = last_stop_end;
|
||||||
|
gst_element_post_message (GST_ELEMENT_CAST (demux),
|
||||||
|
gst_message_new_duration (GST_OBJECT_CAST (demux),
|
||||||
|
GST_FORMAT_TIME, GST_CLOCK_TIME_NONE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
stream->pos = lace_time;
|
stream->pos = lace_time;
|
||||||
|
|
||||||
gst_matroska_demux_sync_streams (demux);
|
gst_matroska_demux_sync_streams (demux);
|
||||||
|
|
||||||
if (duration) {
|
|
||||||
GST_BUFFER_DURATION (sub) = duration / laces;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_simpleblock) {
|
if (is_simpleblock) {
|
||||||
if (flags & 0x80)
|
if (flags & 0x80)
|
||||||
GST_BUFFER_FLAG_UNSET (sub, GST_BUFFER_FLAG_DELTA_UNIT);
|
GST_BUFFER_FLAG_UNSET (sub, GST_BUFFER_FLAG_DELTA_UNIT);
|
||||||
|
@ -5116,13 +5126,13 @@ pause:
|
||||||
|
|
||||||
/* Close the segment, i.e. update segment stop with the duration
|
/* Close the segment, i.e. update segment stop with the duration
|
||||||
* if no stop was set */
|
* if no stop was set */
|
||||||
if (GST_CLOCK_TIME_IS_VALID (demux->segment.last_stop) &&
|
if (GST_CLOCK_TIME_IS_VALID (demux->last_stop_end) &&
|
||||||
!GST_CLOCK_TIME_IS_VALID (demux->segment.stop)) {
|
!GST_CLOCK_TIME_IS_VALID (demux->segment.stop)) {
|
||||||
GstEvent *event =
|
GstEvent *event =
|
||||||
gst_event_new_new_segment_full (TRUE, demux->segment.rate,
|
gst_event_new_new_segment_full (TRUE, demux->segment.rate,
|
||||||
demux->segment.applied_rate, demux->segment.format,
|
demux->segment.applied_rate, demux->segment.format,
|
||||||
demux->segment.start,
|
demux->segment.start,
|
||||||
demux->segment.last_stop, demux->segment.time);
|
demux->last_stop_end, demux->segment.time);
|
||||||
gst_matroska_demux_send_event (demux, event);
|
gst_matroska_demux_send_event (demux, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5132,7 +5142,7 @@ pause:
|
||||||
/* for segment playback we need to post when (in stream time)
|
/* for segment playback we need to post when (in stream time)
|
||||||
* we stopped, this is either stop (when set) or the duration. */
|
* we stopped, this is either stop (when set) or the duration. */
|
||||||
if ((stop = demux->segment.stop) == -1)
|
if ((stop = demux->segment.stop) == -1)
|
||||||
stop = demux->segment.last_stop;
|
stop = demux->last_stop_end;
|
||||||
|
|
||||||
GST_LOG_OBJECT (demux, "Sending segment done, at end of segment");
|
GST_LOG_OBJECT (demux, "Sending segment done, at end of segment");
|
||||||
gst_element_post_message (GST_ELEMENT (demux),
|
gst_element_post_message (GST_ELEMENT (demux),
|
||||||
|
|
|
@ -91,6 +91,7 @@ typedef struct _GstMatroskaDemux {
|
||||||
/* keeping track of playback position */
|
/* keeping track of playback position */
|
||||||
GstSegment segment;
|
GstSegment segment;
|
||||||
gboolean segment_running;
|
gboolean segment_running;
|
||||||
|
GstClockTime last_stop_end;
|
||||||
gint64 duration;
|
gint64 duration;
|
||||||
|
|
||||||
GstEvent *close_segment;
|
GstEvent *close_segment;
|
||||||
|
|
Loading…
Reference in a new issue