retab
[fdkaac.git] / src / m4af.c
index 0c62727648fef13cbb1bd2fe6f96199bdd54b531..fb4f8d63a30f1be422927a102686b2324dd1c73b 100644 (file)
@@ -456,12 +456,18 @@ int m4af_add_itmf_int16_tag(m4af_writer_t *ctx, uint32_t type, int value)
     return m4af_add_itmf_short_tag(ctx, type, M4AF_INTEGER, &data, 2);
 }
 
-int m4af_add_itmf_int32_tag(m4af_writer_t *ctx, uint32_t type, int value)
+int m4af_add_itmf_int32_tag(m4af_writer_t *ctx, uint32_t type, uint32_t value)
 {
     uint32_t data = m4af_htob32(value);
     return m4af_add_itmf_short_tag(ctx, type, M4AF_INTEGER, &data, 4);
 }
 
+int m4af_add_itmf_int64_tag(m4af_writer_t *ctx, uint32_t type, uint64_t value)
+{
+    uint64_t data = m4af_htob64(value);
+    return m4af_add_itmf_short_tag(ctx, type, M4AF_INTEGER, &data, 8);
+}
+
 int m4af_add_itmf_track_tag(m4af_writer_t *ctx, int track, int total)
 {
     uint16_t data[4] = { 0 };
@@ -509,15 +515,6 @@ void m4af_update_size(m4af_writer_t *ctx, int64_t pos)
     m4af_set_pos(ctx, current_pos);
 }
 
-static
-int m4af_head_version(m4af_writer_t *ctx, int track_idx)
-{
-    m4af_track_t *track = &ctx->track[track_idx];
-    return track->duration > UINT32_MAX
-        || track->creation_time > UINT32_MAX
-        || track->modification_time > UINT32_MAX;
-}
-
 static
 void m4af_descriptor(m4af_writer_t *ctx, uint32_t tag, uint32_t size)
 {
@@ -829,7 +826,9 @@ void m4af_mdhd_box(m4af_writer_t *ctx, int track_idx)
 {
     m4af_track_t *track = &ctx->track[track_idx];
     int64_t pos = m4af_tell(ctx);
-    uint8_t version = m4af_head_version(ctx, track_idx);
+    uint8_t version = (track->creation_time > UINT32_MAX ||
+                       track->modification_time > UINT32_MAX ||
+                       track->duration > UINT32_MAX);
 
     m4af_write(ctx, "\0\0\0\0mdhd", 8);
     m4af_write(ctx, &version, 1);
@@ -892,7 +891,11 @@ void m4af_tkhd_box(m4af_writer_t *ctx, int track_idx)
 {
     m4af_track_t *track = &ctx->track[track_idx];
     int64_t pos = m4af_tell(ctx);
-    uint8_t version = m4af_head_version(ctx, track_idx);
+    int64_t duration =
+        (double)track->duration / track->timescale * ctx->timescale + .5;
+    uint8_t version = (track->creation_time > UINT32_MAX ||
+                       track->modification_time > UINT32_MAX ||
+                       duration > UINT32_MAX);
     m4af_write(ctx, "\0\0\0\0tkhd", 8);
     m4af_write(ctx, &version, 1);
     m4af_write(ctx, "\0\0\007", 3);  /* flags  */
@@ -902,14 +905,14 @@ void m4af_tkhd_box(m4af_writer_t *ctx, int track_idx)
         m4af_write32(ctx, track_idx + 1);
         m4af_write(ctx, "\0\0\0\0"   /* reserved    */
                         , 4);
-        m4af_write64(ctx, track->duration);
+        m4af_write64(ctx, duration);
     } else {
         m4af_write32(ctx, track->creation_time);
         m4af_write32(ctx, track->modification_time);
         m4af_write32(ctx, track_idx + 1);
         m4af_write(ctx, "\0\0\0\0"   /* reserved    */
                         , 4);
-        m4af_write32(ctx, track->duration);
+        m4af_write32(ctx, duration);
     }
     m4af_write(ctx,
                "\0\0\0\0"   /* reserved[0]      */
@@ -950,7 +953,7 @@ int64_t m4af_movie_duration(m4af_writer_t *ctx)
     unsigned i;
     for (i = 0; i < ctx->num_tracks; ++i) {
         double x = ctx->track[i].duration;
-        int64_t duration = x * ctx->track[i].timescale / ctx->timescale + .5;
+        int64_t duration = x / ctx->track[i].timescale * ctx->timescale + .5;
         if (duration > movie_duration)
             movie_duration = duration;
     }
@@ -961,8 +964,10 @@ static
 void m4af_mvhd_box(m4af_writer_t *ctx)
 {
     int64_t pos = m4af_tell(ctx);
-    uint8_t version = m4af_head_version(ctx, 0);
     int64_t movie_duration = m4af_movie_duration(ctx);
+    uint8_t version = (ctx->creation_time > UINT32_MAX ||
+                       ctx->modification_time > UINT32_MAX ||
+                       movie_duration > UINT32_MAX);
 
     m4af_write(ctx, "\0\0\0\0mvhd", 8);
     m4af_write(ctx, &version, 1);
@@ -1137,7 +1142,7 @@ int m4af_finalize(m4af_writer_t *ctx)
         track = ctx->track + i;
         if (track->duration) {
             int64_t track_size = 0;
-           unsigned j;
+            unsigned j;
             for (j = 0; j < track->num_chunks; ++j)
                 track_size += track->chunk_table[j].size;
             track->avgBitrate =
@@ -1171,15 +1176,15 @@ void m4af_teardown(m4af_writer_t **ctxp)
     m4af_writer_t *ctx = *ctxp;
     m4af_track_t *track;
     for (i = 0; i < ctx->num_tracks; ++i) {
-       track = ctx->track + i;
-       if (track->decSpecificInfo)
-           m4af_free(track->decSpecificInfo);
-       if (track->sample_table)
-           m4af_free(track->sample_table);
-       if (track->chunk_table)
-           m4af_free(track->chunk_table);
-       if (track->chunk_buffer)
-           m4af_free(track->chunk_buffer);
+        track = ctx->track + i;
+        if (track->decSpecificInfo)
+            m4af_free(track->decSpecificInfo);
+        if (track->sample_table)
+            m4af_free(track->sample_table);
+        if (track->chunk_table)
+            m4af_free(track->chunk_table);
+        if (track->chunk_buffer)
+            m4af_free(track->chunk_buffer);
     }
     if (ctx->itmf_table)
         m4af_free_itmf_table(ctx);
This page took 0.011377 seconds and 4 git commands to generate.