Skip to content

Commit 7dfe68c

Browse files
committed
imgcodecs: lazy on-demand codecs initialization
1 parent 03bee14 commit 7dfe68c

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

modules/imgcodecs/src/loadsave.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,19 @@ struct ImageCodecInitializer
189189
std::vector<ImageEncoder> encoders;
190190
};
191191

192-
static ImageCodecInitializer codecs;
192+
static
193+
ImageCodecInitializer& getCodecs()
194+
{
195+
#ifdef CV_CXX11
196+
static ImageCodecInitializer g_codecs;
197+
return g_codecs;
198+
#else
199+
// C++98 doesn't guarantee correctness of multi-threaded initialization of static global variables
200+
// (memory leak here is not critical, use C++11 to avoid that)
201+
static ImageCodecInitializer* g_codecs = new ImageCodecInitializer();
202+
return *g_codecs;
203+
#endif
204+
}
193205

194206
/**
195207
* Find the decoders
@@ -203,6 +215,7 @@ static ImageDecoder findDecoder( const String& filename ) {
203215
size_t i, maxlen = 0;
204216

205217
/// iterate through list of registered codecs
218+
ImageCodecInitializer& codecs = getCodecs();
206219
for( i = 0; i < codecs.decoders.size(); i++ )
207220
{
208221
size_t len = codecs.decoders[i]->signatureLength();
@@ -240,6 +253,7 @@ static ImageDecoder findDecoder( const Mat& buf )
240253
if( buf.rows*buf.cols < 1 || !buf.isContinuous() )
241254
return ImageDecoder();
242255

256+
ImageCodecInitializer& codecs = getCodecs();
243257
for( i = 0; i < codecs.decoders.size(); i++ )
244258
{
245259
size_t len = codecs.decoders[i]->signatureLength();
@@ -272,6 +286,7 @@ static ImageEncoder findEncoder( const String& _ext )
272286
for( ext++; len < 128 && isalnum(ext[len]); len++ )
273287
;
274288

289+
ImageCodecInitializer& codecs = getCodecs();
275290
for( size_t i = 0; i < codecs.encoders.size(); i++ )
276291
{
277292
String description = codecs.encoders[i]->getDescription();

0 commit comments

Comments
 (0)