Commit b582d7ba authored by Michael Niedermayer's avatar Michael Niedermayer

dont read over the end of a data chunk and at the end search for the next

Originally committed as revision 5537 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent e71bcc37
...@@ -203,6 +203,7 @@ int wav_codec_get_id(unsigned int tag, int bps) ...@@ -203,6 +203,7 @@ int wav_codec_get_id(unsigned int tag, int bps)
#ifdef CONFIG_MUXERS #ifdef CONFIG_MUXERS
typedef struct { typedef struct {
offset_t data; offset_t data;
offset_t data_end;
} WAVContext; } WAVContext;
static int wav_write_header(AVFormatContext *s) static int wav_write_header(AVFormatContext *s)
...@@ -304,6 +305,7 @@ static int wav_read_header(AVFormatContext *s, ...@@ -304,6 +305,7 @@ static int wav_read_header(AVFormatContext *s,
unsigned int tag; unsigned int tag;
ByteIOContext *pb = &s->pb; ByteIOContext *pb = &s->pb;
AVStream *st; AVStream *st;
WAVContext *wav = s->priv_data;
/* check RIFF header */ /* check RIFF header */
tag = get_le32(pb); tag = get_le32(pb);
...@@ -331,6 +333,7 @@ static int wav_read_header(AVFormatContext *s, ...@@ -331,6 +333,7 @@ static int wav_read_header(AVFormatContext *s,
size = find_tag(pb, MKTAG('d', 'a', 't', 'a')); size = find_tag(pb, MKTAG('d', 'a', 't', 'a'));
if (size < 0) if (size < 0)
return -1; return -1;
wav->data_end= url_ftell(pb) + size;
return 0; return 0;
} }
...@@ -339,19 +342,30 @@ static int wav_read_header(AVFormatContext *s, ...@@ -339,19 +342,30 @@ static int wav_read_header(AVFormatContext *s,
static int wav_read_packet(AVFormatContext *s, static int wav_read_packet(AVFormatContext *s,
AVPacket *pkt) AVPacket *pkt)
{ {
int ret, size; int ret, size, left;
AVStream *st; AVStream *st;
WAVContext *wav = s->priv_data;
if (url_feof(&s->pb)) if (url_feof(&s->pb))
return AVERROR_IO; return AVERROR_IO;
st = s->streams[0]; st = s->streams[0];
left= wav->data_end - url_ftell(&s->pb);
if(left <= 0){
left = find_tag(&(s->pb), MKTAG('d', 'a', 't', 'a'));
if (left < 0) {
return AVERROR_IO;
}
wav->data_end= url_ftell(&s->pb) + left;
}
size = MAX_SIZE; size = MAX_SIZE;
if (st->codec->block_align > 1) { if (st->codec->block_align > 1) {
if (size < st->codec->block_align) if (size < st->codec->block_align)
size = st->codec->block_align; size = st->codec->block_align;
size = (size / st->codec->block_align) * st->codec->block_align; size = (size / st->codec->block_align) * st->codec->block_align;
} }
size= FFMIN(size, left);
if (av_new_packet(pkt, size)) if (av_new_packet(pkt, size))
return AVERROR_IO; return AVERROR_IO;
pkt->stream_index = 0; pkt->stream_index = 0;
...@@ -393,7 +407,7 @@ static int wav_read_seek(AVFormatContext *s, ...@@ -393,7 +407,7 @@ static int wav_read_seek(AVFormatContext *s,
static AVInputFormat wav_iformat = { static AVInputFormat wav_iformat = {
"wav", "wav",
"wav format", "wav format",
0, sizeof(WAVContext),
wav_probe, wav_probe,
wav_read_header, wav_read_header,
wav_read_packet, wav_read_packet,
......
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