diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index e23d3f80b5..1110b7b266 100644 --- a/docs/gst/gstreamer-sections.txt +++ b/docs/gst/gstreamer-sections.txt @@ -1026,6 +1026,8 @@ gst_event_parse_toc gst_event_new_toc_select gst_event_parse_toc_select + +gst_event_new_segment_done GstEventClass GST_EVENT diff --git a/gst/gstevent.c b/gst/gstevent.c index 96e7530723..980747dc5d 100644 --- a/gst/gstevent.c +++ b/gst/gstevent.c @@ -1736,3 +1736,25 @@ gst_event_parse_toc_select (GstEvent * event, gchar ** uid) *uid = g_strdup (g_value_get_string (val)); } + +/** + * gst_event_new_segment_done: + + * Create a new segment-done event. This event is sent by elements that + * finish playback of a segment as a result of a segment seek. + * + * Returns: (transfer full): a new #GstEvent + * + * Since: 0.11.0 + */ +GstEvent * +gst_event_new_segment_done (void) +{ + GstEvent *event; + + GST_CAT_INFO (GST_CAT_EVENT, "creating segment-done event"); + + event = gst_event_new_custom (GST_EVENT_SEGMENT_DONE, NULL); + + return event; +} diff --git a/gst/gstevent.h b/gst/gstevent.h index 42ebc73c5c..aa7c94bb4d 100644 --- a/gst/gstevent.h +++ b/gst/gstevent.h @@ -98,7 +98,7 @@ typedef enum { * Since: 0.10.26 * @GST_EVENT_EOS: End-Of-Stream. No more data is to be expected to follow * without a SEGMENT event. - * @GST_EVENT_SEGMENT_DONE: (unimplemented) Marks the end of a segment playback. + * @GST_EVENT_SEGMENT_DONE: Marks the end of a segment playback. * @GST_EVENT_GAP: Marks a gap in the datastream. * @GST_EVENT_TOC: An event which indicates that a new table of contents (TOC) * was found or updated. Since: 0.10.37 @@ -576,6 +576,9 @@ GstEvent* gst_event_new_reconfigure (void) G_GNUC_MALLOC; GstEvent* gst_event_new_toc_select (const gchar *uid) G_GNUC_MALLOC; void gst_event_parse_toc_select (GstEvent *event, gchar **uid); +/* segment-done event */ +GstEvent* gst_event_new_segment_done (void) G_GNUC_MALLOC; + G_END_DECLS #endif /* __GST_EVENT_H__ */ diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c index 1ec76d5397..6dcaf4e617 100644 --- a/libs/gst/base/gstbaseparse.c +++ b/libs/gst/base/gstbaseparse.c @@ -2923,6 +2923,7 @@ pause: (GST_ELEMENT_CAST (parse), gst_message_new_segment_done (GST_OBJECT_CAST (parse), GST_FORMAT_TIME, stop)); + gst_pad_push_event (parse->srcpad, gst_event_new_segment_done ()); } else { /* If we STILL have zero frames processed, fire an error */ if (parse->priv->framecount == 0) { diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index f83ee7243e..bc146063ff 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -3751,6 +3751,7 @@ paused: gst_element_post_message (GST_ELEMENT_CAST (basesink), gst_message_new_segment_done (GST_OBJECT_CAST (basesink), basesink->segment.format, basesink->segment.position)); + gst_base_sink_event (pad, parent, gst_event_new_segment_done ()); } else { gst_base_sink_event (pad, parent, gst_event_new_eos ()); } diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c index dfa1ec522f..4532c0edf5 100644 --- a/libs/gst/base/gstbasesrc.c +++ b/libs/gst/base/gstbasesrc.c @@ -2718,6 +2718,9 @@ pause: format, position); gst_message_set_seqnum (message, src->priv->seqnum); gst_element_post_message (GST_ELEMENT_CAST (src), message); + event = gst_event_new_segment_done (); + gst_event_set_seqnum (event, src->priv->seqnum); + gst_pad_push_event (pad, event); } else { event = gst_event_new_eos (); gst_event_set_seqnum (event, src->priv->seqnum);