diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | ext/wavpack/gstwavpackdec.c | 5 | ||||
-rw-r--r-- | ext/wavpack/gstwavpackdec.h | 1 | ||||
-rw-r--r-- | ext/wavpack/gstwavpackparse.c | 5 | ||||
-rw-r--r-- | ext/wavpack/gstwavpackparse.h | 1 |
5 files changed, 21 insertions, 2 deletions
@@ -1,3 +1,14 @@ +2007-06-09 Sebastian Dröge <slomo@circular-chaos.org> + + * ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_reset), + (gst_wavpack_dec_chain): + * ext/wavpack/gstwavpackdec.h: + * ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_reset), + (gst_wavpack_parse_push_buffer): + * ext/wavpack/gstwavpackparse.h: + Improve discont handling by checking if the next Wavpack block has + the expected, following block index. + 2007-06-08 Thomas Vander Stichele <thomas at apestaart dot org> * gst/rtp/gstrtpmp4vpay.c (gst_rtp_mp4vpay_details): diff --git a/ext/wavpack/gstwavpackdec.c b/ext/wavpack/gstwavpackdec.c index 5adaf1be4..437ba0d00 100644 --- a/ext/wavpack/gstwavpackdec.c +++ b/ext/wavpack/gstwavpackdec.c @@ -130,6 +130,7 @@ gst_wavpack_dec_reset (GstWavpackDec * dec) dec->depth = 0; gst_segment_init (&dec->segment, GST_FORMAT_UNDEFINED); + dec->next_block_index = 0; } static void @@ -362,9 +363,11 @@ gst_wavpack_dec_chain (GstPad * pad, GstBuffer * buf) /* If we got a DISCONT buffer forward the flag. Nothing else * has to be done as libwavpack doesn't store state between * Wavpack blocks */ - if (GST_BUFFER_IS_DISCONT (buf)) + if (GST_BUFFER_IS_DISCONT (buf) || dec->next_block_index != wph.block_index) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + dec->next_block_index = wph.block_index + wph.block_samples; + /* decode */ decoded = WavpackUnpackSamples (dec->context, (int32_t *) GST_BUFFER_DATA (outbuf), wph.block_samples); diff --git a/ext/wavpack/gstwavpackdec.h b/ext/wavpack/gstwavpackdec.h index 68380ca5d..007e7c22e 100644 --- a/ext/wavpack/gstwavpackdec.h +++ b/ext/wavpack/gstwavpackdec.h @@ -57,6 +57,7 @@ struct _GstWavpackDec read_id wv_id; GstSegment segment; /* used for clipping, TIME format */ + guint32 next_block_index; gint sample_rate; gint depth; diff --git a/ext/wavpack/gstwavpackparse.c b/ext/wavpack/gstwavpackparse.c index 61c94f1e3..0c77d555b 100644 --- a/ext/wavpack/gstwavpackparse.c +++ b/ext/wavpack/gstwavpackparse.c @@ -218,6 +218,7 @@ gst_wavpack_parse_reset (GstWavpackParse * parse) parse->channels = 0; gst_segment_init (&parse->segment, GST_FORMAT_UNDEFINED); + parse->next_block_index = 0; parse->current_offset = 0; parse->need_newsegment = TRUE; @@ -890,11 +891,13 @@ gst_wavpack_parse_push_buffer (GstWavpackParse * wvparse, GstBuffer * buf, GST_BUFFER_OFFSET (buf) = header->block_index; GST_BUFFER_OFFSET_END (buf) = header->block_index + header->block_samples; - if (wvparse->discont) { + if (wvparse->discont || wvparse->next_block_index != header->block_index) { GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT); wvparse->discont = FALSE; } + wvparse->next_block_index = header->block_index + header->block_samples; + gst_buffer_set_caps (buf, GST_PAD_CAPS (wvparse->srcpad)); GST_LOG_OBJECT (wvparse, "Pushing buffer with time %" GST_TIME_FORMAT, diff --git a/ext/wavpack/gstwavpackparse.h b/ext/wavpack/gstwavpackparse.h index c1d6feea5..0b089d9f4 100644 --- a/ext/wavpack/gstwavpackparse.h +++ b/ext/wavpack/gstwavpackparse.h @@ -67,6 +67,7 @@ struct _GstWavpackParse GstSegment segment; /* the currently configured segment, in * samples/audio frames (DEFAULT format) */ + guint32 next_block_index; GstAdapter *adapter; /* when operating chain-based, otherwise NULL */ |