]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/matroskadec.c
fix mpeg2 muxing, replace seq header if contained in extradata and key frame does...
[ffmpeg] / libavformat / matroskadec.c
index d9fdcec283f64ecf8e6828eda0a88f5721364264..a4274f310fbb943bf4371210c2821afb57db8a53 100644 (file)
@@ -2298,6 +2298,9 @@ matroska_read_header (AVFormatContext    *s,
             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);
@@ -2353,7 +2356,7 @@ matroska_read_header (AVFormatContext    *s,
             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);
@@ -2377,6 +2380,7 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
     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) {
@@ -2395,11 +2399,12 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
         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;
@@ -2542,7 +2547,7 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
                     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 {
@@ -2559,7 +2564,7 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
 
                 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;