diff options
author | Doug Nazar <nazard@nazar.ca> | 2021-04-20 18:48:38 -0400 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2021-04-23 12:43:59 +0100 |
commit | b9b5c66e7842757720d7ca79005eb56e8cea453d (patch) | |
tree | 8b047c312e4f0311b2835a902d450fa15c9cdf8b | |
parent | 4f79b5be7bfd766eafbbdef8afe08590d3a86e3c (diff) |
realmedia: Drop duplicate seek events.
Also use seek seqnum for flush & segment events/messages.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-ugly/-/merge_requests/82>
-rw-r--r-- | gst/realmedia/rmdemux.c | 49 | ||||
-rw-r--r-- | gst/realmedia/rmdemux.h | 1 |
2 files changed, 43 insertions, 7 deletions
diff --git a/gst/realmedia/rmdemux.c b/gst/realmedia/rmdemux.c index 68b0736b..c5173a68 100644 --- a/gst/realmedia/rmdemux.c +++ b/gst/realmedia/rmdemux.c @@ -268,6 +268,7 @@ gst_rmdemux_init (GstRMDemux * rmdemux) rmdemux->have_group_id = FALSE; rmdemux->group_id = G_MAXUINT; rmdemux->flowcombiner = gst_flow_combiner_new (); + rmdemux->seek_seqnum = GST_SEQNUM_INVALID; gst_rm_utils_run_tests (); } @@ -302,8 +303,18 @@ gst_rmdemux_src_event (GstPad * pad, GstObject * parent, GstEvent * event) case GST_EVENT_SEEK: { gboolean running; + guint32 seqnum; GST_LOG_OBJECT (rmdemux, "Event on src: SEEK"); + + seqnum = gst_event_get_seqnum (event); + if (seqnum == rmdemux->seek_seqnum) { + GST_LOG_OBJECT (pad, + "Drop duplicated SEEK event seqnum %" G_GUINT32_FORMAT, seqnum); + gst_event_unref (event); + break; + } + /* can't seek if we are not seekable, FIXME could pass the * seek query upstream after converting it to bytes using * the average bitrate of the stream. */ @@ -479,10 +490,13 @@ gst_rmdemux_perform_seek (GstRMDemux * rmdemux, GstEvent * event) GstSeekType cur_type, stop_type; gint64 cur, stop; gboolean update; + guint32 seqnum = GST_SEQNUM_INVALID; + GstEvent *fl_event; if (event) { GST_DEBUG_OBJECT (rmdemux, "seek with event"); + seqnum = gst_event_get_seqnum (event); gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, &stop_type, &stop); @@ -511,8 +525,15 @@ gst_rmdemux_perform_seek (GstRMDemux * rmdemux, GstEvent * event) /* first step is to unlock the streaming thread if it is * blocked in a chain call, we do this by starting the flush. */ if (flush) { - gst_pad_push_event (rmdemux->sinkpad, gst_event_new_flush_start ()); - gst_rmdemux_send_event (rmdemux, gst_event_new_flush_start ()); + fl_event = gst_event_new_flush_start (); + if (seqnum != GST_SEQNUM_INVALID) + gst_event_set_seqnum (fl_event, seqnum); + gst_pad_push_event (rmdemux->sinkpad, fl_event); + + fl_event = gst_event_new_flush_start (); + if (seqnum != GST_SEQNUM_INVALID) + gst_event_set_seqnum (fl_event, seqnum); + gst_rmdemux_send_event (rmdemux, fl_event); } else { gst_pad_pause_task (rmdemux->sinkpad); } @@ -532,6 +553,8 @@ gst_rmdemux_perform_seek (GstRMDemux * rmdemux, GstEvent * event) ret = FALSE; goto done; } + + rmdemux->seek_seqnum = seqnum; } GST_DEBUG_OBJECT (rmdemux, "segment positions set to %" GST_TIME_FORMAT "-%" @@ -540,7 +563,10 @@ gst_rmdemux_perform_seek (GstRMDemux * rmdemux, GstEvent * event) /* we need to stop flushing on the sinkpad as we're going to use it * next. We can do this as we have the STREAM lock now. */ - gst_pad_push_event (rmdemux->sinkpad, gst_event_new_flush_stop (TRUE)); + fl_event = gst_event_new_flush_stop (TRUE); + if (seqnum != GST_SEQNUM_INVALID) + gst_event_set_seqnum (fl_event, seqnum); + gst_pad_push_event (rmdemux->sinkpad, fl_event); GST_LOG_OBJECT (rmdemux, "Pushed FLUSH_STOP event"); @@ -578,17 +604,24 @@ gst_rmdemux_perform_seek (GstRMDemux * rmdemux, GstEvent * event) /* Reset the demuxer state */ rmdemux->state = RMDEMUX_STATE_DATA_PACKET; - if (flush) - gst_rmdemux_send_event (rmdemux, gst_event_new_flush_stop (TRUE)); + if (flush) { + fl_event = gst_event_new_flush_stop (TRUE); + if (seqnum != GST_SEQNUM_INVALID) + gst_event_set_seqnum (fl_event, seqnum); + gst_rmdemux_send_event (rmdemux, fl_event); + } /* must send newsegment event from streaming thread, so just set flag */ rmdemux->need_newsegment = TRUE; /* notify start of new segment */ if (rmdemux->segment.flags & GST_SEEK_FLAG_SEGMENT) { - gst_element_post_message (GST_ELEMENT_CAST (rmdemux), + GstMessage *msg = gst_message_new_segment_start (GST_OBJECT_CAST (rmdemux), - GST_FORMAT_TIME, rmdemux->segment.position)); + GST_FORMAT_TIME, rmdemux->segment.position); + if (seqnum != GST_SEQNUM_INVALID) + gst_message_set_seqnum (msg, seqnum); + gst_element_post_message (GST_ELEMENT_CAST (rmdemux), msg); } /* restart our task since it might have been stopped when we did the @@ -731,6 +764,8 @@ gst_rmdemux_reset (GstRMDemux * rmdemux) rmdemux->have_group_id = FALSE; rmdemux->group_id = G_MAXUINT; + + rmdemux->seek_seqnum = GST_SEQNUM_INVALID; } static GstStateChangeReturn diff --git a/gst/realmedia/rmdemux.h b/gst/realmedia/rmdemux.h index 68a17009..184a6c3b 100644 --- a/gst/realmedia/rmdemux.h +++ b/gst/realmedia/rmdemux.h @@ -103,6 +103,7 @@ struct _GstRMDemux { guint offset; gboolean seekable; + guint32 seek_seqnum; GstRMDemuxState state; GstRMDemuxLoopState loop_state; |