From d88bbb3d9de15602a7761c575165ee32ea404856 Mon Sep 17 00:00:00 2001 From: Marina Kolpakova Date: Sun, 8 Jul 2012 18:26:28 +0000 Subject: [PATCH] fixed undefined behaviour in image codecs initialization --- modules/highgui/src/loadsave.cpp | 113 +++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 57 deletions(-) diff --git a/modules/highgui/src/loadsave.cpp b/modules/highgui/src/loadsave.cpp index 9250fff..1fd20dc 100644 --- a/modules/highgui/src/loadsave.cpp +++ b/modules/highgui/src/loadsave.cpp @@ -54,15 +54,56 @@ namespace cv { -static vector decoders; -static vector encoders; +struct ImageCodecInitializer +{ + ImageCodecInitializer() + { + decoders.push_back( new BmpDecoder ); + encoders.push_back( new BmpEncoder ); + #ifdef HAVE_JPEG + decoders.push_back( new JpegDecoder ); + encoders.push_back( new JpegEncoder ); + #endif + decoders.push_back( new SunRasterDecoder ); + encoders.push_back( new SunRasterEncoder ); + decoders.push_back( new PxMDecoder ); + encoders.push_back( new PxMEncoder ); + #ifdef HAVE_TIFF + decoders.push_back( new TiffDecoder ); + #endif + encoders.push_back( new TiffEncoder ); + #ifdef HAVE_PNG + decoders.push_back( new PngDecoder ); + encoders.push_back( new PngEncoder ); + #endif + #ifdef HAVE_JASPER + decoders.push_back( new Jpeg2KDecoder ); + encoders.push_back( new Jpeg2KEncoder ); + #endif + #ifdef HAVE_OPENEXR + decoders.push_back( new ExrDecoder ); + encoders.push_back( new ExrEncoder ); + #endif + // because it is a generic image I/O API, supporting many formats, + // it should be last in the list. + #ifdef HAVE_IMAGEIO + decoders.push_back( new ImageIODecoder ); + encoders.push_back( new ImageIOEncoder ); + #endif + } + + vector decoders; + vector encoders; +}; + +static ImageCodecInitializer codecs; static ImageDecoder findDecoder( const string& filename ) { size_t i, maxlen = 0; - for( i = 0; i < decoders.size(); i++ ) + for( i = 0; i < codecs.decoders.size(); i++ ) { - size_t len = decoders[i]->signatureLength(); + size_t len = codecs.decoders[i]->signatureLength(); maxlen = std::max(maxlen, len); } @@ -74,10 +115,10 @@ static ImageDecoder findDecoder( const string& filename ) fclose(f); signature = signature.substr(0, maxlen); - for( i = 0; i < decoders.size(); i++ ) + for( i = 0; i < codecs.decoders.size(); i++ ) { - if( decoders[i]->checkSignature(signature) ) - return decoders[i]->newDecoder(); + if( codecs.decoders[i]->checkSignature(signature) ) + return codecs.decoders[i]->newDecoder(); } return ImageDecoder(); @@ -90,9 +131,9 @@ static ImageDecoder findDecoder( const Mat& buf ) if( buf.rows*buf.cols < 1 || !buf.isContinuous() ) return ImageDecoder(); - for( i = 0; i < decoders.size(); i++ ) + for( i = 0; i < codecs.decoders.size(); i++ ) { - size_t len = decoders[i]->signatureLength(); + size_t len = codecs.decoders[i]->signatureLength(); maxlen = std::max(maxlen, len); } @@ -101,10 +142,10 @@ static ImageDecoder findDecoder( const Mat& buf ) string signature(maxlen, ' '); memcpy( &signature[0], buf.data, maxlen ); - for( i = 0; i < decoders.size(); i++ ) + for( i = 0; i < codecs.decoders.size(); i++ ) { - if( decoders[i]->checkSignature(signature) ) - return decoders[i]->newDecoder(); + if( codecs.decoders[i]->checkSignature(signature) ) + return codecs.decoders[i]->newDecoder(); } return ImageDecoder(); @@ -122,9 +163,9 @@ static ImageEncoder findEncoder( const string& _ext ) for( ext++; isalnum(ext[len]) && len < 128; len++ ) ; - for( size_t i = 0; i < encoders.size(); i++ ) + for( size_t i = 0; i < codecs.encoders.size(); i++ ) { - string description = encoders[i]->getDescription(); + string description = codecs.encoders[i]->getDescription(); const char* descr = strchr( description.c_str(), '(' ); while( descr ) @@ -141,7 +182,7 @@ static ImageEncoder findEncoder( const string& _ext ) break; } if( j == len && !isalnum(descr[j])) - return encoders[i]->newEncoder(); + return codecs.encoders[i]->newEncoder(); descr += j; } } @@ -149,48 +190,6 @@ static ImageEncoder findEncoder( const string& _ext ) return ImageEncoder(); } -struct ImageCodecInitializer -{ - ImageCodecInitializer() - { - decoders.push_back( new BmpDecoder ); - encoders.push_back( new BmpEncoder ); - #ifdef HAVE_JPEG - decoders.push_back( new JpegDecoder ); - encoders.push_back( new JpegEncoder ); - #endif - decoders.push_back( new SunRasterDecoder ); - encoders.push_back( new SunRasterEncoder ); - decoders.push_back( new PxMDecoder ); - encoders.push_back( new PxMEncoder ); - #ifdef HAVE_TIFF - decoders.push_back( new TiffDecoder ); - #endif - encoders.push_back( new TiffEncoder ); - #ifdef HAVE_PNG - decoders.push_back( new PngDecoder ); - encoders.push_back( new PngEncoder ); - #endif - #ifdef HAVE_JASPER - decoders.push_back( new Jpeg2KDecoder ); - encoders.push_back( new Jpeg2KEncoder ); - #endif - #ifdef HAVE_OPENEXR - decoders.push_back( new ExrDecoder ); - encoders.push_back( new ExrEncoder ); - #endif - // because it is a generic image I/O API, supporting many formats, - // it should be last in the list. - #ifdef HAVE_IMAGEIO - decoders.push_back( new ImageIODecoder ); - encoders.push_back( new ImageIOEncoder ); - #endif - } -}; - -static ImageCodecInitializer initialize_codecs; - - enum { LOAD_CVMAT=0, LOAD_IMAGE=1, LOAD_MAT=2 }; static void* -- 2.7.4