From fd7ecac7935c9635b61a4f20dce695210ecc361d Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 9 Apr 2020 12:23:44 -0400 Subject: [PATCH] rtspsrc: Properly set segments seqnums after seeks --- gst/rtsp/gstrtspsrc.c | 8 ++++++++ gst/rtsp/gstrtspsrc.h | 1 + 2 files changed, 9 insertions(+) diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index 09c42c7..f97f0a9 100644 --- a/gst/rtsp/gstrtspsrc.c +++ b/gst/rtsp/gstrtspsrc.c @@ -1394,6 +1394,7 @@ gst_rtspsrc_init (GstRTSPSrc * src) src->onvif_mode = DEFAULT_ONVIF_MODE; src->onvif_rate_control = DEFAULT_ONVIF_RATE_CONTROL; src->is_live = DEFAULT_IS_LIVE; + src->seek_seqnum = GST_SEQNUM_INVALID; /* get a list of all extensions */ src->extensions = gst_rtsp_ext_list_get (); @@ -2920,6 +2921,7 @@ gst_rtspsrc_perform_seek (GstRTSPSrc * src, GstEvent * event) /* If an accurate seek was requested, we want to clip the segment we * output in ONVIF mode to the requested bounds */ src->clip_out_segment = ! !(flags & GST_SEEK_FLAG_ACCURATE); + src->seek_seqnum = gst_event_get_seqnum (event); if (playing) gst_rtspsrc_play (src, &seeksegment, FALSE, seek_style); @@ -2992,6 +2994,7 @@ gst_rtspsrc_handle_src_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstRTSPStream *stream; + GstRTSPSrc *self = GST_RTSPSRC (GST_OBJECT_PARENT (parent)); stream = gst_pad_get_element_private (pad); @@ -3008,6 +3011,10 @@ gst_rtspsrc_handle_src_sink_event (GstPad * pad, GstObject * parent, g_free (stream_id); break; } + case GST_EVENT_SEGMENT: + if (self->seek_seqnum != GST_SEQNUM_INVALID) + GST_EVENT_SEQNUM (event) = self->seek_seqnum; + break; default: break; } @@ -9175,6 +9182,7 @@ gst_rtspsrc_change_state (GstElement * element, GstStateChange transition) ret = GST_STATE_CHANGE_SUCCESS; break; case GST_STATE_CHANGE_PAUSED_TO_READY: + rtspsrc->seek_seqnum = GST_SEQNUM_INVALID; gst_rtspsrc_loop_send_cmd_and_wait (rtspsrc, CMD_CLOSE, CMD_ALL, rtspsrc->teardown_timeout); ret = GST_STATE_CHANGE_SUCCESS; diff --git a/gst/rtsp/gstrtspsrc.h b/gst/rtsp/gstrtspsrc.h index cf42ab6..9ed8dd4 100644 --- a/gst/rtsp/gstrtspsrc.h +++ b/gst/rtsp/gstrtspsrc.h @@ -303,6 +303,7 @@ struct _GstRTSPSrc { * between any two random access points * */ gfloat seekable; + guint32 seek_seqnum; GstClockTime last_pos; /* session management */ -- 2.7.4