changeset 4675:f036a151abf8 libavformat

compute media info in write_header
author bcoudurier
date Sun, 08 Mar 2009 22:23:44 +0000
parents c727d4a90177
children 0e45c20bbb9e
files gxfenc.c
diffstat 1 files changed, 19 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/gxfenc.c	Sun Mar 08 22:14:26 2009 +0000
+++ b/gxfenc.c	Sun Mar 08 22:23:44 2009 +0000
@@ -416,26 +416,11 @@
     ByteIOContext *pb = s->pb;
     GXFContext *gxf = s->priv_data;
     int64_t pos = url_ftell(pb);
-    int tracks[255]={0};
     int i;
 
     gxf->umf_track_offset = pos - gxf->umf_start_offset;
     for (i = 0; i < s->nb_streams; ++i) {
-        AVStream *st = s->streams[i];
-        GXFStreamContext *sc = st->priv_data;
-        int id = 0;
-
-        switch (st->codec->codec_id) {
-        case CODEC_ID_MPEG1VIDEO: id= 'L'; break;
-        case CODEC_ID_MPEG2VIDEO: id= 'M'; break;
-        case CODEC_ID_PCM_S16LE:  id= 'A'; break;
-        case CODEC_ID_DVVIDEO:    id= sc->track_type == 6 ? 'E' : 'D'; break;
-        case CODEC_ID_MJPEG:      id= 'V'; break;
-        default:                  break;
-        }
-        sc->media_info= id << 8;
-        /* FIXME first 10 audio tracks are 0 to 9 next 22 are A to V */
-        sc->media_info |= '0' + (tracks[id]++);
+        GXFStreamContext *sc = s->streams[i]->priv_data;
         put_le16(pb, sc->media_info);
         put_le16(pb, 1);
     }
@@ -593,7 +578,8 @@
 {
     ByteIOContext *pb = s->pb;
     GXFContext *gxf = s->priv_data;
-    int i;
+    uint8_t tracks[255] = {0};
+    int i, media_info = 0;
 
     gxf->flags |= 0x00080000; /* material is simple clip */
     for (i = 0; i < s->nb_streams; ++i) {
@@ -626,6 +612,7 @@
             sc->fields = -2;
             gxf->audio_tracks++;
             gxf->flags |= 0x04000000; /* audio is 16 bit pcm */
+            media_info = 'A';
         } else if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
             /* FIXME check from time_base ? */
             if (st->codec->height == 480 || st->codec->height == 512) { /* NTSC or NTSC+VBI */
@@ -645,20 +632,33 @@
             sc->sample_size = st->codec->bit_rate;
             sc->fields = 2; /* interlaced */
             switch (st->codec->codec_id) {
+            case CODEC_ID_MJPEG:
+                sc->track_type = 1;
+                gxf->flags |= 0x00004000;
+                media_info = 'J';
+                break;
+            case CODEC_ID_MPEG1VIDEO:
+                sc->track_type = 9;
+                gxf->mpeg_tracks++;
+                media_info = 'L';
+                break;
             case CODEC_ID_MPEG2VIDEO:
                 sc->first_gop_closed = -1;
                 sc->track_type = 4;
                 gxf->mpeg_tracks++;
                 gxf->flags |= 0x00008000;
+                media_info = 'M';
                 break;
             case CODEC_ID_DVVIDEO:
                 if (st->codec->pix_fmt == PIX_FMT_YUV422P) {
                     sc->media_type += 2;
                     sc->track_type = 6;
                     gxf->flags |= 0x00002000;
+                    media_info = 'E';
                 } else {
                     sc->track_type = 5;
                     gxf->flags |= 0x00001000;
+                    media_info = 'D';
                 }
                 break;
             default:
@@ -666,6 +666,8 @@
                 return -1;
             }
         }
+        /* FIXME first 10 audio tracks are 0 to 9 next 22 are A to V */
+        sc->media_info = media_info<<8 | ('0'+tracks[media_info]++);
     }
 
     if (ff_audio_interleave_init(s, GXF_samples_per_frame, (AVRational){ 1, 48000 }) < 0)