X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=src%2Fm4af.c;h=fb4f8d63a30f1be422927a102686b2324dd1c73b;hb=2642af896e0a9f7b3bca63b02833e69b3bfcd82a;hp=0c62727648fef13cbb1bd2fe6f96199bdd54b531;hpb=48e2f01c5653c8f643b2a763e1cfa2efc1eccd60;p=fdkaac.git diff --git a/src/m4af.c b/src/m4af.c index 0c62727..fb4f8d6 100644 --- a/src/m4af.c +++ b/src/m4af.c @@ -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);