diff options
author | Sebastian Dröge <slomo@circular-chaos.org> | 2008-08-31 14:39:57 +0000 |
---|---|---|
committer | Sebastian Dröge <slomo@circular-chaos.org> | 2008-08-31 14:39:57 +0000 |
commit | 25896b3a93da2cc7a8b2c5418d874bdb0065c5ef (patch) | |
tree | eef8dca6d7544e9a2af0784955eeced545064f0d /ext/speex/gstspeexdec.c | |
parent | 467b9f2861846accbc3cfbe726d163cf1be312a1 (diff) |
ext/speex/gstspeexdec.c: Correctly take the granulepos from upstream if possible and correctly handle the granulepos ...
Original commit message from CVS:
* ext/speex/gstspeexdec.c: (speex_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/speex/gstspeexenc.c: (gst_speex_enc_sinkevent),
(gst_speex_enc_encode), (gst_speex_enc_chain),
(gst_speex_enc_change_state):
* ext/speex/gstspeexenc.h:
Handle non-zero start timestamps in the encoder and detect/handle
stream discontinuities. Fixes bug #547075.
Diffstat (limited to 'ext/speex/gstspeexdec.c')
-rw-r--r-- | ext/speex/gstspeexdec.c | 18 |
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; |