aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorJan Ehrhardt <phpdev@ehrhardt.nl>2012-09-30 21:32:26 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-09-30 22:19:54 +0200
commitf4d9148fe282879b9fcc755767c9c04de9ddbcfa (patch)
treed8996267f2adca9c29a059b0b748858d8bf78e23 /tools
parent13d878366f4ef15e64d2fc29d482ab283ac75282 (diff)
downloadffmpeg-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.c11
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;
}