wtay gst-plugins-bad: gst-plugins-bad/ gst-plugins-bad/gst/rtpmanager/

[email protected] Tue, 23 Dec 2008 03:40:14 -0800 (PST)
Newsgroups gmane.comp.video.gstreamer.cvs
Message-ID <[email protected]>
CVS Root:       /cvs/gstreamer
Module:         gst-plugins-bad
Changes by:     wtay
Date:           Tue Dec 23 2008  11:40:14 UTC

Log message:
Patch by: Arnout Vandecappelle <arnout at mind dot be>
* gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew),
(calculate_skew):
* gst/rtpmanager/rtpjitterbuffer.h:
Keep track of the last outgoing timestamp and of the last sender-side
time.  Timestamps can only go forward if they do at the sender
side, can only go back if they do at the sender side, and remain the
same if they remain the same at the sender side. Fixes #565319.

Modified files:
    .               : ChangeLog
    gst/rtpmanager  : rtpjitterbuffer.c rtpjitterbuffer.h

Links:
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3829&r2=1.3830
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/rtpmanager/rtpjitterbuffer.c.diff?r1=1.22&r2=1.23
http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/rtpmanager/rtpjitterbuffer.h.diff?r1=1.12&r2=1.13

====Begin Diffs====
Index: ChangeLog
===================================================================
RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v
retrieving revision 1.3829
retrieving revision 1.3830
diff -u -d -r1.3829 -r1.3830
--- ChangeLog	22 Dec 2008 20:56:09 -0000	1.3829
+++ ChangeLog	23 Dec 2008 11:39:58 -0000	1.3830
@@ -1,3 +1,15 @@
+2008-12-23  Wim Taymans  <[email protected]>
+
+	Patch by: Arnout Vandecappelle <arnout at mind dot be>
+	* gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_reset_skew),
+	(calculate_skew):
+	* gst/rtpmanager/rtpjitterbuffer.h:
+	Keep track of the last outgoing timestamp and of the last sender-side
+	time.  Timestamps can only go forward if they do at the sender
+	side, can only go back if they do at the sender side, and remain the
+	same if they remain the same at the sender side. Fixes #565319.
 2008-12-22  Sebastian Dröge  <[email protected]>
 
 	* gst/mxf/mxfmpeg.c: (mxf_mpeg_es_create_caps),
Index: rtpjitterbuffer.c
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/rtpmanager/rtpjitterbuffer.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- rtpjitterbuffer.c	19 Nov 2008 09:06:29 -0000	1.22
+++ rtpjitterbuffer.c	23 Dec 2008 11:39:59 -0000	1.23
@@ -113,6 +113,7 @@
   jbuf->window_min = 0;
   jbuf->skew = 0;
   jbuf->prev_send_diff = -1;
+  jbuf->prev_out_time = -1;
   GST_DEBUG ("reset skew correction");
 }
@@ -198,16 +199,20 @@
     jbuf->base_time = -1;
     jbuf->base_rtptime = -1;
     jbuf->clock_rate = clock_rate;
+    jbuf->prev_out_time = -1;
+    jbuf->prev_send_diff = -1;
   }
   /* first time, lock on to time and gstrtptime */
   if (G_UNLIKELY (jbuf->base_time == -1)) {
     jbuf->base_time = time;
     GST_DEBUG ("Taking new base time %" GST_TIME_FORMAT, GST_TIME_ARGS (time));
   if (G_UNLIKELY (jbuf->base_rtptime == -1)) {
     jbuf->base_rtptime = gstrtptime;
     jbuf->base_extrtp = ext_rtptime;
     GST_DEBUG ("Taking new base rtptime %" GST_TIME_FORMAT,
         GST_TIME_ARGS (gstrtptime));
@@ -221,6 +226,8 @@
     send_diff = 0;
@@ -253,6 +260,8 @@
     delta = 0;
@@ -333,11 +342,31 @@
 no_skew:
   /* the output time is defined as the base timestamp plus the RTP time
    * adjusted for the clock skew .*/
-  if (jbuf->base_time != -1)
+  if (jbuf->base_time != -1) {
     out_time = jbuf->base_time + send_diff + jbuf->skew;
-  else
+    /* check if timestamps are not going backwards, we can only check this if we
+     * have a previous out time and a previous send_diff */
+    if (G_LIKELY (jbuf->prev_out_time != -1 && jbuf->prev_send_diff != -1)) {
+      /* now check for backwards timestamps */
+      if (G_UNLIKELY (
+              /* if the server timestamps went up and the out_time backwards */
+              (send_diff > jbuf->prev_send_diff
+                  && out_time < jbuf->prev_out_time) ||
+              /* if the server timestamps went backwards and the out_time forwards */
+              (send_diff < jbuf->prev_send_diff
+                  && out_time > jbuf->prev_out_time) ||
+              /* if the server timestamps did not change */
+              send_diff == jbuf->prev_send_diff)) {
+        GST_DEBUG ("backwards timestamps, using previous time");
+        out_time = jbuf->prev_out_time;
+      }
+    }
+  } else
     out_time = -1;
+  jbuf->prev_out_time = out_time;
+  jbuf->prev_send_diff = send_diff;
   GST_DEBUG ("skew %" G_GINT64_FORMAT ", out %" GST_TIME_FORMAT,
       jbuf->skew, GST_TIME_ARGS (out_time));
Index: rtpjitterbuffer.h
RCS file: /cvs/gstreamer/gst-plugins-bad/gst/rtpmanager/rtpjitterbuffer.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- rtpjitterbuffer.h	19 Nov 2008 09:06:29 -0000	1.12
+++ rtpjitterbuffer.h	23 Dec 2008 11:39:59 -0000	1.13
@@ -58,6 +58,7 @@
   GstClockTime   base_rtptime;
   guint32        clock_rate;
   GstClockTime   base_extrtp;
+  GstClockTime   prev_out_time;
   guint64        ext_rtptime;
   guint64        last_rtptime;
   gint64         window[RTP_JITTER_BUFFER_MAX_WINDOW];

------------------------------------------------------------------------------

_______________________________________________
gstreamer-cvs-verbose mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gstreamer-cvs-verbose