+static
+uint64_t m4af_patch_moov(m4af_ctx_t *ctx, uint32_t moov_size, uint32_t offset)
+{
+ int64_t pos = 0;
+ uint32_t moov_size2;
+ int i, j;
+ m4af_io_callbacks_t io_reserve = ctx->io;
+ void *io_cookie_reserve = ctx->io_cookie;
+
+ 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->io = m4af_null_io_callbacks;
+ ctx->io_cookie = &pos;
+ moov_size2 = m4af_write_moov_box(ctx);
+
+ if (moov_size2 != moov_size) {
+ /* stco -> co64 switching */
+ 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 += moov_size2 - moov_size;
+ moov_size2 = m4af_write_moov_box(ctx);
+ }
+ ctx->io = io_reserve;
+ ctx->io_cookie = io_cookie_reserve;
+ return moov_size2;
+}
+