mirror of
https://github.com/nu774/fdkaac.git
synced 2025-03-15 16:30:13 +01:00
wav/caf parser: ensure fmt/desc chunk
fixes https://github.com/nu774/fdkaac/issues/52
This commit is contained in:
parent
53fe239bf6
commit
4ec1422bd9
@ -172,6 +172,7 @@ int caf_parse(caf_reader_t *reader, int64_t *data_length)
|
|||||||
{
|
{
|
||||||
uint32_t fcc;
|
uint32_t fcc;
|
||||||
int64_t chunk_size;
|
int64_t chunk_size;
|
||||||
|
int desc_seen = 0;
|
||||||
|
|
||||||
*data_length = 0;
|
*data_length = 0;
|
||||||
|
|
||||||
@ -181,9 +182,10 @@ int caf_parse(caf_reader_t *reader, int64_t *data_length)
|
|||||||
TRY_IO(pcm_skip(&reader->io, 4)); /* mFileVersion, mFileFlags */
|
TRY_IO(pcm_skip(&reader->io, 4)); /* mFileVersion, mFileFlags */
|
||||||
|
|
||||||
while ((fcc = caf_next_chunk(reader, &chunk_size)) != 0) {
|
while ((fcc = caf_next_chunk(reader, &chunk_size)) != 0) {
|
||||||
if (fcc == M4AF_FOURCC('d','e','s','c'))
|
if (fcc == M4AF_FOURCC('d','e','s','c')) {
|
||||||
|
desc_seen = 1;
|
||||||
TRY_IO(caf_desc(reader, chunk_size));
|
TRY_IO(caf_desc(reader, chunk_size));
|
||||||
else if (fcc == M4AF_FOURCC('i','n','f','o'))
|
} else if (fcc == M4AF_FOURCC('i','n','f','o'))
|
||||||
TRY_IO(caf_info(reader, chunk_size));
|
TRY_IO(caf_info(reader, chunk_size));
|
||||||
else if (fcc == M4AF_FOURCC('c','h','a','n')) {
|
else if (fcc == M4AF_FOURCC('c','h','a','n')) {
|
||||||
ENSURE(reader->sample_format.channels_per_frame);
|
ENSURE(reader->sample_format.channels_per_frame);
|
||||||
@ -199,7 +201,7 @@ int caf_parse(caf_reader_t *reader, int64_t *data_length)
|
|||||||
TRY_IO(pcm_skip(&reader->io, chunk_size));
|
TRY_IO(pcm_skip(&reader->io, chunk_size));
|
||||||
}
|
}
|
||||||
ENSURE(reader->sample_format.channels_per_frame);
|
ENSURE(reader->sample_format.channels_per_frame);
|
||||||
ENSURE(fcc == M4AF_FOURCC('d','a','t','a'));
|
ENSURE(desc_seen && fcc == M4AF_FOURCC('d','a','t','a'));
|
||||||
return 0;
|
return 0;
|
||||||
FAIL:
|
FAIL:
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -155,6 +155,7 @@ static
|
|||||||
int wav_parse(wav_reader_t *reader, int64_t *data_length)
|
int wav_parse(wav_reader_t *reader, int64_t *data_length)
|
||||||
{
|
{
|
||||||
uint32_t container, fcc, chunk_size;
|
uint32_t container, fcc, chunk_size;
|
||||||
|
int fmt_seen = 0;
|
||||||
|
|
||||||
*data_length = 0;
|
*data_length = 0;
|
||||||
container = riff_next_chunk(reader, &chunk_size);
|
container = riff_next_chunk(reader, &chunk_size);
|
||||||
@ -167,6 +168,7 @@ int wav_parse(wav_reader_t *reader, int64_t *data_length)
|
|||||||
riff_ds64(reader, data_length);
|
riff_ds64(reader, data_length);
|
||||||
while ((fcc = riff_next_chunk(reader, &chunk_size)) != 0) {
|
while ((fcc = riff_next_chunk(reader, &chunk_size)) != 0) {
|
||||||
if (fcc == RIFF_FOURCC('f','m','t',' ')) {
|
if (fcc == RIFF_FOURCC('f','m','t',' ')) {
|
||||||
|
fmt_seen = 1;
|
||||||
if (wav_fmt(reader, chunk_size) < 0)
|
if (wav_fmt(reader, chunk_size) < 0)
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
} else if (fcc == RIFF_FOURCC('d','a','t','a')) {
|
} else if (fcc == RIFF_FOURCC('d','a','t','a')) {
|
||||||
@ -178,8 +180,8 @@ int wav_parse(wav_reader_t *reader, int64_t *data_length)
|
|||||||
TRY_IO(pcm_skip(&reader->io, (chunk_size + 1) & ~1));
|
TRY_IO(pcm_skip(&reader->io, (chunk_size + 1) & ~1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fcc == RIFF_FOURCC('d','a','t','a'))
|
ENSURE(fmt_seen && fcc == RIFF_FOURCC('d', 'a', 't', 'a'));
|
||||||
return 0;
|
return 0;
|
||||||
FAIL:
|
FAIL:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user