fixed undefined behaviour in image codecs initialization
authorMarina Kolpakova <no@email>
Sun, 8 Jul 2012 18:26:28 +0000 (18:26 +0000)
committerMarina Kolpakova <no@email>
Sun, 8 Jul 2012 18:26:28 +0000 (18:26 +0000)
modules/highgui/src/loadsave.cpp

index 9250fff..1fd20dc 100644 (file)
 namespace cv
 {
 
-static vector<ImageDecoder> decoders;
-static vector<ImageEncoder> 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<ImageDecoder> decoders;
+    vector<ImageEncoder> 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*