quicktime_t* quicktime_open(char *filename, int rd, int wr) { quicktime_t *new_file = calloc(1, sizeof(quicktime_t)); int result = 0; //printf("quicktime_open 1\n"); quicktime_init(new_file); new_file->wr = wr; new_file->rd = rd; new_file->mdat.atom.start = 0; result = quicktime_file_open(new_file, filename, rd, wr); if(!result) { if(rd) { if(quicktime_read_info(new_file)) { quicktime_close(new_file); fprintf(stderr, "quicktime_open: error in header\n"); new_file = 0; } } /* start the data atom */ /* also don't want to do this if making a streamable file */ if(wr) { quicktime_set_presave(new_file, 1); // android requires the ftyp header const unsigned char ftyp_data[] = { 0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70, 0x6d, 0x70, 0x34, 0x32, 0x00, 0x00, 0x00, 0x01, 0x6d, 0x70, 0x34, 0x32, 0x61, 0x76, 0x63, 0x31 }; quicktime_write_data(new_file, (char*)ftyp_data, sizeof(ftyp_data)); quicktime_atom_write_header64(new_file, &new_file->mdat.atom, "mdat"); quicktime_set_presave(new_file, 0); } } else { //printf("quicktime_open 10\n"); quicktime_close(new_file); //printf("quicktime_open 100\n"); new_file = 0; } return new_file; }
quicktime_t* quicktime_open(char *filename, int rd, int wr) { quicktime_t *new_file = calloc(1, sizeof(quicktime_t)); char flags[10]; int result = 0; //printf("quicktime_open 1\n"); quicktime_init(new_file); new_file->wr = wr; new_file->rd = rd; new_file->mdat.atom.start = 0; result = quicktime_file_open(new_file, filename, rd, wr); if(!result) { if(rd) { if(quicktime_read_info(new_file)) { quicktime_close(new_file); fprintf(stderr, "quicktime_open: error in header\n"); new_file = 0; } } /* start the data atom */ /* also don't want to do this if making a streamable file */ if(wr) { quicktime_set_presave(new_file, 1); quicktime_atom_write_header64(new_file, &new_file->mdat.atom, "mdat"); quicktime_set_presave(new_file, 0); } } else { //printf("quicktime_open 10\n"); quicktime_close(new_file); //printf("quicktime_open 100\n"); new_file = 0; } return new_file; }
int quicktime_close(quicktime_t *file) { int result = 0; if(file->wr) { quicktime_codecs_flush(file); // Reenable buffer for quick header writing. quicktime_set_presave(file, 1); if(file->use_avi) { quicktime_atom_t junk_atom; int i; // Finalize last header quicktime_finalize_riff(file, file->riff[file->total_riffs - 1]); int64_t position = quicktime_position(file); // Finalize the odml header quicktime_finalize_odml(file, &file->riff[0]->hdrl); // Finalize super indexes quicktime_finalize_indx(file); // Pad ending quicktime_set_position(file, position); quicktime_atom_write_header(file, &junk_atom, "JUNK"); for(i = 0; i < 0x406; i++) quicktime_write_int32_le(file, 0); quicktime_atom_write_footer(file, &junk_atom); } else { // Atoms are only written here if(file->stream) { quicktime_write_moov(file, &(file->moov)); quicktime_atom_write_footer(file, &file->mdat.atom); } } } quicktime_file_close(file); quicktime_delete(file); free(file); return result; }