From a87d6b098f80140dd86e7d4ea33a31eec797f8bf Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 27 Jun 2017 16:32:32 +0300 Subject: [PATCH] videoio: synchronize ffmpeg open() call --- modules/videoio/src/cap_ffmpeg_impl.hpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/modules/videoio/src/cap_ffmpeg_impl.hpp b/modules/videoio/src/cap_ffmpeg_impl.hpp index fc5141e09a..afe083e523 100644 --- a/modules/videoio/src/cap_ffmpeg_impl.hpp +++ b/modules/videoio/src/cap_ffmpeg_impl.hpp @@ -716,12 +716,25 @@ static int LockCallBack(void **mutex, AVLockOp op) static ImplMutex _mutex; static bool _initialized = false; +class AutoLock +{ +public: + AutoLock(ImplMutex& m) : mutex(&m) { mutex->lock(); } + ~AutoLock() { mutex->unlock(); } +protected: + ImplMutex* mutex; +private: + AutoLock(const AutoLock&); // disabled + AutoLock& operator = (const AutoLock&); // disabled +}; + + class InternalFFMpegRegister { public: InternalFFMpegRegister() { - _mutex.lock(); + AutoLock lock(_mutex); if (!_initialized) { #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 13, 0) @@ -738,7 +751,6 @@ public: _initialized = true; } - _mutex.unlock(); } ~InternalFFMpegRegister() @@ -752,6 +764,7 @@ static InternalFFMpegRegister _init; bool CvCapture_FFMPEG::open( const char* _filename ) { + AutoLock lock(_mutex); unsigned i; bool valid = false;