X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=src%2Fm4af.c;h=fb4f8d63a30f1be422927a102686b2324dd1c73b;hb=7b1f2136183f13cfdc83cc387134688ad07325f5;hp=bb3ecedae8c3f77033e03b12cbdd9093fd625648;hpb=c5c459082afba4fe4350851c7ac3774f80c0ee56;p=fdkaac.git diff --git a/src/m4af.c b/src/m4af.c index bb3eced..fb4f8d6 100644 --- a/src/m4af.c +++ b/src/m4af.c @@ -515,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) { @@ -835,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); @@ -898,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 */ @@ -908,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] */ @@ -956,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; } @@ -967,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); @@ -1143,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 = @@ -1177,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);