diff options
Diffstat (limited to 'ffmpeg/libavformat/vqf.c')
| -rw-r--r-- | ffmpeg/libavformat/vqf.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/ffmpeg/libavformat/vqf.c b/ffmpeg/libavformat/vqf.c index f1e6aaf..526b596 100644 --- a/ffmpeg/libavformat/vqf.c +++ b/ffmpeg/libavformat/vqf.c @@ -43,7 +43,10 @@ static int vqf_probe(AVProbeData *probe_packet) if (!memcmp(probe_packet->buf + 4, "00052200", 8)) return AVPROBE_SCORE_MAX; - return AVPROBE_SCORE_MAX/2; + if (AV_RL32(probe_packet->buf + 12) > (1<<27)) + return AVPROBE_SCORE_EXTENSION/2; + + return AVPROBE_SCORE_EXTENSION; } static void add_metadata(AVFormatContext *s, uint32_t tag, @@ -132,6 +135,11 @@ static int vqf_read_header(AVFormatContext *s) rate_flag = AV_RB32(comm_chunk + 8); avio_skip(s->pb, len-12); + if (st->codec->channels <= 0) { + av_log(s, AV_LOG_ERROR, "Invalid number of channels\n"); + return AVERROR_INVALIDDATA; + } + st->codec->bit_rate = read_bitrate*1000; break; case MKTAG('D','S','I','Z'): // size of compressed data @@ -158,7 +166,7 @@ static int vqf_read_header(AVFormatContext *s) header_size -= len; - } while (header_size >= 0); + } while (header_size >= 0 && !url_feof(s->pb)); switch (rate_flag) { case -1: @@ -174,14 +182,21 @@ static int vqf_read_header(AVFormatContext *s) st->codec->sample_rate = 11025; break; default: - st->codec->sample_rate = rate_flag*1000; - if (st->codec->sample_rate <= 0) { - av_log(s, AV_LOG_ERROR, "sample rate %d is invalid\n", st->codec->sample_rate); - return -1; + if (rate_flag < 8 || rate_flag > 44) { + av_log(s, AV_LOG_ERROR, "Invalid rate flag %d\n", rate_flag); + return AVERROR_INVALIDDATA; } + st->codec->sample_rate = rate_flag*1000; break; } + if (read_bitrate / st->codec->channels < 8 || + read_bitrate / st->codec->channels > 48) { + av_log(s, AV_LOG_ERROR, "Invalid bitrate per channel %d\n", + read_bitrate / st->codec->channels); + return AVERROR_INVALIDDATA; + } + switch (((st->codec->sample_rate/1000) << 8) + read_bitrate/st->codec->channels) { case (11<<8) + 8 : @@ -208,9 +223,8 @@ static int vqf_read_header(AVFormatContext *s) avpriv_set_pts_info(st, 64, size, st->codec->sample_rate); /* put first 12 bytes of COMM chunk in extradata */ - if (!(st->codec->extradata = av_malloc(12 + FF_INPUT_BUFFER_PADDING_SIZE))) + if (ff_alloc_extradata(st->codec, 12)) return AVERROR(ENOMEM); - st->codec->extradata_size = 12; memcpy(st->codec->extradata, comm_chunk, 12); ff_metadata_conv_ctx(s, NULL, vqf_metadata_conv); |
