mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 01:30:38 +00:00
rtpjitterbuffer: Don't always reset PTS to 0 after a gap
In function rtp_jitter_buffer_calculate_pts: If gap in incoming RTP timestamps is more than (3 * jbuf->clock_rate) we call rtp_jitter_buffer_reset_skew which resets pts to 0. So components down the pipeline (playes, mixers) just skip frames/samples until pts becomes equal to pts before gap. In version 1.10.2 and before this checking was bypassed for packets with "estimated dts", and gaps were handled correctly. https://bugzilla.gnome.org/show_bug.cgi?id=778341
This commit is contained in:
parent
16941255e7
commit
76792a5c20
3 changed files with 10 additions and 7 deletions
|
@ -2929,8 +2929,9 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent,
|
|||
GST_DEBUG_OBJECT (jitterbuffer, "First buffer #%d", seqnum);
|
||||
|
||||
/* calculate a pts based on rtptime and arrival time (dts) */
|
||||
pts = rtp_jitter_buffer_calculate_pts (priv->jbuf, dts, rtptime,
|
||||
gst_element_get_base_time (GST_ELEMENT_CAST (jitterbuffer)));
|
||||
pts =
|
||||
rtp_jitter_buffer_calculate_pts (priv->jbuf, dts, estimated_dts,
|
||||
rtptime, gst_element_get_base_time (GST_ELEMENT_CAST (jitterbuffer)));
|
||||
|
||||
/* we don't know what the next_in_seqnum should be, wait for the last
|
||||
* possible moment to push this buffer, maybe we get an earlier seqnum
|
||||
|
@ -2981,8 +2982,10 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent,
|
|||
g_queue_clear (&priv->gap_packets);
|
||||
|
||||
/* calculate a pts based on rtptime and arrival time (dts) */
|
||||
pts = rtp_jitter_buffer_calculate_pts (priv->jbuf, dts, rtptime,
|
||||
gst_element_get_base_time (GST_ELEMENT_CAST (jitterbuffer)));
|
||||
/* If we estimated the DTS, don't consider it in the clock skew calculations */
|
||||
pts =
|
||||
rtp_jitter_buffer_calculate_pts (priv->jbuf, dts, estimated_dts,
|
||||
rtptime, gst_element_get_base_time (GST_ELEMENT_CAST (jitterbuffer)));
|
||||
|
||||
if (G_LIKELY (gap == 0)) {
|
||||
/* packet is expected */
|
||||
|
|
|
@ -690,7 +690,7 @@ queue_do_insert (RTPJitterBuffer * jbuf, GList * list, GList * item)
|
|||
|
||||
GstClockTime
|
||||
rtp_jitter_buffer_calculate_pts (RTPJitterBuffer * jbuf, GstClockTime dts,
|
||||
guint32 rtptime, GstClockTime base_time)
|
||||
gboolean estimated_dts, guint32 rtptime, GstClockTime base_time)
|
||||
{
|
||||
guint64 ext_rtptime;
|
||||
GstClockTime gstrtptime, pts;
|
||||
|
@ -703,7 +703,7 @@ rtp_jitter_buffer_calculate_pts (RTPJitterBuffer * jbuf, GstClockTime dts,
|
|||
* Only reset if valid input time, which is likely for UDP input
|
||||
* where we expect this might happen due to async thread effects
|
||||
* (in seek and state change cycles), but not so much for TCP input */
|
||||
if (GST_CLOCK_TIME_IS_VALID (dts) &&
|
||||
if (GST_CLOCK_TIME_IS_VALID (dts) && !estimated_dts &&
|
||||
jbuf->mode != RTP_JITTER_BUFFER_MODE_SLAVE &&
|
||||
jbuf->base_time != -1 && jbuf->last_rtptime != -1) {
|
||||
GstClockTime ext_rtptime = jbuf->ext_rtptime;
|
||||
|
|
|
@ -189,7 +189,7 @@ void rtp_jitter_buffer_get_sync (RTPJitterBuffer *jbuf,
|
|||
guint64 *timestamp, guint32 *clock_rate,
|
||||
guint64 *last_rtptime);
|
||||
|
||||
GstClockTime rtp_jitter_buffer_calculate_pts (RTPJitterBuffer * jbuf, GstClockTime dts,
|
||||
GstClockTime rtp_jitter_buffer_calculate_pts (RTPJitterBuffer * jbuf, GstClockTime dts, gboolean estimated_dts,
|
||||
guint32 rtptime, GstClockTime base_time);
|
||||
|
||||
#endif /* __RTP_JITTER_BUFFER_H__ */
|
||||
|
|
Loading…
Reference in a new issue