]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/mxfenc.c
pvez avi fourcc is truemotion1
[ffmpeg] / libavformat / mxfenc.c
index 58cdeefb8925cda2e42de29717227893518db804..4f221c0cf74b79c42ed12f58b064dae3209cd88f 100644 (file)
@@ -120,6 +120,7 @@ static const MXFLocalTagPair mxf_local_tag_batch[] = {
     { 0x3C06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x03,0x00,0x00}}, /* Modification Date */
     // Content Storage
     { 0x1901, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x01,0x00,0x00}}, /* Package strong reference batch */
+    { 0x1902, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x02,0x00,0x00}}, /* Package strong reference batch */
     // Essence Container Data
     { 0x2701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x06,0x01,0x00,0x00,0x00}}, /* Linked Package UID */
     { 0x3F07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x04,0x00,0x00,0x00,0x00}}, /* BodySID */
@@ -376,7 +377,7 @@ static void mxf_write_content_storage(AVFormatContext *s)
 
     mxf_write_metadata_key(pb, 0x011800);
     PRINT_KEY(s, "content storage key", pb->buf_ptr - 16);
-    klv_encode_ber_length(pb, 64);
+    klv_encode_ber_length(pb, 92);
 
     // write uid
     mxf_write_local_tag(pb, 16, 0x3C0A);
@@ -388,6 +389,11 @@ static void mxf_write_content_storage(AVFormatContext *s)
     mxf_write_refs_count(pb, 2);
     mxf_write_uuid(pb, MaterialPackage, 0);
     mxf_write_uuid(pb, SourcePackage, 0);
+
+    // write essence container data
+    mxf_write_local_tag(pb, 8 + 16, 0x1902);
+    mxf_write_refs_count(pb, 1);
+    mxf_write_uuid(pb, EssenceContainerData, 0);
 }
 
 static void mxf_write_track(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
@@ -557,6 +563,8 @@ static const UID mxf_wav_descriptor_key       = { 0x06,0x0E,0x2B,0x34,0x02,0x53,
 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
 {
     ByteIOContext *pb = s->pb;
+    int stored_height = (st->codec->height+15)/16*16;
+    AVRational dar;
 
     mxf_write_generic_desc(pb, st, mxf_mpegvideo_descriptor_key);
 
@@ -564,11 +572,16 @@ static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
     put_be32(pb, st->codec->width);
 
     mxf_write_local_tag(pb, 4, 0x3202);
-    put_be32(pb, st->codec->height);
+    put_be32(pb, stored_height);
+
+    av_reduce(&dar.num, &dar.den,
+              st->codec->width*st->codec->sample_aspect_ratio.num,
+              st->codec->height*st->codec->sample_aspect_ratio.den,
+              1024*1024);
 
     mxf_write_local_tag(pb, 8, 0x320E);
-    put_be32(pb, st->codec->height * st->sample_aspect_ratio.den);
-    put_be32(pb, st->codec->width  * st->sample_aspect_ratio.num);
+    put_be32(pb, dar.num);
+    put_be32(pb, dar.den);
 }
 
 static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st)
@@ -652,6 +665,25 @@ static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type)
     }
 }
 
+static int mxf_write_essence_container_data(AVFormatContext *s)
+{
+    ByteIOContext *pb = s->pb;
+
+    mxf_write_metadata_key(pb, 0x012300);
+    klv_encode_ber_length(pb, 64);
+
+    mxf_write_local_tag(pb, 16, 0x3C0A); // Instance UID
+    mxf_write_uuid(pb, EssenceContainerData, 0);
+
+    mxf_write_local_tag(pb, 32, 0x2701); // Linked Package UID
+    mxf_write_umid(pb, SourcePackage, 0);
+
+    mxf_write_local_tag(pb, 4, 0x3F07); // BodySID
+    put_be32(pb, 1);
+
+    return 0;
+}
+
 static int mxf_write_header_metadata_sets(AVFormatContext *s)
 {
     mxf_write_preface(s);
@@ -659,6 +691,7 @@ static int mxf_write_header_metadata_sets(AVFormatContext *s)
     mxf_write_content_storage(s);
     mxf_write_package(s, MaterialPackage);
     mxf_write_package(s, SourcePackage);
+    mxf_write_essence_container_data(s);
     return 0;
 }