par->block_align = (av_get_bits_per_sample(par->codec_id) * par->channels) >> 3;
if (aiff->block_duration) {
- par->bit_rate = par->sample_rate * (par->block_align << 3) /
+ par->bit_rate = (int64_t)par->sample_rate * (par->block_align << 3) /
aiff->block_duration;
}
st->codecpar->block_align = 35;
}
aiff->block_duration = 160;
- st->codecpar->bit_rate = st->codecpar->sample_rate * (st->codecpar->block_align << 3) /
+ st->codecpar->bit_rate = (int64_t)st->codecpar->sample_rate * (st->codecpar->block_align << 3) /
aiff->block_duration;
}
break;
}
got_sound:
- if (!st->codecpar->block_align) {
+ if (!st->codecpar->block_align && st->codecpar->codec_id == AV_CODEC_ID_QCELP) {
+ av_log(s, AV_LOG_WARNING, "qcelp without wave chunk, assuming full rate\n");
+ st->codecpar->block_align = 35;
+ } else if (!st->codecpar->block_align) {
av_log(s, AV_LOG_ERROR, "could not find COMM tag or invalid block_align value\n");
return -1;
}
if (max_size <= 0)
return AVERROR_EOF;
+ if (!st->codecpar->block_align) {
+ av_log(s, AV_LOG_ERROR, "block_align not set\n");
+ return AVERROR_INVALIDDATA;
+ }
+
/* Now for that packet */
switch (st->codecpar->codec_id) {
case AV_CODEC_ID_ADPCM_IMA_QT:
size = st->codecpar->block_align;
break;
default:
- size = (MAX_SIZE / st->codecpar->block_align) * st->codecpar->block_align;
+ size = st->codecpar->block_align ? (MAX_SIZE / st->codecpar->block_align) * st->codecpar->block_align : MAX_SIZE;
}
size = FFMIN(max_size, size);
res = av_get_packet(s->pb, pkt, size);