From 16e70c80aeb3d12f534651c59a35db615ee8cc0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sun, 31 Aug 2008 15:01:32 +0000 Subject: 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. --- ext/celt/gstceltdec.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'ext/celt/gstceltdec.c') 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; -- cgit v1.2.1