From 802ad7310337a7436fea20486ee54d94b2142816 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Wed, 25 Mar 2015 18:40:25 -0400 Subject: [PATCH] basedepayload: Fix generated segment This fixes playback position in RTSP. https://bugzilla.gnome.org/show_bug.cgi?id=635701 --- gst-libs/gst/rtp/gstrtpbasedepayload.c | 26 ++++++++++++++++++++++---- tests/check/libs/rtpbasedepayload.c | 8 ++++---- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/gst-libs/gst/rtp/gstrtpbasedepayload.c b/gst-libs/gst/rtp/gstrtpbasedepayload.c index 05a9033c88..415899a74c 100644 --- a/gst-libs/gst/rtp/gstrtpbasedepayload.c +++ b/gst-libs/gst/rtp/gstrtpbasedepayload.c @@ -563,24 +563,31 @@ static GstEvent * create_segment_event (GstRTPBaseDepayload * filter, GstClockTime position) { GstEvent *event; - GstClockTime stop; + GstClockTime stop, running_time; GstRTPBaseDepayloadPrivate *priv; GstSegment segment; priv = filter->priv; if (priv->npt_stop != -1) - stop = priv->npt_stop - priv->npt_start; + stop = position + priv->npt_stop - priv->npt_start; else stop = -1; + if (position == -1) + position = 0; + + running_time = gst_segment_to_running_time (&filter->segment, + GST_FORMAT_TIME, position); + gst_segment_init (&segment, GST_FORMAT_TIME); segment.rate = priv->play_speed; segment.applied_rate = priv->play_scale; - segment.start = 0; + segment.start = position; segment.stop = stop; segment.time = priv->npt_start; segment.position = position; + segment.base = running_time; event = gst_event_new_segment (&segment); @@ -649,8 +656,19 @@ gst_rtp_base_depayload_prepare_push (GstRTPBaseDepayload * filter, /* if this is the first buffer send a NEWSEGMENT */ if (G_UNLIKELY (filter->need_newsegment)) { GstEvent *event; + GstClockTime pts; - event = create_segment_event (filter, 0); + if (is_list) { + GstBufferList **blist = obj; + GstBuffer *buf = gst_buffer_list_get (*blist, 0); + pts = GST_BUFFER_PTS (buf); + } else { + GstBuffer **buf = obj; + set_headers (buf, 0, &data); + pts = GST_BUFFER_PTS (*buf); + } + + event = create_segment_event (filter, pts); gst_pad_push_event (filter->srcpad, event); diff --git a/tests/check/libs/rtpbasedepayload.c b/tests/check/libs/rtpbasedepayload.c index 15fa5114eb..05e4e582e4 100644 --- a/tests/check/libs/rtpbasedepayload.c +++ b/tests/check/libs/rtpbasedepayload.c @@ -933,8 +933,8 @@ GST_START_TEST (rtp_base_depayload_npt_test) validate_event (6, "segment", "time", G_GUINT64_CONSTANT (1234), - "start", G_GUINT64_CONSTANT (0), - "stop", G_GUINT64_CONSTANT (4321 - 1234), NULL); + "start", GST_SECOND, + "stop", GST_SECOND + G_GUINT64_CONSTANT (4321 - 1234), NULL); destroy_depayloader (state); } @@ -994,7 +994,7 @@ GST_START_TEST (rtp_base_depayload_play_scale_test) validate_event (6, "segment", "time", G_GUINT64_CONSTANT (0), - "start", G_GUINT64_CONSTANT (0), + "start", GST_SECOND, "stop", G_MAXUINT64, "rate", 1.0, "applied-rate", 2.0, NULL); destroy_depayloader (state); @@ -1055,7 +1055,7 @@ GST_START_TEST (rtp_base_depayload_play_speed_test) validate_event (6, "segment", "time", G_GUINT64_CONSTANT (0), - "start", G_GUINT64_CONSTANT (0), + "start", GST_SECOND, "stop", G_MAXUINT64, "rate", 2.0, "applied-rate", 1.0, NULL); destroy_depayloader (state);