summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduard Sinelnikov <eduard@reporty.com>2017-08-14 03:08:41 -0500
committerSebastian Dröge <sebastian@centricular.com>2017-08-17 13:35:41 +0300
commitee063a57163bc5e4a957af23628804a6ff039a02 (patch)
treebb16cb5e410077d912d3acd77657529b90c4be95
parent4abc746fcdf76a1ade14c30e06be778f3fff29a2 (diff)
downloadgstreamer-plugins-good-ee063a57163bc5e4a957af23628804a6ff039a02.tar.gz
wavparse: Add support for growing WAV files
With some fixes by me.
-rw-r--r--gst/wavparse/gstwavparse.c31
-rw-r--r--gst/wavparse/gstwavparse.h3
2 files changed, 31 insertions, 3 deletions
diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c
index d8fad3917..a81701fca 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 bed478ef2..f449e3093 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 {