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; }
quicktime_t* quicktime_open(char *filename, int rd, int wr, int append) { quicktime_t *new_file = malloc(sizeof(quicktime_t)); char flags[10]; int exists = 0; quicktime_init(new_file); new_file->wr = wr; new_file->rd = rd; new_file->mdat.start = 0; if (!strcmp(&filename[strlen(filename)-4], ".mp4")) { new_file->use_mp4 = TRUE; } else { new_file->use_mp4 = FALSE; } if(rd && (new_file->stream = fopen(filename, "rb"))) { exists = 1; fclose(new_file->stream); new_file->stream = NULL; } if(rd && !wr) sprintf(flags, "rb"); else if(!rd && wr) sprintf(flags, "wb"); else if(rd && wr) { if(exists) sprintf(flags, "rb+"); else sprintf(flags, "wb+"); } if(!(new_file->stream = fopen(filename, flags))) { perror("quicktime_open"); free(new_file); return 0; } if(rd && exists) { fseek(new_file->stream, 0, SEEK_END); new_file->total_length = ftell(new_file->stream); fseek(new_file->stream, 0, SEEK_SET); if(quicktime_read_info(new_file)) { quicktime_close(new_file); new_file = 0; } } if(wr) { if(!exists || !append) { /* start the data atom */ quicktime_write_int32(new_file, 0); quicktime_write_char32(new_file, "mdat"); } else { quicktime_set_position(new_file, new_file->mdat.start + new_file->mdat.size); fseek(new_file->stream, new_file->mdat.start + new_file->mdat.size, SEEK_SET); } } return new_file; }