diff --git a/src/drivers/Qt/AviRiffViewer.cpp b/src/drivers/Qt/AviRiffViewer.cpp index a30aab9d..b646bcf0 100644 --- a/src/drivers/Qt/AviRiffViewer.cpp +++ b/src/drivers/Qt/AviRiffViewer.cpp @@ -62,6 +62,8 @@ AviRiffViewerDialog::AviRiffViewerDialog(QWidget *parent) avi = NULL; lastChunk = NULL; + riffSize = 0; + progressDialog = NULL; memset( strhType, 0, sizeof(strhType) ); setWindowTitle("AVI RIFF Viewer"); @@ -274,6 +276,8 @@ void AviRiffViewerDialog::openAviFileDialog(void) //---------------------------------------------------------------------------- int AviRiffViewerDialog::openFile( const char *filepath ) { + int ret; + if ( avi ) { closeFile(); @@ -286,12 +290,31 @@ int AviRiffViewerDialog::openFile( const char *filepath ) return -1; } + progressDialog = new QProgressDialog( tr("Loading AVI File"), tr("Cancel"), 0, 1000, this ); + progressDialog->setWindowModality(Qt::WindowModal); + itemStack.clear(); lastChunk = NULL; memset( strhType, 0, sizeof(strhType) ); + riffSize = 0; avi->setRiffWalkCallback( ::riffWalkCallback, this ); - avi->riffwalk(); + ret = avi->riffwalk(); + + if ( ret ) + { + if ( progressDialog->wasCanceled() ) + { + QMessageBox::information( this, tr("AVI Load Canceled"), tr("AVI Load Canceled By User.") ); + } + else + { + progressDialog->reset(); + QMessageBox::critical( this, tr("AVI Load Error"), tr("AVI format errors detected. Unable to load file.") ); + } + closeFile(); + } + delete progressDialog; progressDialog = NULL; return 0; } @@ -310,12 +333,33 @@ int AviRiffViewerDialog::riffWalkCallback( int type, long long int fpos, const c { AviRiffTreeItem *item, *groupItem; + if ( riffSize > 0 ) + { + int prog; + + prog = (1000llu * fpos) / riffSize; + + if ( prog > 1000 ) + { + prog = 1000; + } + if ( progressDialog ) + { + if (progressDialog->wasCanceled()) + { + return -1; + } + progressDialog->setValue( prog ); + } + } switch ( type ) { case gwavi_t::RIFF_START: { item = new AviRiffTreeItem(type, fpos, fourcc, size); + riffSize = size; + itemStack.push_back(item); riffTree->addTopLevelItem(item); diff --git a/src/drivers/Qt/AviRiffViewer.h b/src/drivers/Qt/AviRiffViewer.h index 69669f40..7d62070d 100644 --- a/src/drivers/Qt/AviRiffViewer.h +++ b/src/drivers/Qt/AviRiffViewer.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -80,8 +81,10 @@ protected: AviRiffTreeItem *lastChunk; std::list itemStack; char strhType[8]; + size_t riffSize; QTabWidget *tabs; + QProgressDialog *progressDialog; private: public slots: diff --git a/src/drivers/Qt/avi/gwavi.cpp b/src/drivers/Qt/avi/gwavi.cpp index ab6aec17..235b9e54 100644 --- a/src/drivers/Qt/avi/gwavi.cpp +++ b/src/drivers/Qt/avi/gwavi.cpp @@ -673,6 +673,11 @@ int gwavi_t::riffwalk(void) return -1; fourcc[4] = 0; + + if ( strcmp( fourcc, "RIFF") != 0 ) + { + return -1; + } //printf("RIFF Begin: '%s'\n", fourcc ); if (read_uint(in, fileSize) == -1) @@ -692,7 +697,10 @@ int gwavi_t::riffwalk(void) if ( riffWalkCallback ) { - riffWalkCallback( RIFF_START, fpos, fourcc, fileSize, riffWalkUserData ); + if ( riffWalkCallback( RIFF_START, fpos, fourcc, fileSize, riffWalkUserData ) ) + { + return -1; + } } while ( size >= 4 ) @@ -731,7 +739,10 @@ int gwavi_t::riffwalk(void) if ( riffWalkCallback ) { - riffWalkCallback( RIFF_END, fpos, fourcc, fileSize, riffWalkUserData ); + if ( riffWalkCallback( RIFF_END, fpos, fourcc, fileSize, riffWalkUserData ) ) + { + return -1; + } } return 0; } @@ -830,7 +841,10 @@ unsigned int gwavi_t::readList(int lvl) { fpos = ftell(in); - riffWalkCallback( LIST_END, fpos, listType, listSize, riffWalkUserData ); + if ( riffWalkCallback( LIST_END, fpos, listType, listSize, riffWalkUserData ) ) + { + return 0; + } } return bytesRead+4; } @@ -856,7 +870,10 @@ unsigned int gwavi_t::readChunk(const char *id, int lvl) if ( riffWalkCallback ) { - riffWalkCallback( CHUNK_START, fpos-4, id, chunkSize, riffWalkUserData ); + if ( riffWalkCallback( CHUNK_START, fpos-4, id, chunkSize, riffWalkUserData ) ) + { + return 0; + } } if ( chunkSize == 0 )