+static
+void m4af_shift_mdat_pos(m4af_ctx_t *ctx, uint32_t offset)
+{
+ unsigned i, j;
+ int64_t begin, end;
+ char buf[8192];
+
+ end = ctx->mdat_pos + ctx->mdat_size;
+ for (; (begin = m4af_max(ctx->mdat_pos, end - 8192)) < end; end = begin) {
+ m4af_set_pos(ctx, begin);
+ ctx->io.read(ctx->io_cookie, buf, end - begin);
+ m4af_set_pos(ctx, begin + offset);
+ m4af_write(ctx, buf, end - begin);
+ }
+ for (i = 0; i < ctx->num_tracks; ++i)
+ for (j = 0; j < ctx->track[i].num_chunks; ++j)
+ ctx->track[i].chunk_table[j].offset += offset;
+ ctx->mdat_pos += offset;
+ m4af_set_pos(ctx, ctx->mdat_pos - 16);
+ m4af_write_free_box(ctx, 0);
+ m4af_write(ctx, "\0\0\0\0mdat", 8);
+ m4af_finalize_mdat(ctx);
+}
+
+int m4af_finalize(m4af_ctx_t *ctx, int optimize)