- m4af_mdhd_box(ctx, track_idx);
- m4af_hdlr_box(ctx, track_idx, hdlr);
- m4af_minf_box(ctx, track_idx);
- m4af_update_size(ctx, pos);
+ m4af_write_mdhd_box(ctx, track_idx);
+ m4af_write_hdlr_box(ctx, track_idx, hdlr);
+ m4af_write_minf_box(ctx, track_idx);
+ m4af_update_box_size(ctx, pos);
+}
+
+static
+void m4af_write_elst_box(m4af_ctx_t *ctx, uint32_t track_idx)
+{
+ m4af_track_t *track = &ctx->track[track_idx];
+ uint8_t version;
+ int64_t duration = track->duration - track->encoder_delay - track->padding;
+ int64_t pos = m4af_tell(ctx);
+ duration = (double)duration / track->timescale * ctx->timescale + .5;
+ version = (duration > UINT32_MAX);
+
+ m4af_write(ctx, "\0\0\0\0elst", 8);
+ m4af_write(ctx, &version, 1);
+ m4af_write(ctx, "\0\0\0", 3); /* flags */
+ m4af_write32(ctx, 1); /* entry_count: 1 */
+ if (version) {
+ m4af_write64(ctx, duration);
+ m4af_write64(ctx, track->encoder_delay);
+ } else {
+ m4af_write32(ctx, duration);
+ m4af_write32(ctx, track->encoder_delay);
+ }
+ m4af_write16(ctx, 1); /* media_rate_integer */
+ m4af_write16(ctx, 0); /* media_rate_fraction */
+ m4af_update_box_size(ctx, pos);