|
|
@ -72,10 +72,13 @@ int main(int argc, char *argv[]) |
|
|
|
uint64_t atom_size = 0; |
|
|
|
uint64_t atom_size = 0; |
|
|
|
uint64_t last_offset; |
|
|
|
uint64_t last_offset; |
|
|
|
unsigned char *moov_atom; |
|
|
|
unsigned char *moov_atom; |
|
|
|
|
|
|
|
unsigned char *ftyp_atom = 0; |
|
|
|
uint64_t moov_atom_size; |
|
|
|
uint64_t moov_atom_size; |
|
|
|
|
|
|
|
uint64_t ftyp_atom_size = 0; |
|
|
|
uint64_t i, j; |
|
|
|
uint64_t i, j; |
|
|
|
uint32_t offset_count; |
|
|
|
uint32_t offset_count; |
|
|
|
uint64_t current_offset; |
|
|
|
uint64_t current_offset; |
|
|
|
|
|
|
|
uint64_t start_offset = 0; |
|
|
|
unsigned char copy_buffer[COPY_BUFFER_SIZE]; |
|
|
|
unsigned char copy_buffer[COPY_BUFFER_SIZE]; |
|
|
|
int bytes_to_copy; |
|
|
|
int bytes_to_copy; |
|
|
|
|
|
|
|
|
|
|
@ -112,6 +115,27 @@ int main(int argc, char *argv[]) |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* keep ftyp atom */ |
|
|
|
|
|
|
|
if (atom_type == FTYP_ATOM) { |
|
|
|
|
|
|
|
ftyp_atom_size = atom_size; |
|
|
|
|
|
|
|
ftyp_atom = malloc(ftyp_atom_size); |
|
|
|
|
|
|
|
if (!ftyp_atom) { |
|
|
|
|
|
|
|
printf ("could not allocate 0x%llX byte for ftyp atom\n", |
|
|
|
|
|
|
|
atom_size); |
|
|
|
|
|
|
|
fclose(infile); |
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
fseeko(infile, -ATOM_PREAMBLE_SIZE, SEEK_CUR); |
|
|
|
|
|
|
|
if (fread(ftyp_atom, atom_size, 1, infile) != 1) { |
|
|
|
|
|
|
|
perror(argv[1]); |
|
|
|
|
|
|
|
free(ftyp_atom); |
|
|
|
|
|
|
|
fclose(infile); |
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
start_offset = ftello(infile); |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* 64-bit special case */ |
|
|
|
/* 64-bit special case */ |
|
|
|
if (atom_size == 1) { |
|
|
|
if (atom_size == 1) { |
|
|
|
if (fread(atom_bytes, ATOM_PREAMBLE_SIZE, 1, infile) != 1) { |
|
|
|
if (fread(atom_bytes, ATOM_PREAMBLE_SIZE, 1, infile) != 1) { |
|
|
@ -214,6 +238,9 @@ int main(int argc, char *argv[]) |
|
|
|
free(moov_atom); |
|
|
|
free(moov_atom); |
|
|
|
return 1; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* seek after ftyp atom if needed */ |
|
|
|
|
|
|
|
fseeko(infile, start_offset, SEEK_SET); |
|
|
|
|
|
|
|
|
|
|
|
outfile = fopen(argv[2], "wb"); |
|
|
|
outfile = fopen(argv[2], "wb"); |
|
|
|
if (!outfile) { |
|
|
|
if (!outfile) { |
|
|
|
perror(argv[2]); |
|
|
|
perror(argv[2]); |
|
|
@ -222,6 +249,15 @@ int main(int argc, char *argv[]) |
|
|
|
return 1; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* dump the same ftyp atom */ |
|
|
|
|
|
|
|
if (ftyp_atom_size > 0) { |
|
|
|
|
|
|
|
printf (" writing ftyp atom...\n"); |
|
|
|
|
|
|
|
if (fwrite(ftyp_atom, ftyp_atom_size, 1, outfile) != 1) { |
|
|
|
|
|
|
|
perror(argv[2]); |
|
|
|
|
|
|
|
goto error_out; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* dump the new moov atom */ |
|
|
|
/* dump the new moov atom */ |
|
|
|
printf (" writing moov atom...\n"); |
|
|
|
printf (" writing moov atom...\n"); |
|
|
|
if (fwrite(moov_atom, moov_atom_size, 1, outfile) != 1) { |
|
|
|
if (fwrite(moov_atom, moov_atom_size, 1, outfile) != 1) { |
|
|
|