Browse Source

keep ftyp first

Originally committed as revision 5170 to svn://svn.ffmpeg.org/ffmpeg/trunk
tags/v0.5
Baptiste Coudurier 19 years ago
parent
commit
60a9cc5879
1 changed files with 36 additions and 0 deletions
  1. +36
    -0
      qt-faststart.c

+ 36
- 0
qt-faststart.c View File

@@ -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) {


Loading…
Cancel
Save