diff options
author | Eduard Sinelnikov <eduard@reporty.com> | 2017-08-14 03:08:41 -0500 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2017-08-17 13:35:41 +0300 |
commit | ee063a57163bc5e4a957af23628804a6ff039a02 (patch) | |
tree | bb16cb5e410077d912d3acd77657529b90c4be95 | |
parent | 4abc746fcdf76a1ade14c30e06be778f3fff29a2 (diff) | |
download | gstreamer-plugins-good-ee063a57163bc5e4a957af23628804a6ff039a02.tar.gz |
wavparse: Add support for growing WAV files
With some fixes by me.
-rw-r--r-- | gst/wavparse/gstwavparse.c | 31 | ||||
-rw-r--r-- | 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 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 { |