Add MDEC tags to Electronic Arts demuxer.
authorPeter Ross <pross@xvid.org>
Sun, 10 Aug 2008 01:58:46 +0000 (01:58 +0000)
committerPeter Ross <pross@xvid.org>
Sun, 10 Aug 2008 01:58:46 +0000 (01:58 +0000)
Originally committed as revision 14679 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/electronicarts.c

index f968ee29d153600ea04d48f350199493b123d2da..5aa033a0ca3430cad130403aa6658fcf73f1fd99 100644 (file)
@@ -41,6 +41,7 @@
 #define SCEl_TAG MKTAG('S', 'C', 'E', 'l')
 #define kVGT_TAG MKTAG('k', 'V', 'G', 'T')    /* TGV i-frame */
 #define fVGT_TAG MKTAG('f', 'V', 'G', 'T')    /* TGV p-frame */
+#define mTCD_TAG MKTAG('m', 'T', 'C', 'D')    /* MDEC */
 #define MADk_TAG MKTAG('M', 'A', 'D', 'k')    /* MAD i-frame */
 #define MPCh_TAG MKTAG('M', 'P', 'C', 'h')    /* MPEG2 */
 #define MVhd_TAG MKTAG('M', 'V', 'h', 'd')
@@ -54,6 +55,7 @@ typedef struct EaDemuxContext {
 
     enum CodecID video_codec;
     AVRational time_base;
+    int width, height;
     int video_stream_index;
 
     enum CodecID audio_codec;
@@ -245,6 +247,18 @@ static int process_audio_header_sead(AVFormatContext *s)
     return 1;
 }
 
+static int process_video_header_mdec(AVFormatContext *s)
+{
+    EaDemuxContext *ea = s->priv_data;
+    ByteIOContext *pb = s->pb;
+    url_fskip(pb, 4);
+    ea->width  = get_le16(pb);
+    ea->height = get_le16(pb);
+    ea->time_base = (AVRational){1,15};
+    ea->video_codec = CODEC_ID_MDEC;
+    return 1;
+}
+
 static int process_video_header_vp6(AVFormatContext *s)
 {
     EaDemuxContext *ea = s->priv_data;
@@ -313,6 +327,10 @@ static int process_ea_header(AVFormatContext *s) {
                 ea->time_base = (AVRational){0,0};
                 break;
 
+            case mTCD_TAG :
+                err = process_video_header_mdec(s);
+                break;
+
             case MVhd_TAG :
                 err = process_video_header_vp6(s);
                 break;
@@ -367,6 +385,8 @@ static int ea_read_header(AVFormatContext *s,
         st->codec->codec_id = ea->video_codec;
         st->codec->codec_tag = 0;  /* no fourcc */
         st->codec->time_base = ea->time_base;
+        st->codec->width = ea->width;
+        st->codec->height = ea->height;
     }
 
     if (ea->audio_codec) {
@@ -464,6 +484,11 @@ static int ea_read_packet(AVFormatContext *s,
             chunk_size += 8;
             goto get_video_packet;
 
+        case mTCD_TAG:
+            url_fseek(pb, 8, SEEK_CUR);  // skip ea dct header
+            chunk_size -= 8;
+            goto get_video_packet;
+
         case MV0K_TAG:
             key = PKT_FLAG_KEY;
         case MV0F_TAG: