int quicktime_write_tkhd(quicktime_t *file, quicktime_tkhd_t *tkhd) { quicktime_atom_t atom; quicktime_atom_write_header(file, &atom, "tkhd"); quicktime_write_char(file, tkhd->version); quicktime_write_int24(file, tkhd->flags); quicktime_write_int32(file, tkhd->creation_time); quicktime_write_int32(file, tkhd->modification_time); quicktime_write_int32(file, tkhd->track_id); quicktime_write_int32(file, tkhd->reserved1); quicktime_write_int32(file, tkhd->duration); if (file->use_mp4) { int i; for (i = 0; i < 3; i++) { quicktime_write_int32(file, 0x00000000); } if (tkhd->is_audio) { quicktime_write_int16(file, 0x0100); } else { quicktime_write_int16(file, 0x0000); } quicktime_write_int16(file, 0x0000); quicktime_write_int32(file, 0x00010000); for (i = 0; i < 3; i++) { quicktime_write_int32(file, 0x00000000); } quicktime_write_int32(file, 0x00010000); for (i = 0; i < 3; i++) { quicktime_write_int32(file, 0x00000000); } quicktime_write_int32(file, 0x40000000); if (tkhd->is_video) { quicktime_write_int32(file, 0x01400000); quicktime_write_int32(file, 0x00F00000); } else { quicktime_write_int32(file, 0x00000000); quicktime_write_int32(file, 0x00000000); } } else { quicktime_write_data(file, tkhd->reserved2, 8); quicktime_write_int16(file, tkhd->layer); quicktime_write_int16(file, tkhd->alternate_group); quicktime_write_fixed16(file, tkhd->volume); quicktime_write_int16(file, tkhd->reserved3); quicktime_write_matrix(file, &(tkhd->matrix)); quicktime_write_fixed32(file, tkhd->track_width); quicktime_write_fixed32(file, tkhd->track_height); } quicktime_atom_write_footer(file, &atom); }
void quicktime_write_elst_table(quicktime_t *file, quicktime_elst_table_t *table, long duration) { table->duration = duration; quicktime_write_int32(file, table->duration); quicktime_write_int32(file, table->time); quicktime_write_fixed32(file, table->rate); }
int quicktime_write_matrix(quicktime_t *file, quicktime_matrix_t *matrix) { int i; for(i = 0; i < 9; i++) { quicktime_write_fixed32(file, matrix->values[i]); } }
void quicktime_write_stsd_video(quicktime_t *file, quicktime_stsd_table_t *table) { quicktime_write_int16(file, table->version); quicktime_write_int16(file, table->revision); quicktime_write_data(file, table->vendor, 4); quicktime_write_int32(file, table->temporal_quality); quicktime_write_int32(file, table->spatial_quality); quicktime_write_int16(file, table->width); quicktime_write_int16(file, table->height); quicktime_write_fixed32(file, table->dpi_horizontal); quicktime_write_fixed32(file, table->dpi_vertical); quicktime_write_int32(file, table->data_size); quicktime_write_int16(file, table->frames_per_sample); quicktime_write_char(file, strlen(table->compressor_name)); quicktime_write_data(file, table->compressor_name, 31); quicktime_write_int16(file, table->depth); quicktime_write_int16(file, table->ctab_id); // Write field order for mjpa if(table->fields) { quicktime_atom_t atom; quicktime_atom_write_header(file, &atom, "fiel"); quicktime_write_char(file, table->fields); quicktime_write_char(file, table->field_dominance); quicktime_atom_write_footer(file, &atom); } // Write header for mp4v if(table->esds.mpeg4_header_size && table->esds.mpeg4_header) { quicktime_write_esds(file, &table->esds, 1, 0); } if(table->avcc.data_size) { quicktime_write_avcc(file, &table->avcc); } // Write another 32 bits if(table->version == 1) quicktime_write_int32(file, 0x0); }
void quicktime_write_tkhd(quicktime_t *file, quicktime_tkhd_t *tkhd) { quicktime_atom_t atom; quicktime_atom_write_header(file, &atom, "tkhd"); quicktime_write_char(file, tkhd->version); quicktime_write_int24(file, tkhd->flags); quicktime_write_int32(file, tkhd->creation_time); quicktime_write_int32(file, tkhd->modification_time); quicktime_write_int32(file, tkhd->track_id); quicktime_write_int32(file, tkhd->reserved1); quicktime_write_int32(file, tkhd->duration); quicktime_write_data(file, tkhd->reserved2, 8); quicktime_write_int16(file, tkhd->layer); quicktime_write_int16(file, tkhd->alternate_group); quicktime_write_fixed16(file, tkhd->volume); quicktime_write_int16(file, tkhd->reserved3); quicktime_write_matrix(file, &(tkhd->matrix)); quicktime_write_fixed32(file, tkhd->track_width); quicktime_write_fixed32(file, tkhd->track_height); quicktime_atom_write_footer(file, &atom); }
void quicktime_write_stsd_audio(quicktime_t *file, quicktime_stsd_table_t *table) { quicktime_write_int16(file, table->version); quicktime_write_int16(file, table->revision); quicktime_write_data(file, table->vendor, 4); quicktime_write_int16(file, table->channels); quicktime_write_int16(file, table->sample_size); quicktime_write_int16(file, table->compression_id); quicktime_write_int16(file, table->packet_size); quicktime_write_fixed32(file, table->sample_rate); // Write header for mp4a if(table->esds.mpeg4_header_size && table->esds.mpeg4_header) { // Android requires leaving out the WAVE header #if 0 // Version 1 info quicktime_write_int32(file, 0); quicktime_write_int32(file, 0); quicktime_write_int32(file, 0); quicktime_write_int32(file, 0); quicktime_atom_t wave_atom; quicktime_atom_t frma_atom; quicktime_atom_t mp4a_atom; quicktime_atom_write_header(file, &wave_atom, "wave"); quicktime_atom_write_header(file, &frma_atom, "frma"); quicktime_write_data(file, "mp4a", 4); quicktime_atom_write_footer(file, &frma_atom); quicktime_atom_write_header(file, &mp4a_atom, "mp4a"); quicktime_write_int32(file, 0x0); quicktime_atom_write_footer(file, &mp4a_atom); #endif // 0 quicktime_write_esds(file, &table->esds, 0, 1); // quicktime_atom_write_footer(file, &wave_atom); } }