summaryrefslogtreecommitdiffstats
path: root/ext/speex/gstspeexdec.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/speex/gstspeexdec.c')
-rw-r--r--ext/speex/gstspeexdec.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/ext/speex/gstspeexdec.c b/ext/speex/gstspeexdec.c
index a42de618..a3881451 100644
--- a/ext/speex/gstspeexdec.c
+++ b/ext/speex/gstspeexdec.c
@@ -664,6 +664,14 @@ speex_dec_chain_parse_data (GstSpeexDec * dec, GstBuffer * buf,
GST_DEBUG_OBJECT (dec, "received buffer of size %u, fpp %d", size, fpp);
+ if (!GST_BUFFER_TIMESTAMP_IS_VALID (buf)
+ && GST_BUFFER_OFFSET_END_IS_VALID (buf)) {
+ dec->granulepos = GST_BUFFER_OFFSET_END (buf);
+ GST_DEBUG_OBJECT (dec,
+ "Taking granulepos from upstream: %" G_GUINT64_FORMAT,
+ dec->granulepos);
+ }
+
/* copy timestamp */
} else {
/* concealment data, pass NULL as the bits parameters */
@@ -722,21 +730,21 @@ speex_dec_chain_parse_data (GstSpeexDec * dec, GstBuffer * buf,
if (dec->granulepos == -1) {
if (dec->segment.format != GST_FORMAT_TIME) {
GST_WARNING_OBJECT (dec, "segment not initialized or not TIME format");
- dec->granulepos = 0;
+ dec->granulepos = dec->frame_size;
} else {
dec->granulepos = gst_util_uint64_scale_int (dec->segment.last_stop,
- dec->header->rate, GST_SECOND);
+ dec->header->rate, GST_SECOND) + dec->frame_size;
}
GST_DEBUG_OBJECT (dec, "granulepos=%" G_GINT64_FORMAT, dec->granulepos);
}
if (timestamp == -1) {
- timestamp = gst_util_uint64_scale_int (dec->granulepos,
+ timestamp = gst_util_uint64_scale_int (dec->granulepos - dec->frame_size,
GST_SECOND, dec->header->rate);
}
- GST_BUFFER_OFFSET (outbuf) = dec->granulepos;
- GST_BUFFER_OFFSET_END (outbuf) = dec->granulepos + dec->frame_size;
+ GST_BUFFER_OFFSET (outbuf) = dec->granulepos - dec->frame_size;
+ GST_BUFFER_OFFSET_END (outbuf) = dec->granulepos;
GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
GST_BUFFER_DURATION (outbuf) = dec->frame_duration;