Commit c919513d2649882f3fc90bae9a1d68d06eee01f8

Authored by Charles Otto
1 parent eb9a51b0

Use a mutex when opening videos in stream, this appears to not be thread safe on windows.

Showing 1 changed file with 7 additions and 1 deletions
openbr/plugins/stream.cpp
@@ -364,6 +364,7 @@ protected: @@ -364,6 +364,7 @@ protected:
364 QMutex last_frame_update; 364 QMutex last_frame_update;
365 }; 365 };
366 366
  367 +static QMutex openLock;
367 // Read a video frame by frame using cv::VideoCapture 368 // Read a video frame by frame using cv::VideoCapture
368 class VideoDataSource : public DataSource 369 class VideoDataSource : public DataSource
369 { 370 {
@@ -396,6 +397,8 @@ public: @@ -396,6 +397,8 @@ public:
396 // Yes, we should specify absolute path: 397 // Yes, we should specify absolute path:
397 // http://stackoverflow.com/questions/9396459/loading-a-video-in-opencv-in-python 398 // http://stackoverflow.com/questions/9396459/loading-a-video-in-opencv-in-python
398 QString fileName = (Globals->path.isEmpty() ? "" : Globals->path + "/") + input.file.name; 399 QString fileName = (Globals->path.isEmpty() ? "" : Globals->path + "/") + input.file.name;
  400 + // On windows, this appears to not be thread-safe
  401 + QMutexLocker lock(&openLock);
399 video.open(QFileInfo(fileName).absoluteFilePath().toStdString()); 402 video.open(QFileInfo(fileName).absoluteFilePath().toStdString());
400 } 403 }
401 404
@@ -1057,7 +1060,10 @@ public: @@ -1057,7 +1060,10 @@ public:
1057 dst = src; 1060 dst = src;
1058 1061
1059 bool res = readStage->dataSource.open(dst); 1062 bool res = readStage->dataSource.open(dst);
1060 - if (!res) return; 1063 + if (!res) {
  1064 + qDebug("stream failed to open %s", qPrintable(dst[0].file.name));
  1065 + return;
  1066 + }
1061 1067
1062 // Start the first thread in the stream. 1068 // Start the first thread in the stream.
1063 QWriteLocker lock(&readStage->statusLock); 1069 QWriteLocker lock(&readStage->statusLock);