if (strcmp(track->language, "und"))
strcpy(st->language, track->language);
+ if (track->flags & MATROSKA_TRACK_DEFAULT)
+ st->disposition |= AV_DISPOSITION_DEFAULT;
+
if (track->default_duration)
av_reduce(&st->codec->time_base.num, &st->codec->time_base.den,
track->default_duration, 1000000000, 30000);
MatroskaDemuxIndex *idx = &matroska->index[i];
track = matroska_find_track_by_num(matroska, idx->track);
stream = matroska->tracks[track]->stream_index;
- if (stream >= 0)
+ if (stream >= 0 && stream < matroska->ctx->nb_streams)
av_add_index_entry(matroska->ctx->streams[stream],
idx->pos, idx->time/matroska->time_scale,
0, 0, AVINDEX_KEYFRAME);
uint32_t *lace_size = NULL;
int n, flags, laces = 0;
uint64_t num;
+ int stream_index;
/* first byte(s): tracknum */
if ((n = matroska_ebmlnum_uint(data, size, &num)) < 0) {
av_free(origdata);
return res;
}
- if (matroska->tracks[track]->stream_index < 0) {
+ stream_index = matroska->tracks[track]->stream_index;
+ if (stream_index < 0 || stream_index >= matroska->ctx->nb_streams) {
av_free(origdata);
return res;
}
- st = matroska->ctx->streams[matroska->tracks[track]->stream_index];
+ st = matroska->ctx->streams[stream_index];
if (st->discard >= AVDISCARD_ALL) {
av_free(origdata);
return res;
memcpy(pkt->data, audiotrack->buf
+ a * (h*w / a - audiotrack->pkt_cnt--), a);
pkt->pos = pos;
- pkt->stream_index = matroska->tracks[track]->stream_index;
+ pkt->stream_index = stream_index;
matroska_queue_packet(matroska, pkt);
}
} else {
if (n == 0)
pkt->flags = is_keyframe;
- pkt->stream_index = matroska->tracks[track]->stream_index;
+ pkt->stream_index = stream_index;
pkt->pts = timecode;
pkt->pos = pos;