- if (buf_size < 16)
- return buf_size;
-
- if (buf[6] == 1) {
- /* the chunk contains audio */
- *data_size = vmdaudio_loadsound(s, output_samples, p, 0, buf_size - 16);
- } else if (buf[6] == 2) {
- /* initial chunk, may contain audio and silence */
- uint32_t flags = AV_RB32(p);
- int raw_block_size = s->block_align * s->bits / 8;
- int silent_chunks;
- if(flags == 0xFFFFFFFF)
- silent_chunks = 32;
- else
- silent_chunks = av_log2(flags + 1);
- if(*data_size < (s->block_align*silent_chunks + buf_size - 20) * 2)
- return -1;
- *data_size = 0;
- memset(output_samples, 0, raw_block_size * silent_chunks);
- output_samples += raw_block_size * silent_chunks;
- *data_size = raw_block_size * silent_chunks;
- *data_size += vmdaudio_loadsound(s, output_samples, p + 4, 0, buf_size - 20);
- } else if (buf[6] == 3) {
- /* silent chunk */
- *data_size = vmdaudio_loadsound(s, output_samples, p, 1, 0);
- }
-
- return buf_size;