av_dict_set(&avctx->metadata, tag, value, AV_DICT_DONT_STRDUP_VAL);
}
+static int set_channels(AVFormatContext *avctx, AVStream *st, int channels) {
+ if (channels <= 0) {
+ av_log(avctx, AV_LOG_ERROR, "Channel count %d invalid\n", channels);
+ return AVERROR_INVALIDDATA;
+ }
+ st->codec->channels = channels;
+ st->codec->channel_layout = (st->codec->channels == 1) ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO;
+ return 0;
+}
+
/**
* Parse global variable
* @return < 0 if unknown
} else if (!strcmp(name, "DEFAULT_VOL")) {
var_read_metadata(avctx, name, size);
} else if (!strcmp(name, "NUM_CHANNELS")) {
- st->codec->channels = var_read_int(pb, size);
- st->codec->channel_layout = (st->codec->channels == 1) ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO;
+ return set_channels(avctx, st, var_read_int(pb, size));
} else if (!strcmp(name, "SAMPLE_RATE")) {
st->codec->sample_rate = var_read_int(pb, size);
avpriv_set_pts_info(st, 33, 1, st->codec->sample_rate);
}
av_free(str);
} else if (!strcmp(name, "FPS")) {
- st->time_base = av_inv_q(var_read_float(pb, size));
+ AVRational fps = var_read_float(pb, size);
+ avpriv_set_pts_info(st, 64, fps.den, fps.num);
} else if (!strcmp(name, "HEIGHT")) {
st->codec->height = var_read_int(pb, size);
} else if (!strcmp(name, "PIXEL_ASPECT")) {
if (!vst)
return AVERROR(ENOMEM);
vst->codec->codec_type = AVMEDIA_TYPE_VIDEO;
- vst->time_base = (AVRational){1, 15};
+ avpriv_set_pts_info(vst, 64, 1, 15);
vst->nb_frames = avio_rb32(pb);
v = avio_rb32(pb);
switch (v) {
ast->nb_frames = vst->nb_frames;
ast->codec->sample_rate = avio_rb32(pb);
avpriv_set_pts_info(ast, 33, 1, ast->codec->sample_rate);
- ast->codec->channels = avio_rb32(pb);
- ast->codec->channel_layout = (ast->codec->channels == 1) ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO;
+ if (set_channels(avctx, ast, avio_rb32(pb)) < 0)
+ return AVERROR_INVALIDDATA;
+
v = avio_rb32(pb);
if (v == AUDIO_FORMAT_SIGNED) {
ast->codec->codec_id = AV_CODEC_ID_PCM_S16BE;
ast->codec->codec_id = AV_CODEC_ID_NONE;
}
ast->codec->codec_tag = 0;
+ if (ast->codec->channels <= 0) {
+ av_log(avctx, AV_LOG_ERROR, "No valid channel count found\n");
+ return AVERROR_INVALIDDATA;
+ }
}
if (mv->nb_video_tracks > 1) {