]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/mxfenc.c
Fix memleak caused by the fact that url_open_buf() allocates a context
[ffmpeg] / libavformat / mxfenc.c
index 5fcffd87a69f63d04b69ef952eb2f1ae0376b388..58cdeefb8925cda2e42de29717227893518db804 100644 (file)
@@ -74,12 +74,11 @@ static const MXFContainerEssenceEntry mxf_essence_container_uls[] = {
 typedef struct MXFContext {
     int64_t footer_partition_offset;
     int essence_container_count;
-    uint8_t essence_containers_indices[sizeof(mxf_essence_container_uls)/
-                                       sizeof(*mxf_essence_container_uls)];
+    uint8_t essence_containers_indices[FF_ARRAY_ELEMS(mxf_essence_container_uls)];
 } MXFContext;
 
 static const uint8_t uuid_base[]            = { 0xAD,0xAB,0x44,0x24,0x2f,0x25,0x4d,0xc7,0x92,0xff,0x29,0xbd };
-static const uint8_t umid_base[]            = { 0x06,0x0A,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x0F,0x00,0x13,0x00,0x00,0x00 };
+static const uint8_t umid_base[]            = { 0x06,0x0A,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x01,0x0D,0x00,0x13,0x00,0x00,0x00 };
 
 /**
  * complete key for operation pattern, partitions, and primer pack
@@ -141,7 +140,7 @@ static const MXFLocalTagPair mxf_local_tag_batch[] = {
     { 0x0202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x02,0x01,0x01,0x03,0x00,0x00}}, /* Duration */
     { 0x1001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x09,0x00,0x00}}, /* Structural Components reference array */
     // Source Clip
-    { 0x1201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x01,0x03,0x01,0x0A,0x00,0x00}}, /* Start position */
+    { 0x1201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x01,0x03,0x01,0x04,0x00,0x00}}, /* Start position */
     { 0x1101, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x01,0x00,0x00,0x00}}, /* SourcePackageID */
     { 0x1102, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x02,0x00,0x00,0x00}}, /* SourceTrackID */
     // File Descriptor
@@ -158,7 +157,7 @@ static const MXFLocalTagPair mxf_local_tag_batch[] = {
     { 0x3D03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x01,0x01,0x01,0x00,0x00}}, /* Audio sampling rate */
     { 0x3D07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x01,0x01,0x04,0x00,0x00,0x00}}, /* ChannelCount */
     { 0x3D01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x03,0x04,0x00,0x00,0x00}}, /* Quantization bits */
-    { 0x3D06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x06,0x01,0x00,0x00,0x00,0x00}}, /* Sound Essence Compression */
+    { 0x3D06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x02,0x04,0x02,0x00,0x00,0x00,0x00}}, /* Sound Essence Compression */
 };
 
 static void mxf_write_uuid(ByteIOContext *pb, enum MXFMetadataSetType type, int value)
@@ -207,8 +206,7 @@ static int klv_encode_ber_length(ByteIOContext *pb, uint64_t len)
 static int mxf_get_essence_container_ul_index(enum CodecID id)
 {
     int i;
-    for (i = 0; i < sizeof(mxf_essence_container_uls)/
-                    sizeof(*mxf_essence_container_uls); i++)
+    for (i = 0; i < FF_ARRAY_ELEMS(mxf_essence_container_uls); i++)
         if (mxf_essence_container_uls[i].id == id)
             return i;
     return -1;
@@ -219,7 +217,7 @@ static void mxf_write_primer_pack(AVFormatContext *s)
     ByteIOContext *pb = s->pb;
     int local_tag_number, i = 0;
 
-    local_tag_number = sizeof(mxf_local_tag_batch)/sizeof(*mxf_local_tag_batch);
+    local_tag_number = FF_ARRAY_ELEMS(mxf_local_tag_batch);
 
     put_buffer(pb, primer_pack_key, 16);
     klv_encode_ber_length(pb, local_tag_number * 18 + 8);
@@ -588,7 +586,7 @@ static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st)
     put_be32(pb, st->codec->channels);
 
     mxf_write_local_tag(pb, 4, 0x3D01);
-    put_be32(pb, st->codec->bits_per_sample);
+    put_be32(pb, st->codec->bits_per_coded_sample);
 }
 
 static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type)
@@ -634,17 +632,12 @@ static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type)
     // write multiple descriptor reference
     if (type == SourcePackage) {
         mxf_write_local_tag(pb, 16, 0x4701);
-        mxf_write_uuid(pb, MultipleDescriptor, 0);
+        if (s->nb_streams > 1) {
+            mxf_write_uuid(pb, MultipleDescriptor, 0);
+            mxf_write_multi_descriptor(s);
+        } else
+            mxf_write_uuid(pb, SubDescriptor, 0);
     }
-}
-
-static void mxf_build_structural_metadata(AVFormatContext *s, enum MXFMetadataSetType type)
-{
-    int i;
-
-    mxf_write_package(s, type);
-    if (type == SourcePackage)
-        mxf_write_multi_descriptor(s);
 
     for (i = 0; i < s->nb_streams; i++) {
         AVStream *st = s->streams[i];
@@ -664,8 +657,8 @@ static int mxf_write_header_metadata_sets(AVFormatContext *s)
     mxf_write_preface(s);
     mxf_write_identification(s);
     mxf_write_content_storage(s);
-    mxf_build_structural_metadata(s, MaterialPackage);
-    mxf_build_structural_metadata(s, SourcePackage);
+    mxf_write_package(s, MaterialPackage);
+    mxf_write_package(s, SourcePackage);
     return 0;
 }
 
@@ -759,8 +752,7 @@ static int mxf_write_header(AVFormatContext *s)
 {
     MXFContext *mxf = s->priv_data;
     int i;
-    uint8_t present[sizeof(mxf_essence_container_uls)/
-                    sizeof(*mxf_essence_container_uls)] = {0};
+    uint8_t present[FF_ARRAY_ELEMS(mxf_essence_container_uls)] = {0};
 
     for (i = 0; i < s->nb_streams; i++) {
         AVStream *st = s->streams[i];