Commit 6d61471d authored by Eduard Sinelnikov's avatar Eduard Sinelnikov Committed by Sebastian Dröge

wavparse: Add support for growing WAV files

With some fixes by me.
parent e6b6583a
...@@ -227,6 +227,7 @@ gst_wavparse_reset (GstWavParse * wav) ...@@ -227,6 +227,7 @@ gst_wavparse_reset (GstWavParse * wav)
wav->dataleft = 0; wav->dataleft = 0;
wav->datasize = 0; wav->datasize = 0;
wav->datastart = 0; wav->datastart = 0;
wav->chunk_size = 0;
wav->duration = 0; wav->duration = 0;
wav->got_fmt = FALSE; wav->got_fmt = FALSE;
wav->first = TRUE; wav->first = TRUE;
...@@ -1336,6 +1337,8 @@ gst_wavparse_stream_headers (GstWavParse * wav) ...@@ -1336,6 +1337,8 @@ gst_wavparse_stream_headers (GstWavParse * wav)
GST_DEBUG_OBJECT (wav, "Using ds64 datasize"); GST_DEBUG_OBJECT (wav, "Using ds64 datasize");
size64 = wav->datasize; size64 = wav->datasize;
} }
wav->chunk_size = size64;
/* If size is zero, then the data chunk probably actually extends to /* If size is zero, then the data chunk probably actually extends to
the end of the file */ the end of the file */
if (size64 == 0 && upstream_size) { if (size64 == 0 && upstream_size) {
...@@ -1978,9 +1981,31 @@ iterate_adapter: ...@@ -1978,9 +1981,31 @@ iterate_adapter:
"offset: %" G_GINT64_FORMAT " , end: %" G_GINT64_FORMAT " , dataleft: %" "offset: %" G_GINT64_FORMAT " , end: %" G_GINT64_FORMAT " , dataleft: %"
G_GINT64_FORMAT, wav->offset, wav->end_offset, wav->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)) {
if (wav->dataleft == 0 || wav->dataleft < wav->blockalign) /* In case chunk size is not declared in the begining get size from the
goto found_eos; * 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 /* scale the amount of data by the segment rate so we get equal
* amounts of data regardless of the playback rate */ * amounts of data regardless of the playback rate */
......
...@@ -122,6 +122,9 @@ struct _GstWavParse { ...@@ -122,6 +122,9 @@ struct _GstWavParse {
gboolean discont; gboolean discont;
gboolean ignore_length; gboolean ignore_length;
/* Size of the data as written in the chunk size */
guint32 chunk_size;
}; };
struct _GstWavParseClass { struct _GstWavParseClass {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment