diff --git a/libavformat/gxfenc.c b/libavformat/gxfenc.c index 9dcbaf2643..142342239f 100644 --- a/libavformat/gxfenc.c +++ b/libavformat/gxfenc.c @@ -416,26 +416,11 @@ static int gxf_write_umf_track_description(AVFormatContext *s) 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 @@ static int gxf_write_header(AVFormatContext *s) { 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 @@ static int gxf_write_header(AVFormatContext *s) 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 @@ static int gxf_write_header(AVFormatContext *s) 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 @@ static int gxf_write_header(AVFormatContext *s) 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)