summaryrefslogtreecommitdiffstats
path: root/gst-libs/gst/riff/riff-read.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst-libs/gst/riff/riff-read.c')
-rw-r--r--gst-libs/gst/riff/riff-read.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/gst-libs/gst/riff/riff-read.c b/gst-libs/gst/riff/riff-read.c
index 388ea753..fc47f2c8 100644
--- a/gst-libs/gst/riff/riff-read.c
+++ b/gst-libs/gst/riff/riff-read.c
@@ -154,8 +154,24 @@ gboolean
gst_riff_peek_head (GstRiffRead * riff,
guint32 * tag, guint32 * length, guint * level_up)
{
+ GList *last;
guint8 *data;
+ /* if we're at the end of a chunk, but unaligned, then re-align.
+ * Those are essentially broken files, but unfortunately they
+ * exist. */
+ if ((last = g_list_last (riff->level)) != NULL) {
+ GstRiffLevel *level = last->data;
+ guint64 pos = gst_bytestream_tell (riff->bs);
+
+ if (level->start + level->length - pos < 8) {
+ if (!gst_bytestream_flush (riff->bs, level->start + level->length - pos)) {
+ GST_ELEMENT_ERROR (riff, RESOURCE, READ, (NULL), (NULL));
+ return FALSE;
+ }
+ }
+ }
+
/* read */
while (gst_bytestream_peek_bytes (riff->bs, &data, 8) != 8) {
GstEvent *event = NULL;