diff --git a/include/ReaderBase.h b/include/ReaderBase.h index a51fa4b2..e4f89dae 100644 --- a/include/ReaderBase.h +++ b/include/ReaderBase.h @@ -88,6 +88,8 @@ namespace openshot */ class ReaderBase { + CriticalSection getFrameCriticalSection; + public: /// Information about the current media file ReaderInfo info; @@ -106,6 +108,9 @@ namespace openshot /// @param[in] number The frame number that is requested. virtual tr1::shared_ptr GetFrame(int number) = 0; + /// A thread safe version of GetFrame. + tr1::shared_ptr GetFrameSafe(int number); + /// Test method to draw a bitmap on a Qt QGraphicsScene void DrawFrameOnScene(string path, long _graphics_scene_address); diff --git a/src/AudioReaderSource.cpp b/src/AudioReaderSource.cpp index 8ca29b5e..d141ec70 100644 --- a/src/AudioReaderSource.cpp +++ b/src/AudioReaderSource.cpp @@ -82,7 +82,7 @@ void AudioReaderSource::GetMoreSamplesFromReader() { if (frame_position == 0) { try { // Get frame object - frame = reader->GetFrame(frame_number++); + frame = reader->GetFrameSafe(frame_number++); } catch (const ReaderClosed & e) { break; diff --git a/src/Qt/PlayerPrivate.cpp b/src/Qt/PlayerPrivate.cpp index 2a44f88f..7ff89e8f 100644 --- a/src/Qt/PlayerPrivate.cpp +++ b/src/Qt/PlayerPrivate.cpp @@ -90,7 +90,7 @@ namespace openshot tr1::shared_ptr PlayerPrivate::getFrame() { try { - return reader->GetFrame(position++); + return reader->GetFrameSafe(position++); } catch (const ReaderClosed & e) { // ... } catch (const TooManySeeks & e) { diff --git a/src/ReaderBase.cpp b/src/ReaderBase.cpp index ba84a21a..11234478 100644 --- a/src/ReaderBase.cpp +++ b/src/ReaderBase.cpp @@ -215,5 +215,8 @@ void ReaderBase::DrawFrameOnScene(string path, long _graphics_scene_address) { } - - +tr1::shared_ptr ReaderBase::GetFrameSafe(int number) +{ + const GenericScopedLock lock(getFrameCriticalSection); + return GetFrame(number); +}