size_t mov_write_avcc(const struct mov_t* mov) { const struct mov_track_t* track = mov->track; const struct mov_sample_entry_t* entry = track->stsd.current; mov_buffer_w32(&mov->io, entry->extra_data_size + 8); /* size */ mov_buffer_write(&mov->io, "avcC", 4); if (entry->extra_data_size > 0) mov_buffer_write(&mov->io, entry->extra_data, entry->extra_data_size); return entry->extra_data_size + 8; }
size_t mov_write_ctts(const struct mov_t* mov, uint32_t count) { size_t size, i; const struct mov_sample_t* sample; const struct mov_track_t* track = mov->track; size = 12/* full box */ + 4/* entry count */ + count * 8/* entry */; mov_buffer_w32(&mov->io, size); /* size */ mov_buffer_write(&mov->io, "ctts", 4); mov_buffer_w8(&mov->io, 1); /* version */ mov_buffer_w24(&mov->io, 0); /* flags */ mov_buffer_w32(&mov->io, count); /* entry count */ for (i = 0; i < track->sample_count; i++) { sample = &track->samples[i]; if(0 == sample->first_chunk) continue;; mov_buffer_w32(&mov->io, sample->first_chunk); // count mov_buffer_w32(&mov->io, sample->samples_per_chunk); // offset * timescale / 1000 } return size; }
size_t mov_write_vmhd(const struct mov_t* mov) { mov_buffer_w32(&mov->io, 20); /* size (always 0x14) */ mov_buffer_write(&mov->io, "vmhd", 4); mov_buffer_w32(&mov->io, 0x01); /* version & flags */ mov_buffer_w64(&mov->io, 0); /* reserved (graphics mode = copy) */ return 20; }
size_t mov_write_smhd(const struct mov_t* mov) { mov_buffer_w32(&mov->io, 16); /* size */ mov_buffer_write(&mov->io, "smhd", 4); mov_buffer_w32(&mov->io, 0); /* version & flags */ mov_buffer_w16(&mov->io, 0); /* reserved (balance, normally = 0) */ mov_buffer_w16(&mov->io, 0); /* reserved */ return 16; }