From 6d61471da6043353ec4f45b6d1ead8c74d2e6af4 Mon Sep 17 00:00:00 2001 From: Eduard Sinelnikov Date: Mon, 14 Aug 2017 03:08:41 -0500 Subject: [PATCH] wavparse: Add support for growing WAV files With some fixes by me. --- gst/wavparse/gstwavparse.c | 31 ++++++++++++++++++++++++++++--- gst/wavparse/gstwavparse.h | 3 +++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c index d8fad3917f..a81701fca6 100644 --- a/gst/wavparse/gstwavparse.c +++ b/gst/wavparse/gstwavparse.c @@ -227,6 +227,7 @@ gst_wavparse_reset (GstWavParse * wav) wav->dataleft = 0; wav->datasize = 0; wav->datastart = 0; + wav->chunk_size = 0; wav->duration = 0; wav->got_fmt = FALSE; wav->first = TRUE; @@ -1336,6 +1337,8 @@ gst_wavparse_stream_headers (GstWavParse * wav) GST_DEBUG_OBJECT (wav, "Using ds64 datasize"); size64 = wav->datasize; } + wav->chunk_size = size64; + /* If size is zero, then the data chunk probably actually extends to the end of the file */ if (size64 == 0 && upstream_size) { @@ -1978,9 +1981,31 @@ iterate_adapter: "offset: %" G_GINT64_FORMAT " , end: %" G_GINT64_FORMAT " , dataleft: %" G_GINT64_FORMAT, wav->offset, wav->end_offset, wav->dataleft); - /* Get the next n bytes and output them */ - if (wav->dataleft == 0 || wav->dataleft < wav->blockalign) - goto found_eos; + if ((wav->dataleft == 0 || wav->dataleft < wav->blockalign)) { + /* In case chunk size is not declared in the begining get size from the + * file size directly */ + if (wav->chunk_size == 0) { + gint64 upstream_size = 0; + + /* Get the size of the file */ + if (!gst_pad_peer_query_duration (wav->sinkpad, GST_FORMAT_BYTES, + &upstream_size)) + goto found_eos; + + if (upstream_size < wav->offset + wav->datastart) + goto found_eos; + + /* If file has updated since the beggining continue reading the file */ + wav->dataleft = upstream_size - wav->offset - wav->datastart; + wav->end_offset = upstream_size; + + /* Get the next n bytes and output them, if we can */ + if (wav->dataleft == 0 || wav->dataleft < wav->blockalign) + goto found_eos; + } else { + goto found_eos; + } + } /* scale the amount of data by the segment rate so we get equal * amounts of data regardless of the playback rate */ diff --git a/gst/wavparse/gstwavparse.h b/gst/wavparse/gstwavparse.h index bed478ef2f..f449e30939 100644 --- a/gst/wavparse/gstwavparse.h +++ b/gst/wavparse/gstwavparse.h @@ -122,6 +122,9 @@ struct _GstWavParse { gboolean discont; gboolean ignore_length; + + /* Size of the data as written in the chunk size */ + guint32 chunk_size; }; struct _GstWavParseClass {