|
|
@@ -209,34 +209,36 @@ static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header, |
|
|
|
{ |
|
|
|
int len, bps; |
|
|
|
short wave_format; |
|
|
|
const uint8_t *end= header + header_size; |
|
|
|
GetByteContext gb; |
|
|
|
|
|
|
|
if (bytestream_get_le32(&header) != MKTAG('R', 'I', 'F', 'F')) { |
|
|
|
bytestream2_init(&gb, header, header_size); |
|
|
|
|
|
|
|
if (bytestream2_get_le32(&gb) != MKTAG('R', 'I', 'F', 'F')) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "missing RIFF tag\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
|
|
|
|
header += 4; /* chunk size */ |
|
|
|
bytestream2_skip(&gb, 4); /* chunk size */ |
|
|
|
|
|
|
|
if (bytestream_get_le32(&header) != MKTAG('W', 'A', 'V', 'E')) { |
|
|
|
if (bytestream2_get_le32(&gb) != MKTAG('W', 'A', 'V', 'E')) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "missing WAVE tag\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
|
|
|
|
while (bytestream_get_le32(&header) != MKTAG('f', 'm', 't', ' ')) { |
|
|
|
len = bytestream_get_le32(&header); |
|
|
|
if (len<0 || end - header - 8 < len) |
|
|
|
while (bytestream2_get_le32(&gb) != MKTAG('f', 'm', 't', ' ')) { |
|
|
|
len = bytestream2_get_le32(&gb); |
|
|
|
if (len<0 || bytestream2_get_bytes_left(&gb) - 8 < len) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
header += len; |
|
|
|
bytestream2_skip(&gb, len); |
|
|
|
} |
|
|
|
len = bytestream_get_le32(&header); |
|
|
|
len = bytestream2_get_le32(&gb); |
|
|
|
|
|
|
|
if (len < 16) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "fmt chunk was too short\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
|
|
|
|
wave_format = bytestream_get_le16(&header); |
|
|
|
wave_format = bytestream2_get_le16(&gb); |
|
|
|
|
|
|
|
switch (wave_format) { |
|
|
|
case WAVE_FORMAT_PCM: |
|
|
@@ -246,11 +248,11 @@ static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header, |
|
|
|
return AVERROR(ENOSYS); |
|
|
|
} |
|
|
|
|
|
|
|
header += 2; // skip channels (already got from shorten header) |
|
|
|
avctx->sample_rate = bytestream_get_le32(&header); |
|
|
|
header += 4; // skip bit rate (represents original uncompressed bit rate) |
|
|
|
header += 2; // skip block align (not needed) |
|
|
|
bps = bytestream_get_le16(&header); |
|
|
|
bytestream2_skip(&gb, 2); // skip channels (already got from shorten header) |
|
|
|
avctx->sample_rate = bytestream2_get_le32(&gb); |
|
|
|
bytestream2_skip(&gb, 4); // skip bit rate (represents original uncompressed bit rate) |
|
|
|
bytestream2_skip(&gb, 2); // skip block align (not needed) |
|
|
|
bps = bytestream2_get_le16(&gb); |
|
|
|
avctx->bits_per_coded_sample = bps; |
|
|
|
|
|
|
|
if (bps != 16 && bps != 8) { |
|
|
|