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);
+}