summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
m---------common0
-rw-r--r--gst/dvdlpcmdec/gstdvdlpcmdec.c22
3 files changed, 25 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index eb4b37b8..becc43e6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-09-28 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * gst/dvdlpcmdec/gstdvdlpcmdec.c: (update_timestamps):
+ If an incoming timestamp is within one sample of our current
+ timestamp, then keep it. This prevents imprecision in the
+ PTS (which only has 90khz granularity) from affecting our stream.
+
2006-09-28 Tim-Philipp Müller <tim at centricular dot net>
* gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_handle_src_query):
diff --git a/common b/common
-Subproject a8c15b7a2c75fc2bd83850cb17cb05a1ee84eca
+Subproject bdd0108b3540ffadeb82cee28b8867a8a6e7ae7
diff --git a/gst/dvdlpcmdec/gstdvdlpcmdec.c b/gst/dvdlpcmdec/gstdvdlpcmdec.c
index 15a05965..2c5831b9 100644
--- a/gst/dvdlpcmdec/gstdvdlpcmdec.c
+++ b/gst/dvdlpcmdec/gstdvdlpcmdec.c
@@ -259,16 +259,30 @@ caps_parse_error:
static void
update_timestamps (GstDvdLpcmDec * dvdlpcmdec, GstBuffer * buf, int samples)
{
+ gboolean take_buf_ts = FALSE;
+
GST_BUFFER_DURATION (buf) =
gst_util_uint64_scale (samples, GST_SECOND, dvdlpcmdec->rate);
if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
- /* Then leave it as-is, and save this timestamp */
+ if (GST_CLOCK_TIME_IS_VALID (dvdlpcmdec->timestamp)) {
+ GstClockTimeDiff one_sample = GST_SECOND / dvdlpcmdec->rate;
+ GstClockTimeDiff diff = GST_CLOCK_DIFF (GST_BUFFER_TIMESTAMP (buf),
+ dvdlpcmdec->timestamp);
+
+ if (diff > one_sample || diff < -one_sample)
+ take_buf_ts = TRUE;
+ } else {
+ take_buf_ts = TRUE;
+ }
+ } else if (!GST_CLOCK_TIME_IS_VALID (dvdlpcmdec->timestamp)) {
+ dvdlpcmdec->timestamp = dvdlpcmdec->segment_start;
+ }
+
+ if (take_buf_ts) {
+ /* Take buffer timestamp */
dvdlpcmdec->timestamp = GST_BUFFER_TIMESTAMP (buf);
} else {
- if (!GST_CLOCK_TIME_IS_VALID (dvdlpcmdec->timestamp))
- dvdlpcmdec->timestamp = dvdlpcmdec->segment_start;
-
GST_BUFFER_TIMESTAMP (buf) = dvdlpcmdec->timestamp;
}