#define AUDIO_FORMAT_SIGNED 401
-static int mv_probe(AVProbeData *p)
+static int mv_probe(const AVProbeData *p)
{
if (AV_RB32(p->buf) == MKBETAG('M', 'O', 'V', 'I') &&
AV_RB16(p->buf + 4) < 3)
st->codecpar->sample_rate = var_read_int(pb, size);
avpriv_set_pts_info(st, 33, 1, st->codecpar->sample_rate);
} else if (!strcmp(name, "SAMPLE_WIDTH")) {
- st->codecpar->bits_per_coded_sample = var_read_int(pb, size) * 8;
+ uint64_t bpc = var_read_int(pb, size) * (uint64_t)8;
+ if (bpc > 16)
+ return AVERROR_INVALIDDATA;
+ st->codecpar->bits_per_coded_sample = bpc;
} else
return AVERROR_INVALIDDATA;
st->codecpar->width = var_read_int(pb, size);
} else if (!strcmp(name, "ORIENTATION")) {
if (var_read_int(pb, size) == 1101) {
- st->codecpar->extradata = av_strdup("BottomUp");
- st->codecpar->extradata_size = 9;
+ if (!st->codecpar->extradata) {
+ st->codecpar->extradata = av_strdup("BottomUp");
+ if (!st->codecpar->extradata)
+ return AVERROR(ENOMEM);
+ st->codecpar->extradata_size = 9;
+ }
}
} else if (!strcmp(name, "Q_SPATIAL") || !strcmp(name, "Q_TEMPORAL")) {
var_read_metadata(avctx, name, size);
uint32_t pos = avio_rb32(pb);
uint32_t size = avio_rb32(pb);
avio_skip(pb, 8);
+ if (avio_feof(pb))
+ return ;
av_add_index_entry(st, pos, timestamp, size, 0, AVINDEX_KEYFRAME);
if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
- timestamp += size / (st->codecpar->channels * 2);
+ timestamp += size / (st->codecpar->channels * 2LL);
} else {
timestamp++;
}
avio_skip(pb, 8);
av_add_index_entry(ast, pos, timestamp, asize, 0, AVINDEX_KEYFRAME);
av_add_index_entry(vst, pos + asize, i, vsize, 0, AVINDEX_KEYFRAME);
- timestamp += asize / (ast->codecpar->channels * 2);
+ timestamp += asize / (ast->codecpar->channels * 2LL);
}
} else if (!version && avio_rb16(pb) == 3) {
avio_skip(pb, 4);
if ((ret = read_table(avctx, NULL, parse_global_var)) < 0)
return ret;
+ if (mv->nb_audio_tracks < 0 || mv->nb_video_tracks < 0 ||
+ (mv->nb_audio_tracks == 0 && mv->nb_video_tracks == 0)) {
+ av_log(avctx, AV_LOG_ERROR, "Stream count is invalid.\n");
+ return AVERROR_INVALIDDATA;
+ }
+
if (mv->nb_audio_tracks > 1) {
avpriv_request_sample(avctx, "Multiple audio streams support");
return AVERROR_PATCHWELCOME;
int64_t ret;
uint64_t pos;
- if (frame < st->nb_index_entries) {
- index = &st->index_entries[frame];
+ if (frame < st->internal->nb_index_entries) {
+ index = &st->internal->index_entries[frame];
pos = avio_tell(pb);
if (index->pos > pos)
avio_skip(pb, index->pos - pos);