Commit d88bbb3d authored by Marina Kolpakova's avatar Marina Kolpakova

fixed undefined behaviour in image codecs initialization

parent 8c9a9f1c
...@@ -54,15 +54,56 @@ ...@@ -54,15 +54,56 @@
namespace cv namespace cv
{ {
static vector<ImageDecoder> decoders; struct ImageCodecInitializer
static vector<ImageEncoder> encoders; {
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 ) static ImageDecoder findDecoder( const string& filename )
{ {
size_t i, maxlen = 0; 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); maxlen = std::max(maxlen, len);
} }
...@@ -74,10 +115,10 @@ static ImageDecoder findDecoder( const string& filename ) ...@@ -74,10 +115,10 @@ static ImageDecoder findDecoder( const string& filename )
fclose(f); fclose(f);
signature = signature.substr(0, maxlen); 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) ) if( codecs.decoders[i]->checkSignature(signature) )
return decoders[i]->newDecoder(); return codecs.decoders[i]->newDecoder();
} }
return ImageDecoder(); return ImageDecoder();
...@@ -90,9 +131,9 @@ static ImageDecoder findDecoder( const Mat& buf ) ...@@ -90,9 +131,9 @@ static ImageDecoder findDecoder( const Mat& buf )
if( buf.rows*buf.cols < 1 || !buf.isContinuous() ) if( buf.rows*buf.cols < 1 || !buf.isContinuous() )
return ImageDecoder(); 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); maxlen = std::max(maxlen, len);
} }
...@@ -101,10 +142,10 @@ static ImageDecoder findDecoder( const Mat& buf ) ...@@ -101,10 +142,10 @@ static ImageDecoder findDecoder( const Mat& buf )
string signature(maxlen, ' '); string signature(maxlen, ' ');
memcpy( &signature[0], buf.data, 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) ) if( codecs.decoders[i]->checkSignature(signature) )
return decoders[i]->newDecoder(); return codecs.decoders[i]->newDecoder();
} }
return ImageDecoder(); return ImageDecoder();
...@@ -122,9 +163,9 @@ static ImageEncoder findEncoder( const string& _ext ) ...@@ -122,9 +163,9 @@ static ImageEncoder findEncoder( const string& _ext )
for( ext++; isalnum(ext[len]) && len < 128; len++ ) 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(), '(' ); const char* descr = strchr( description.c_str(), '(' );
while( descr ) while( descr )
...@@ -141,7 +182,7 @@ static ImageEncoder findEncoder( const string& _ext ) ...@@ -141,7 +182,7 @@ static ImageEncoder findEncoder( const string& _ext )
break; break;
} }
if( j == len && !isalnum(descr[j])) if( j == len && !isalnum(descr[j]))
return encoders[i]->newEncoder(); return codecs.encoders[i]->newEncoder();
descr += j; descr += j;
} }
} }
...@@ -149,48 +190,6 @@ static ImageEncoder findEncoder( const string& _ext ) ...@@ -149,48 +190,6 @@ static ImageEncoder findEncoder( const string& _ext )
return ImageEncoder(); 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 }; enum { LOAD_CVMAT=0, LOAD_IMAGE=1, LOAD_MAT=2 };
static void* static void*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment