Commit d88bbb3d authored by Marina Kolpakova's avatar Marina Kolpakova

fixed undefined behaviour in image codecs initialization

parent 8c9a9f1c
......@@ -54,15 +54,56 @@
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*
......
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