From e05417a077e8d85cafe68bd215c6b0fd133b0022 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 9 Jun 2007 15:33:32 +0000 Subject: [PATCH] ext/wavpack/: Improve discont handling by checking if the next Wavpack block has the expected, following block index. Original commit message from CVS: * 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. --- ChangeLog | 11 +++++++++++ ext/wavpack/gstwavpackdec.c | 5 ++++- ext/wavpack/gstwavpackdec.h | 1 + ext/wavpack/gstwavpackparse.c | 5 ++++- ext/wavpack/gstwavpackparse.h | 1 + 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0865a85..9b11b2b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2007-06-09 Sebastian Dröge + + * 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 * gst/rtp/gstrtpmp4vpay.c (gst_rtp_mp4vpay_details): diff --git a/ext/wavpack/gstwavpackdec.c b/ext/wavpack/gstwavpackdec.c index 5adaf1b..437ba0d 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 68380ca..007e7c2 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 61c94f1..0c77d55 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 c1d6fee..0b089d9 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 */ -- 2.7.4