diff --git a/daemon/src/video/libav_utils.cpp b/daemon/src/video/libav_utils.cpp
index d97eccd11d3d57d501b073b573493306dedb0160..261fe46d800229190f39358ab9300aba3aad2fbf 100644
--- a/daemon/src/video/libav_utils.cpp
+++ b/daemon/src/video/libav_utils.cpp
@@ -38,6 +38,9 @@
 #include <algorithm>
 #include <string>
 #include <iostream>
+#include <thread>
+#include <mutex>
+#include <exception>
 
 std::map<std::string, std::string> encoders_;
 std::vector<std::string> installed_video_codecs_;
@@ -68,28 +71,29 @@ std::vector<std::string> getVideoCodecList()
     return installed_video_codecs_;
 }
 
-// protect libav/ffmpeg access with pthreads
+// protect libav/ffmpeg access
 static int
 avcodecManageMutex(void **data, enum AVLockOp op)
 {
-    pthread_mutex_t **mutex = reinterpret_cast<pthread_mutex_t**>(data);
+    auto mutex = reinterpret_cast<std::mutex**>(data);
     int ret = 0;
     switch (op) {
         case AV_LOCK_CREATE:
-            *mutex = static_cast<pthread_mutex_t*>(av_malloc(sizeof(pthread_mutex_t)));
-            if (!*mutex)
+            try {
+                *mutex = new std::mutex;
+            } catch (const std::bad_alloc& e) {
                 return AVERROR(ENOMEM);
-            ret = pthread_mutex_init(*mutex, NULL);
+            }
             break;
         case AV_LOCK_OBTAIN:
-            ret = pthread_mutex_lock(*mutex);
+            (*mutex)->lock();
             break;
         case AV_LOCK_RELEASE:
-            ret = pthread_mutex_unlock(*mutex);
+            (*mutex)->unlock();
             break;
         case AV_LOCK_DESTROY:
-            ret = pthread_mutex_destroy(*mutex);
-            av_freep(mutex);
+            delete *mutex;
+            *mutex = nullptr;
             break;
         default:
 #ifdef AVERROR_BUG
@@ -145,11 +149,11 @@ static void init_once()
     findInstalledVideoCodecs();
 }
 
-static pthread_once_t already_called = PTHREAD_ONCE_INIT;
+static std::once_flag already_called;
 
 void sfl_avcodec_init()
 {
-    (void) pthread_once(&already_called, init_once);
+    std::call_once(already_called, init_once);
 }
 
 std::vector<std::map<std::string, std::string> >