From edebc11048f397cea2661ce91a936c73cffe3f4f Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Sun, 3 Oct 2021 11:19:21 -0400 Subject: [PATCH] AVI file load efficiency fix. Read entire chunks at a time to increase disk read performance. --- src/drivers/Qt/avi/gwavi.cpp | 77 +++++++++++++++++++++++++----------- src/drivers/Qt/avi/gwavi.h | 2 + 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/src/drivers/Qt/avi/gwavi.cpp b/src/drivers/Qt/avi/gwavi.cpp index 235b9e54..b5d36efe 100644 --- a/src/drivers/Qt/avi/gwavi.cpp +++ b/src/drivers/Qt/avi/gwavi.cpp @@ -84,6 +84,8 @@ gwavi_t::gwavi_t(void) avi_std = 2; audioEnabled = false; riffWalkCallback = NULL; + readBuf = NULL; + readBufSize = 0; } gwavi_t::~gwavi_t(void) @@ -96,7 +98,11 @@ gwavi_t::~gwavi_t(void) { fclose(out); out = NULL; } - + if ( readBuf ) + { + free(readBuf); readBuf = NULL; + readBufSize = 0; + } } int @@ -667,6 +673,12 @@ int gwavi_t::riffwalk(void) { return -1; } + + if ( readBuf == NULL ) + { + readBufSize = 64 * 1024; + readBuf = (unsigned char*)malloc( readBufSize ); + } fpos = ftell(in); if (read_chars_bin(in, fourcc, 4) == -1) @@ -851,7 +863,7 @@ unsigned int gwavi_t::readList(int lvl) unsigned int gwavi_t::readChunk(const char *id, int lvl) { - unsigned int r, size, chunkSize, bytesRead=0; + unsigned int r, ret, size, chunkSize, bytesRead=0; unsigned short dataWord; char indent[256]; long long int fpos; @@ -889,6 +901,23 @@ unsigned int gwavi_t::readChunk(const char *id, int lvl) size += r; } + while ( size > 0 ) + { + if ( size > readBufSize ) + { + ret = fread( readBuf, 1, readBufSize, in ); + } + else + { + ret = fread( readBuf, 1, size, in ); + } + if ( ret == 0 ) + { + return 0; + } + size -= ret; + bytesRead += ret; + } //if ( strcmp( id, "avih") == 0 ) //{ // ret = readAviHeader(); @@ -923,30 +952,30 @@ unsigned int gwavi_t::readChunk(const char *id, int lvl) // bytesRead += ret; //} - while ( size >= WORD_SIZE ) - { - if (read_ushort(in, dataWord) == -1) - { - (void)fprintf(stderr, "readChunk: read_int() failed\n"); - return 0; - } - size -= WORD_SIZE; - bytesRead += WORD_SIZE; - } + //while ( size >= WORD_SIZE ) + //{ + // if (read_ushort(in, dataWord) == -1) + // { + // (void)fprintf(stderr, "readChunk: read_int() failed\n"); + // return 0; + // } + // size -= WORD_SIZE; + // bytesRead += WORD_SIZE; + //} - if ( size > 0 ) - { - char pad[4]; - int r = size % WORD_SIZE; + //if ( size > 0 ) + //{ + // char pad[4]; + // int r = size % WORD_SIZE; - if (read_chars_bin(in, pad, r) == -1) - { - (void)fprintf(stderr, "readChunk: read_int() failed\n"); - return 0; - } - size -= r; - bytesRead += r; - } + // if (read_chars_bin(in, pad, r) == -1) + // { + // (void)fprintf(stderr, "readChunk: read_int() failed\n"); + // return 0; + // } + // size -= r; + // bytesRead += r; + //} //printf("%sChunk End: %s %u\n", indent, id, bytesRead); diff --git a/src/drivers/Qt/avi/gwavi.h b/src/drivers/Qt/avi/gwavi.h index dfcfa444..9c5559aa 100644 --- a/src/drivers/Qt/avi/gwavi.h +++ b/src/drivers/Qt/avi/gwavi.h @@ -252,6 +252,8 @@ class gwavi_t int avi_std; char fourcc[8]; char audioEnabled; + unsigned char *readBuf; + size_t readBufSize; // helper functions long long ftell(FILE *fp);