summaryrefslogtreecommitdiffstats
path: root/ext/celt/gstceltdec.c
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2008-08-31 15:01:32 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2008-08-31 15:01:32 +0000
commit16e70c80aeb3d12f534651c59a35db615ee8cc0a (patch)
tree0dc2077be8e66dc672dadd4331d4d7b364377a07 /ext/celt/gstceltdec.c
parent315cb1ab96543431e315e2572da8821347cf7521 (diff)
downloadgst-plugins-bad-16e70c80aeb3d12f534651c59a35db615ee8cc0a.tar.gz
gst-plugins-bad-16e70c80aeb3d12f534651c59a35db615ee8cc0a.tar.bz2
gst-plugins-bad-16e70c80aeb3d12f534651c59a35db615ee8cc0a.zip
ext/celt/gstceltdec.c: Correctly take the granulepos from upstream if possible and correctly handle the granulepos in...
Original commit message from CVS: * ext/celt/gstceltdec.c: (celt_dec_chain_parse_data): Correctly take the granulepos from upstream if possible and correctly handle the granulepos in various calculations: the granulepos is the sample number of the _last_ sample in a frame, not the first. * ext/celt/gstceltenc.c: (gst_celt_enc_sinkevent), (gst_celt_enc_encode), (gst_celt_enc_chain), (gst_celt_enc_change_state): * ext/celt/gstceltenc.h: Handle non-zero start timestamps in the encoder and detect/handle stream discontinuities. Fixes bug #547075.
Diffstat (limited to 'ext/celt/gstceltdec.c')
-rw-r--r--ext/celt/gstceltdec.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/ext/celt/gstceltdec.c b/ext/celt/gstceltdec.c
index c14f787d..fe1914b8 100644
--- a/ext/celt/gstceltdec.c
+++ b/ext/celt/gstceltdec.c
@@ -618,6 +618,13 @@ celt_dec_chain_parse_data (GstCeltDec * dec, GstBuffer * buf,
size = GST_BUFFER_SIZE (buf);
GST_DEBUG_OBJECT (dec, "received buffer of size %u", size);
+ 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 {
@@ -649,18 +656,19 @@ celt_dec_chain_parse_data (GstCeltDec * 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.sample_rate, GST_SECOND);
+ dec->header.sample_rate, GST_SECOND) + dec->frame_size;
}
GST_DEBUG_OBJECT (dec, "granulepos=%" G_GINT64_FORMAT, dec->granulepos);
}
- GST_BUFFER_OFFSET (outbuf) = dec->granulepos;
- GST_BUFFER_OFFSET_END (outbuf) = dec->granulepos + dec->frame_size;
- GST_BUFFER_TIMESTAMP (outbuf) = gst_util_uint64_scale_int (dec->granulepos,
- GST_SECOND, dec->header.sample_rate);
+ GST_BUFFER_OFFSET (outbuf) = dec->granulepos - dec->frame_size;
+ GST_BUFFER_OFFSET_END (outbuf) = dec->granulepos;
+ GST_BUFFER_TIMESTAMP (outbuf) =
+ gst_util_uint64_scale_int (dec->granulepos - dec->frame_size, GST_SECOND,
+ dec->header.sample_rate);
GST_BUFFER_DURATION (outbuf) = dec->frame_duration;
dec->granulepos += dec->frame_size;