wavparse: Add support for growing WAV files

With some fixes by me.
This commit is contained in:
Eduard Sinelnikov 2017-08-14 03:08:41 -05:00 committed by Sebastian Dröge
parent e6b6583a5e
commit 6d61471da6
2 changed files with 31 additions and 3 deletions

View file

@ -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 */

View file

@ -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 {