diff options
-rw-r--r-- | ChangeLog | 7 | ||||
m--------- | common | 0 | ||||
-rw-r--r-- | gst/dvdlpcmdec/gstdvdlpcmdec.c | 22 |
3 files changed, 25 insertions, 4 deletions
@@ -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; } |