@@ -189,7 +189,19 @@ struct ImageCodecInitializer
189
189
std::vector<ImageEncoder> encoders;
190
190
};
191
191
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
+ }
193
205
194
206
/* *
195
207
* Find the decoders
@@ -203,6 +215,7 @@ static ImageDecoder findDecoder( const String& filename ) {
203
215
size_t i, maxlen = 0 ;
204
216
205
217
// / iterate through list of registered codecs
218
+ ImageCodecInitializer& codecs = getCodecs ();
206
219
for ( i = 0 ; i < codecs.decoders .size (); i++ )
207
220
{
208
221
size_t len = codecs.decoders [i]->signatureLength ();
@@ -240,6 +253,7 @@ static ImageDecoder findDecoder( const Mat& buf )
240
253
if ( buf.rows *buf.cols < 1 || !buf.isContinuous () )
241
254
return ImageDecoder ();
242
255
256
+ ImageCodecInitializer& codecs = getCodecs ();
243
257
for ( i = 0 ; i < codecs.decoders .size (); i++ )
244
258
{
245
259
size_t len = codecs.decoders [i]->signatureLength ();
@@ -272,6 +286,7 @@ static ImageEncoder findEncoder( const String& _ext )
272
286
for ( ext++; len < 128 && isalnum (ext[len]); len++ )
273
287
;
274
288
289
+ ImageCodecInitializer& codecs = getCodecs ();
275
290
for ( size_t i = 0 ; i < codecs.encoders .size (); i++ )
276
291
{
277
292
String description = codecs.encoders [i]->getDescription ();
0 commit comments