mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-04 22:48:54 +00:00
wavparse: Add support for growing WAV files
With some fixes by me.
This commit is contained in:
parent
e6b6583a5e
commit
6d61471da6
2 changed files with 31 additions and 3 deletions
|
@ -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 */
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue