diff options
author | Jan Ehrhardt <phpdev@ehrhardt.nl> | 2012-09-30 21:32:26 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-09-30 22:19:54 +0200 |
commit | f4d9148fe282879b9fcc755767c9c04de9ddbcfa (patch) | |
tree | d8996267f2adca9c29a059b0b748858d8bf78e23 /tools | |
parent | 13d878366f4ef15e64d2fc29d482ab283ac75282 (diff) | |
download | ffmpeg-f4d9148fe282879b9fcc755767c9c04de9ddbcfa.tar.gz |
qt-faststart: speedup
qt-faststart is terribly slow when the input file and the output file
are on a slow disk like a SD card. By increasing the copy_buffer from
1K to 32M I decreased the processing time on a sample file from
1600 seconds to 4 seconds. The timing difference is during 'copying
rest of file'.
S:\SD_VIDEO\PRG001>e:\utils\qt-faststart 00005.mp4 5.mp4
ftyp 0 32
free 32 8
mdat 40 13744391
moov 13744431 141848
patching stco atom...
patching stco atom...
writing ftyp atom...
writing moov atom...
copying rest of file...
Execution time: 1576.259 s
S:\SD_VIDEO\PRG001>s:\utils\qt-faststart 00005.mp4 5.mp4
ftyp 0 32
free 32 8
mdat 40 13744391
moov 13744431 141848
patching stco atom...
patching stco atom...
writing ftyp atom...
writing moov atom...
copying rest of file...
Execution time: 3.846 s
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/qt-faststart.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/tools/qt-faststart.c b/tools/qt-faststart.c index ebbe95237c..bfa6f1a489 100644 --- a/tools/qt-faststart.c +++ b/tools/qt-faststart.c @@ -77,7 +77,7 @@ #define CO64_ATOM QT_ATOM('c', 'o', '6', '4') #define ATOM_PREAMBLE_SIZE 8 -#define COPY_BUFFER_SIZE 1024 +#define COPY_BUFFER_SIZE 33554432 int main(int argc, char *argv[]) { @@ -96,7 +96,7 @@ int main(int argc, char *argv[]) uint32_t offset_count; uint64_t current_offset; uint64_t start_offset = 0; - unsigned char copy_buffer[COPY_BUFFER_SIZE]; + unsigned char *copy_buffer = NULL; int bytes_to_copy; if (argc != 3) { @@ -293,6 +293,11 @@ int main(int argc, char *argv[]) } /* copy the remainder of the infile, from offset 0 -> last_offset - 1 */ + copy_buffer = malloc(COPY_BUFFER_SIZE); + if (!copy_buffer) { + printf("could not allocate %"PRIu64" bytes for copy_buffer\n", COPY_BUFFER_SIZE); + goto error_out; + } printf(" copying rest of file...\n"); while (last_offset) { if (last_offset > COPY_BUFFER_SIZE) @@ -315,6 +320,7 @@ int main(int argc, char *argv[]) fclose(outfile); free(moov_atom); free(ftyp_atom); + free(copy_buffer); return 0; @@ -325,5 +331,6 @@ error_out: fclose(outfile); free(moov_atom); free(ftyp_atom); + free(copy_buffer); return 1; } |