]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/matroska.c
Interplay C93 demuxer and video decoder
[ffmpeg] / libavformat / matroska.c
index 85232278ccba367ddd5114632141ad0766d639c1..591530490c1496d5b7bb65fa4990b781770ea231 100644 (file)
@@ -213,6 +213,7 @@ static CodecTags codec_tags[]={
     {"V_REAL/RV20"      , CODEC_ID_RV20},
     {"V_REAL/RV30"      , CODEC_ID_RV30},
     {"V_REAL/RV40"      , CODEC_ID_RV40},
+    {"V_THEORA"         , CODEC_ID_THEORA},
 /* TODO: Real/Quicktime */
 
 //    {"A_MS/ACM"         , CODEC_ID_NONE},
@@ -2287,14 +2288,6 @@ matroska_read_header (AVFormatContext    *s,
 
             }
 
-            else if (codec_id == CODEC_ID_MPEG1VIDEO ||
-                     codec_id == CODEC_ID_MPEG2VIDEO ||
-                     codec_id == CODEC_ID_MPEG4      ||
-                     codec_id == CODEC_ID_MSMPEG4V3  ||
-                     codec_id == CODEC_ID_H264) {
-                track->flags |= MATROSKA_TRACK_REORDER;
-            }
-
             else if (codec_id == CODEC_ID_AAC && !track->codec_priv_size) {
                 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *) track;
                 int profile = matroska_aac_profile(track->codec_id);
@@ -2388,6 +2381,7 @@ matroska_read_header (AVFormatContext    *s,
                           st->codec->height * videotrack->display_width,
                           st->codec-> width * videotrack->display_height,
                           255);
+                st->need_parsing = 2;
             } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
                 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track;
 
@@ -2428,8 +2422,7 @@ rv_offset(uint8_t *data, int slice, int slices)
 static int
 matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
                      int64_t pos, uint64_t cluster_time, uint64_t duration,
-                     int is_keyframe, int is_bframe,
-                     int *ptrack, AVPacket **ppkt)
+                     int is_keyframe, int is_bframe)
 {
     int res = 0;
     int track;
@@ -2451,7 +2444,6 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
 
     /* fetch track from num */
     track = matroska_find_track_by_num(matroska, num);
-    if (ptrack)  *ptrack = track;
     if (size <= 3 || track < 0 || track >= matroska->num_tracks) {
         av_log(matroska->ctx, AV_LOG_INFO,
                "Invalid stream %d or size %u\n", track, size);
@@ -2567,7 +2559,6 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
                 slices = *data++ + 1;
                 lace_size[n]--;
             }
-            /* FIXME: duration */
 
             for (slice=0; slice<slices; slice++) {
                 int slice_size, slice_offset = 0;
@@ -2578,7 +2569,6 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
                 else
                     slice_size = rv_offset(data, slice+1, slices) - slice_offset;
                 pkt = av_mallocz(sizeof(AVPacket));
-                if (ppkt)  *ppkt = pkt;
                 /* XXX: prevent data copy... */
                 if (av_new_packet(pkt, slice_size) < 0) {
                     res = AVERROR_NOMEM;
@@ -2618,11 +2608,9 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska,
 {
     int res = 0;
     uint32_t id;
-    AVPacket *pkt = NULL;
     int is_bframe = 0;
     int is_keyframe = PKT_FLAG_KEY, last_num_packets = matroska->num_packets;
     uint64_t duration = AV_NOPTS_VALUE;
-    int track = -1;
     uint8_t *data;
     int size = 0;
     int64_t pos = 0;
@@ -2690,8 +2678,7 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska,
 
     if (size > 0)
         res = matroska_parse_block(matroska, data, size, pos, cluster_time,
-                                   duration, is_keyframe, is_bframe,
-                                   &track, &pkt);
+                                   duration, is_keyframe, is_bframe);
 
     return res;
 }
@@ -2741,7 +2728,7 @@ matroska_parse_cluster (MatroskaDemuxContext *matroska)
                 if (res == 0)
                     res = matroska_parse_block(matroska, data, size, pos,
                                                cluster_time, AV_NOPTS_VALUE,
-                                               -1, 0, NULL, NULL);
+                                               -1, 0);
                 break;
 
             default: