}
if (pad->need_segment) {
+ GstEvent *e;
+
if (demux->close_seg_event)
gst_pad_push_event (GST_PAD_CAST (pad),
gst_event_ref (demux->close_seg_event));
- gst_pad_push_event (GST_PAD_CAST (pad),
- gst_event_new_new_segment (FALSE, demux->segment.rate,
- GST_FORMAT_TIME, demux->segment.start, demux->segment.stop,
- GST_BUFFER_TIMESTAMP (outbuf)));
+
+ e = gst_event_new_new_segment (FALSE, demux->segment.rate,
+ GST_FORMAT_TIME, demux->segment.start, demux->segment.stop,
+ GST_BUFFER_TIMESTAMP (outbuf));
+ gst_event_set_seqnum (e, demux->seqnum);
+ gst_pad_push_event (GST_PAD_CAST (pad), e);
pad->need_segment = FALSE;
}
}
if (ret == GST_FLOW_UNEXPECTED) {
+ GstEvent *e;
+
GST_DEBUG_OBJECT (demux, "EOS for track");
pad->eos = TRUE;
- gst_pad_push_event (GST_PAD_CAST (pad), gst_event_new_eos ());
+ e = gst_event_new_eos ();
+ gst_event_set_seqnum (e, demux->seqnum);
+ gst_pad_push_event (GST_PAD_CAST (pad), e);
ret = GST_FLOW_OK;
}
if (!p->eos
&& p->current_essence_track_position >=
p->current_essence_track->duration) {
+ GstEvent *e;
+
p->eos = TRUE;
- gst_pad_push_event (GST_PAD_CAST (p), gst_event_new_eos ());
+ e = gst_event_new_eos ();
+ gst_event_set_seqnum (e, demux->seqnum);
+ gst_pad_push_event (GST_PAD_CAST (p), e);
}
}
}
if (!p->eos
&& p->current_essence_track_position >=
p->current_essence_track->duration) {
+ GstEvent *e;
+
p->eos = TRUE;
- gst_pad_push_event (GST_PAD_CAST (p), gst_event_new_eos ());
+ e = gst_event_new_eos ();
+ gst_event_set_seqnum (e, demux->seqnum);
+ gst_pad_push_event (GST_PAD_CAST (p), e);
}
}
gst_mxf_demux_find_essence_element (demux, p->current_essence_track,
&position, FALSE);
if (offset == -1) {
+ GstEvent *e;
+
GST_ERROR_OBJECT (demux, "Failed to find offset for essence track");
p->eos = TRUE;
- gst_pad_push_event (GST_PAD_CAST (p), gst_event_new_eos ());
+ e = gst_event_new_eos ();
+ gst_event_set_seqnum (e, demux->seqnum);
+ gst_pad_push_event (GST_PAD_CAST (p), e);
continue;
}
gst_mxf_demux_find_essence_element (demux,
earliest->current_essence_track, &position, FALSE);
if (offset == -1) {
+ GstEvent *e;
+
GST_WARNING_OBJECT (demux,
"Failed to find offset for late essence track");
earliest->eos = TRUE;
- gst_pad_push_event (GST_PAD_CAST (earliest), gst_event_new_eos ());
+ e = gst_event_new_eos ();
+ gst_event_set_seqnum (e, demux->seqnum);
+ gst_pad_push_event (GST_PAD_CAST (earliest), e);
continue;
}
/* perform EOS logic */
if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) {
gint64 stop;
+ GstMessage *m;
/* for segment playback we need to post when (in stream time)
* we stopped, this is either stop (when set) or the duration. */
stop = demux->segment.duration;
GST_LOG_OBJECT (demux, "Sending segment done, at end of segment");
- gst_element_post_message (GST_ELEMENT_CAST (demux),
- gst_message_new_segment_done (GST_OBJECT_CAST (demux),
- GST_FORMAT_TIME, stop));
+ m = gst_message_new_segment_done (GST_OBJECT_CAST (demux),
+ GST_FORMAT_TIME, stop);
+ gst_message_set_seqnum (m, demux->seqnum);
+ gst_element_post_message (GST_ELEMENT_CAST (demux), m);
} else {
+ GstEvent *e;
+
/* normal playback, send EOS to all linked pads */
GST_LOG_OBJECT (demux, "Sending EOS, at end of stream");
- if (!gst_mxf_demux_push_src_event (demux, gst_event_new_eos ())) {
+ e = gst_event_new_eos ();
+ gst_event_set_seqnum (e, demux->seqnum);
+ if (!gst_mxf_demux_push_src_event (demux, e)) {
GST_WARNING_OBJECT (demux, "failed pushing EOS on streams");
}
}
} else {
+ GstEvent *e;
+
GST_ELEMENT_ERROR (demux, STREAM, FAILED,
("Internal data stream error."),
("stream stopped, reason %s", reason));
- gst_mxf_demux_push_src_event (demux, gst_event_new_eos ());
+ e = gst_event_new_eos ();
+ gst_event_set_seqnum (e, demux->seqnum);
+ gst_mxf_demux_push_src_event (demux, e);
}
}
gst_object_unref (demux);
gboolean update, flush, keyframe;
GstSegment seeksegment;
guint i;
+ guint32 seqnum;
gst_event_parse_seek (event, &rate, &format, &flags,
&start_type, &start, &stop_type, &stop);
+ seqnum = gst_event_get_seqnum (event);
if (rate <= 0.0)
goto wrong_rate;
if (flush || seeksegment.last_stop != demux->segment.last_stop) {
gboolean ret;
guint64 new_offset = -1;
+ GstEvent *e;
g_mutex_lock (demux->metadata_lock);
if (!demux->metadata_resolved || demux->update_metadata) {
GST_DEBUG_OBJECT (demux, "generating an upstream seek at position %"
G_GUINT64_FORMAT, new_offset);
- ret = gst_pad_push_event (demux->sinkpad,
- gst_event_new_seek (seeksegment.rate, GST_FORMAT_BYTES,
- seeksegment.flags | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET,
- new_offset, GST_SEEK_TYPE_NONE, 0));
+ e = gst_event_new_seek (seeksegment.rate, GST_FORMAT_BYTES,
+ seeksegment.flags | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET,
+ new_offset, GST_SEEK_TYPE_NONE, 0);
+ gst_event_set_seqnum (e, seqnum);
+ ret = gst_pad_push_event (demux->sinkpad, e);
if (G_UNLIKELY (!ret)) {
goto seek_failed;
GstSegment seeksegment;
guint i;
gboolean ret = TRUE;
+ guint32 seqnum;
gst_event_parse_seek (event, &rate, &format, &flags,
&start_type, &start, &stop_type, &stop);
+ seqnum = gst_event_get_seqnum (event);
if (format != GST_FORMAT_TIME)
goto wrong_format;
keyframe = !!(flags & GST_SEEK_FLAG_KEY_UNIT);
if (flush) {
+ GstEvent *e;
+
/* Flush start up and downstream to make sure data flow and loops are
idle */
- gst_mxf_demux_push_src_event (demux, gst_event_new_flush_start ());
- gst_pad_push_event (demux->sinkpad, gst_event_new_flush_start ());
+ e = gst_event_new_flush_start ();
+ gst_event_set_seqnum (e, seqnum);
+ gst_mxf_demux_push_src_event (demux, gst_event_ref (e));
+ gst_pad_push_event (demux->sinkpad, e);
} else {
/* Pause the pulling task */
gst_pad_pause_task (demux->sinkpad);
GST_PAD_STREAM_LOCK (demux->sinkpad);
if (flush) {
+ GstEvent *e;
+
/* Stop flushing upstream we need to pull */
- gst_pad_push_event (demux->sinkpad, gst_event_new_flush_stop ());
+ e = gst_event_new_flush_stop ();
+ gst_event_set_seqnum (e, seqnum);
+ gst_pad_push_event (demux->sinkpad, e);
}
/* Work on a copy until we are sure the seek succeeded. */
}
if (flush) {
+ GstEvent *e;
+
/* Stop flushing, the sinks are at time 0 now */
- gst_mxf_demux_push_src_event (demux, gst_event_new_flush_stop ());
+ e = gst_event_new_flush_stop ();
+ gst_event_set_seqnum (e, seqnum);
+ gst_mxf_demux_push_src_event (demux, e);
} else {
GST_DEBUG_OBJECT (demux, "closing running segment %" GST_SEGMENT_FORMAT,
&demux->segment);
demux->close_seg_event = gst_event_new_new_segment (TRUE,
demux->segment.rate, demux->segment.format,
demux->segment.start, demux->segment.last_stop, demux->segment.time);
+ gst_event_set_seqnum (demux->close_seg_event, demux->seqnum);
}
/* Ok seek succeeded, take the newly configured segment */
/* Notify about the start of a new segment */
if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) {
- gst_element_post_message (GST_ELEMENT (demux),
- gst_message_new_segment_start (GST_OBJECT (demux),
- demux->segment.format, demux->segment.last_stop));
+ GstMessage *m;
+
+ m = gst_message_new_segment_start (GST_OBJECT (demux),
+ demux->segment.format, demux->segment.last_stop);
+ gst_message_set_seqnum (m, seqnum);
+ gst_element_post_message (GST_ELEMENT (demux), m);
}
/* Tell all the stream a new segment is needed */
t->position = -1;
}
+ demux->seqnum = seqnum;
+
gst_pad_start_task (demux->sinkpad,
(GstTaskFunction) gst_mxf_demux_loop, demux->sinkpad);
t->position = -1;
}
demux->current_partition = NULL;
+ demux->seqnum = gst_event_get_seqnum (event);
gst_event_unref (event);
ret = TRUE;
break;
switch (transition) {
case GST_STATE_CHANGE_READY_TO_PAUSED:
+ demux->seqnum = gst_util_seqnum_next ();
break;
default:
break;