wavdec: refactor wav_read_header()

Make it more readable and display an error message in case an invalid
header is detected (the current version just returns
AVERROR_INVALIDDATA)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Thomas Volkert 2014-12-19 21:57:05 +01:00 committed by Michael Niedermayer
parent c3e6a55956
commit 1a971d33eb

View File

@ -248,7 +248,7 @@ static int wav_read_header(AVFormatContext *s)
{ {
int64_t size, av_uninit(data_size); int64_t size, av_uninit(data_size);
int64_t sample_count = 0; int64_t sample_count = 0;
int rf64; int rf64 = 0;
uint32_t tag; uint32_t tag;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
AVStream *st = NULL; AVStream *st = NULL;
@ -260,17 +260,30 @@ static int wav_read_header(AVFormatContext *s)
wav->smv_data_ofs = -1; wav->smv_data_ofs = -1;
/* check RIFF header */ /* read chunk ID */
tag = avio_rl32(pb); tag = avio_rl32(pb);
switch (tag) {
case MKTAG('R', 'I', 'F', 'F'):
break;
case MKTAG('R', 'I', 'F', 'X'):
wav->rifx = 1;
break;
case MKTAG('R', 'F', '6', '4'):
rf64 = 1;
break;
default:
av_log(s, AV_LOG_ERROR, "invalid start code %c%c%c%c in RIFF header\n", tag & 0xFF, (tag >> 8) & 0xFF, (tag >> 16) & 0xFF, (tag >> 24) & 0xFF);
return AVERROR_INVALIDDATA;
}
rf64 = tag == MKTAG('R', 'F', '6', '4'); /* read chunk size */
wav->rifx = tag == MKTAG('R', 'I', 'F', 'X'); avio_rl32(pb);
if (!rf64 && !wav->rifx && tag != MKTAG('R', 'I', 'F', 'F'))
return AVERROR_INVALIDDATA; /* read format */
avio_rl32(pb); /* file size */ if (avio_rl32(pb) != MKTAG('W', 'A', 'V', 'E')) {
tag = avio_rl32(pb); av_log(s, AV_LOG_ERROR, "invalid format in RIFF header\n");
if (tag != MKTAG('W', 'A', 'V', 'E'))
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
}
if (rf64) { if (rf64) {
if (avio_rl32(pb) != MKTAG('d', 's', '6', '4')) if (avio_rl32(pb) != MKTAG('d', 's', '6', '4'))