-Subproject commit 06f5a5a9bad01b5cf76184aee4f430c834a9dac3
+Subproject commit b4dd49b992efde30a049f9813d08b539edbcaccd
validate.test.interlace.interlace_deinterlace_alternate
validate.test.matroska.demux_flush_within_cluster.default
validate.test.mp4.qtdemux_change_edit_list.default
+validate.test.mp4.qtdemux_ibpibp_non_frag_pull.default
+validate.test.mp4.qtdemux_ibpibp_non_frag_push.default
validate.test.mp4.qtdemux_reverse_playback_full_gop.reverse_playback_full_gop
validate.test.mp4.redirect.play_15s
validate.test.mse.segment_future_past_mse.segment_future_past_mse
--- /dev/null
+set-globals, media_dir="$(test_dir)/../../../medias/"
+meta,
+ seek=false,
+ handles-states=false,
+ args = {
+ "filesrc location=\"$(media_dir)/edit-lists/simple/ibpibp-non-frag.mp4\" ! qtdemux ! fakesink async=false",
+ },
+ configs = {
+ "$(validateflow), pad=fakesink0:sink, record-buffers=true, logged-event-types={segment}",
+ "change-issue-severity, issue-id=event::eos-has-wrong-seqnum, new-severity=ignore",
+ }
--- /dev/null
+event segment: format=TIME, start=0:00:00.333333333, offset=0:00:00.000000000, stop=0:00:02.333333333, time=0:00:00.000000000, base=0:00:00.000000000, position=0:00:00.333333333
+buffer: dts=0:00:00.000000000, pts=0:00:00.333333333, dur=0:00:00.333333333, flags=discont
+buffer: dts=0:00:00.333333333, pts=0:00:01.000000000, dur=0:00:00.333333333, flags=delta-unit
+buffer: dts=0:00:00.666666666, pts=0:00:00.666666666, dur=0:00:00.333333334, flags=delta-unit
+buffer: dts=0:00:01.000000000, pts=0:00:01.333333333, dur=0:00:00.333333333
+buffer: dts=0:00:01.333333333, pts=0:00:02.000000000, dur=0:00:00.333333333, flags=delta-unit
+buffer: dts=0:00:01.666666666, pts=0:00:01.666666666, dur=0:00:00.333333334, flags=delta-unit
--- /dev/null
+set-globals, media_dir="$(test_dir)/../../../medias/"
+meta,
+ seek=false,
+ handles-states=false,
+ args = {
+ "appsrc ! qtdemux ! fakesink async=false",
+ },
+ configs = {
+ "$(validateflow), pad=fakesink0:sink, record-buffers=true, logged-event-types={segment, eos}",
+ "change-issue-severity, issue-id=event::eos-has-wrong-seqnum, new-severity=ignore",
+ }
+
+# Note that sending the file this way ensures qtdemux doesn't receive an EOS
+# from appsrc, so we can test that the EOS comes from qtdemux.
+appsrc-push, target-element-name=appsrc0, file-name="$(media_dir)/edit-lists/simple/ibpibp-non-frag.mp4"
--- /dev/null
+event segment: format=TIME, start=0:00:00.333333333, offset=0:00:00.000000000, stop=0:00:02.333333333, time=0:00:00.000000000, base=0:00:00.000000000, position=0:00:00.333333333
+buffer: dts=0:00:00.000000000, pts=0:00:00.333333333, dur=0:00:00.333333333, flags=discont tag-memory
+buffer: dts=0:00:00.333333333, pts=0:00:01.000000000, dur=0:00:00.333333333, flags=delta-unit tag-memory
+buffer: dts=0:00:00.666666666, pts=0:00:00.666666666, dur=0:00:00.333333334, flags=delta-unit tag-memory
+buffer: dts=0:00:01.000000000, pts=0:00:01.333333333, dur=0:00:00.333333333, flags=tag-memory
+buffer: dts=0:00:01.333333333, pts=0:00:02.000000000, dur=0:00:00.333333333, flags=delta-unit tag-memory
+buffer: dts=0:00:01.666666666, pts=0:00:01.666666666, dur=0:00:00.333333334, flags=delta-unit tag-memory
+event eos: (no structure)
return gst_qtdemux_process_adapter (demux, FALSE);
}
+static guint64
+gst_segment_to_stream_time_clamped (const GstSegment * segment,
+ guint64 position)
+{
+ guint64 segment_stream_time_start;
+ guint64 segment_stream_time_stop = GST_CLOCK_TIME_NONE;
+ guint64 stream_pts_unsigned;
+ int ret;
+
+ g_return_val_if_fail (segment != NULL, GST_CLOCK_TIME_NONE);
+ g_return_val_if_fail (segment->format == GST_FORMAT_TIME,
+ GST_CLOCK_TIME_NONE);
+
+ segment_stream_time_start = segment->time;
+ if (segment->stop != GST_CLOCK_TIME_NONE)
+ segment_stream_time_stop =
+ gst_segment_to_stream_time (segment, GST_FORMAT_TIME, segment->stop);
+
+ ret =
+ gst_segment_to_stream_time_full (segment, GST_FORMAT_TIME, position,
+ &stream_pts_unsigned);
+ /* ret == 0 if the segment is invalid (either position, segment->time or the segment start are -1). */
+ g_return_val_if_fail (ret != 0, GST_CLOCK_TIME_NONE);
+
+ if (ret == -1 || stream_pts_unsigned < segment_stream_time_start) {
+ /* Negative or prior to segment start stream time, clamp to segment start. */
+ return segment_stream_time_start;
+ } else if (segment_stream_time_stop != GST_CLOCK_TIME_NONE
+ && stream_pts_unsigned > segment_stream_time_stop) {
+ /* Clamp to segment end. */
+ return segment_stream_time_stop;
+ } else {
+ return stream_pts_unsigned;
+ }
+}
+
static GstFlowReturn
gst_qtdemux_process_adapter (GstQTDemux * demux, gboolean force)
{
case QTDEMUX_STATE_MOVIE:{
QtDemuxStream *stream = NULL;
QtDemuxSample *sample;
- GstClockTime dts, pts, duration;
+ GstClockTime dts, pts, stream_pts, duration;
gboolean keyframe;
gint i;
dts = QTSAMPLE_DTS (stream, sample);
pts = QTSAMPLE_PTS (stream, sample);
+ stream_pts =
+ gst_segment_to_stream_time_clamped (&stream->segment, pts);
duration = QTSAMPLE_DUR_DTS (stream, sample, dts);
keyframe = QTSAMPLE_KEYFRAME (stream, sample);
/* check for segment end */
if (G_UNLIKELY (demux->segment.stop != -1
- && demux->segment.stop <= pts && stream->on_keyframe)
+ && demux->segment.stop <= stream_pts && keyframe)
&& !(demux->upstream_format_is_time && demux->segment.rate < 0)) {
GST_DEBUG_OBJECT (demux, "we reached the end of our segment.");
stream->time_position = GST_CLOCK_TIME_NONE; /* this means EOS */