diff options
author | Sebastian Dröge <slomo@circular-chaos.org> | 2006-08-16 10:40:04 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2006-08-16 10:40:04 +0000 |
commit | f349fb381066e316a38e3a068cb287ce36684a5f (patch) | |
tree | 8d454c6eccd9a3243b2d29bd66a7cc7c6b5c6d8c /ext/wavpack/gstwavpackparse.c | |
parent | 058dec01f1356d6dbb0a2d3d053ed6558fa3504e (diff) | |
download | gst-plugins-bad-f349fb381066e316a38e3a068cb287ce36684a5f.tar.gz gst-plugins-bad-f349fb381066e316a38e3a068cb287ce36684a5f.tar.bz2 gst-plugins-bad-f349fb381066e316a38e3a068cb287ce36684a5f.zip |
ext/wavpack/: In push mode, re-sync to next wavpack header if sync is lost (#351557). Also use hyphens instead of und...
Original commit message from CVS:
Patch by: Sebastian Dröge <slomo at circular-chaos.org>
* ext/wavpack/gstwavpackenc.c: (gst_wavpack_enc_class_init):
* ext/wavpack/gstwavpackparse.c:
(gst_wavpack_parse_resync_adapter), (gst_wavpack_parse_chain):
In push mode, re-sync to next wavpack header if sync is lost
(#351557). Also use hyphens instead of underscores in
GObject property names.
Diffstat (limited to 'ext/wavpack/gstwavpackparse.c')
-rw-r--r-- | ext/wavpack/gstwavpackparse.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/ext/wavpack/gstwavpackparse.c b/ext/wavpack/gstwavpackparse.c index 720b25b0..20b024f3 100644 --- a/ext/wavpack/gstwavpackparse.c +++ b/ext/wavpack/gstwavpackparse.c @@ -935,6 +935,34 @@ pause: } } +static gboolean +gst_wavpack_parse_resync_adapter (GstAdapter * adapter) +{ + const guint8 *buf; + guint avail = gst_adapter_available (adapter); + gchar *marker; + + if (avail < 4) + return FALSE; + + /* if the marker is at the beginning don't do the expensive search */ + buf = gst_adapter_peek (adapter, 4); + if (memcmp (buf, "wvpk", 4) == 0) + return TRUE; + + if (avail == 4) + return FALSE; + + /* search for the marker in the complete content of the adapter */ + buf = gst_adapter_peek (adapter, avail); + if (buf && (marker = g_strstr_len ((gchar *) buf, avail, "wvpk"))) { + gst_adapter_flush (adapter, marker - (gchar *) buf); + return TRUE; + } + + return FALSE; +} + static GstFlowReturn gst_wavpack_parse_chain (GstPad * pad, GstBuffer * buf) { @@ -956,11 +984,12 @@ gst_wavpack_parse_chain (GstPad * pad, GstBuffer * buf) if (gst_adapter_available (wvparse->adapter) < sizeof (WavpackHeader)) return ret; + if (!gst_wavpack_parse_resync_adapter (wvparse->adapter)) + return ret; + tmp_buf = gst_adapter_peek (wvparse->adapter, sizeof (WavpackHeader)); gst_wavpack_read_header (&wph, (guint8 *) tmp_buf); - /* FIXME: should check for wavpack marker here and re-sync if not */ - while (gst_adapter_available (wvparse->adapter) >= wph.ckSize + 4 * 1 + 4) { GstBuffer *outbuf = gst_adapter_take_buffer (wvparse->adapter, wph.ckSize + 4 * 1 + 4); @@ -983,6 +1012,10 @@ gst_wavpack_parse_chain (GstPad * pad, GstBuffer * buf) if (gst_adapter_available (wvparse->adapter) >= sizeof (WavpackHeader)) { tmp_buf = gst_adapter_peek (wvparse->adapter, sizeof (WavpackHeader)); + + if (!gst_wavpack_parse_resync_adapter (wvparse->adapter)) + break; + gst_wavpack_read_header (&wph, (guint8 *) tmp_buf); } } |