Commit 6629dbd2 authored by Tomas Härdin's avatar Tomas Härdin Committed by Michael Niedermayer

Keep parsing wav until EOF if the input is seekable and we know the size of the data tag

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent a06d238e
...@@ -216,7 +216,7 @@ static int wav_read_header(AVFormatContext *s, ...@@ -216,7 +216,7 @@ static int wav_read_header(AVFormatContext *s,
AVStream *st; AVStream *st;
WAVContext *wav = s->priv_data; WAVContext *wav = s->priv_data;
int ret, got_fmt = 0; int ret, got_fmt = 0;
int64_t next_tag_ofs; int64_t next_tag_ofs, data_ofs = -1;
/* check RIFF header */ /* check RIFF header */
tag = avio_rl32(pb); tag = avio_rl32(pb);
...@@ -247,13 +247,19 @@ static int wav_read_header(AVFormatContext *s, ...@@ -247,13 +247,19 @@ static int wav_read_header(AVFormatContext *s,
avio_skip(pb, size - 16); /* skip rest of ds64 chunk */ avio_skip(pb, size - 16); /* skip rest of ds64 chunk */
} }
for (;;) { for (;;) {
if (url_feof(pb))
return -1;
size = next_tag(pb, &tag); size = next_tag(pb, &tag);
next_tag_ofs = avio_tell(pb) + size; next_tag_ofs = avio_tell(pb) + size;
if (url_feof(pb)) {
if (data_ofs < 0) {
av_log(s, AV_LOG_ERROR, "no 'data' tag found\n");
return AVERROR_INVALIDDATA;
}
break;
}
switch (tag) { switch (tag) {
case MKTAG('f', 'm', 't', ' '): case MKTAG('f', 'm', 't', ' '):
/* only parse the first 'fmt ' tag found */ /* only parse the first 'fmt ' tag found */
...@@ -270,7 +276,21 @@ static int wav_read_header(AVFormatContext *s, ...@@ -270,7 +276,21 @@ static int wav_read_header(AVFormatContext *s,
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (rf64) {
next_tag_ofs = wav->data_end = avio_tell(pb) + data_size;
} else {
data_size = size;
wav->data_end = size ? next_tag_ofs : INT64_MAX;
}
/* don't look for footer metadata if we can't seek or if we don't
* know where the data tag ends
*/
if (!pb->seekable || (!rf64 && !size))
goto break_loop; goto break_loop;
data_ofs = avio_tell(pb);
break;
case MKTAG('f','a','c','t'): case MKTAG('f','a','c','t'):
if(!sample_count) if(!sample_count)
sample_count = avio_rl32(pb); sample_count = avio_rl32(pb);
...@@ -279,17 +299,11 @@ static int wav_read_header(AVFormatContext *s, ...@@ -279,17 +299,11 @@ static int wav_read_header(AVFormatContext *s,
avio_seek(pb, next_tag_ofs, SEEK_SET); avio_seek(pb, next_tag_ofs, SEEK_SET);
} }
break_loop: break_loop:
if (rf64) if (data_ofs >= 0)
size = data_size; avio_seek(pb, data_ofs, SEEK_SET);
if (size < 0)
return -1;
if (!size) {
wav->data_end = INT64_MAX;
} else
wav->data_end= avio_tell(pb) + size;
if (!sample_count && st->codec->channels && av_get_bits_per_sample(st->codec->codec_id)) if (!sample_count && st->codec->channels && av_get_bits_per_sample(st->codec->codec_id))
sample_count = (size<<3) / (st->codec->channels * (uint64_t)av_get_bits_per_sample(st->codec->codec_id)); sample_count = (data_size<<3) / (st->codec->channels * (uint64_t)av_get_bits_per_sample(st->codec->codec_id));
if (sample_count) if (sample_count)
st->duration = sample_count; st->duration = sample_count;
return 0; return 0;
......
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