diff --git a/src/media/audio/jack/jacklayer.cpp b/src/media/audio/jack/jacklayer.cpp
index 5692b35b3f5cd25bca8ac45e05cfeece6528619d..f56e8cccd6810e4b933d17a382753577c6df15bb 100644
--- a/src/media/audio/jack/jacklayer.cpp
+++ b/src/media/audio/jack/jacklayer.cpp
@@ -251,7 +251,7 @@ JackLayer::ringbuffer_worker()
             return;
 
         // FIXME this is all kinds of evil
-        usleep(20000);
+        std::this_thread::sleep_for(std::chrono::milliseconds(20));
 
         capture();
         playback();
diff --git a/src/media/media_decoder.cpp b/src/media/media_decoder.cpp
index cd9f5b4a62c673760bae500afda992e47bb1592a..d1a3d71720ff875aa3e817f4792705b53fad2ced 100644
--- a/src/media/media_decoder.cpp
+++ b/src/media/media_decoder.cpp
@@ -324,14 +324,10 @@ MediaDecoder::decode(VideoFrame& result)
         frame->format = (AVPixelFormat) correctPixFmt(frame->format);
         if (emulateRate_ and frame->pkt_pts != AV_NOPTS_VALUE) {
             auto frame_time = getTimeBase()*(frame->pkt_pts - avStream_->start_time);
-            auto target = startTime_ + frame_time.real() * 1000000;
+            auto target = startTime_ + static_cast<std::int64_t>(frame_time.real() * 1e6);
             auto now = av_gettime();
             if (target > now) {
-#if LIBAVUTIL_VERSION_CHECK(51, 34, 0, 61, 100)
-                av_usleep(target - now);
-#else
-                usleep(target - now);
-#endif
+                std::this_thread::sleep_for(std::chrono::milliseconds(target - now));
             }
         }
         return Status::FrameFinished;
@@ -379,14 +375,10 @@ MediaDecoder::decode(const AudioFrame& decodedFrame)
     if (frameFinished) {
         if (emulateRate_ and frame->pkt_pts != AV_NOPTS_VALUE) {
             auto frame_time = getTimeBase()*(frame->pkt_pts - avStream_->start_time);
-            auto target = startTime_ + frame_time.real() * 1000000;
+            auto target = startTime_ + static_cast<std::int64_t>(frame_time.real() * 1e6);
             auto now = av_gettime();
             if (target > now) {
-#if LIBAVUTIL_VERSION_CHECK(51, 34, 0, 61, 100)
-                av_usleep(target - now);
-#else
-                usleep(target - now);
-#endif
+                std::this_thread::sleep_for(std::chrono::milliseconds(target - now));
             }
         }
         return Status::FrameFinished;
diff --git a/src/media/video/test/test_shm.cpp b/src/media/video/test/test_shm.cpp
index 1c3ad804267c29b16dc6bc57537dd000a9263e4d..6512436766293ac985b55b958eccaf099aa6881a 100644
--- a/src/media/video/test/test_shm.cpp
+++ b/src/media/video/test/test_shm.cpp
@@ -49,7 +49,7 @@ sink_thread()
 
     while (!done) {
         sink.render(test_vec);
-        usleep(1000);
+        std::this_thread::sleep_for(std::chrono::milliseconds(1));
     }
     sink.stop();
     std::cerr << std::endl;
@@ -77,7 +77,7 @@ run_client()
     assert(dest.size() == test_data_str.size());
     while (not done and dest != test_data_str) {
         src.render(dest.data(), dest.size());
-        usleep(1000);
+        std::this_thread::sleep_for(std::chrono::milliseconds(1));
     }
     src.stop();
     std::cerr << "Got characters, exitting client process" << std::endl;
diff --git a/src/media/video/test/test_video_input.cpp b/src/media/video/test/test_video_input.cpp
index 5f7a57c4cc7afaff618aa1e2a07d146fbf755c94..732a0621d6088aa3ea20c8db183fbe28966339f0 100644
--- a/src/media/video/test/test_video_input.cpp
+++ b/src/media/video/test/test_video_input.cpp
@@ -18,7 +18,6 @@
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
  */
 
-#include <unistd.h> // for sleep
 #include "test_video_input.h"
 #include "video_input.h"
 #include "media_const.h"
@@ -33,7 +32,7 @@ void VideoInputTest::testInput()
     std::string resource = DRing::Media::VideoProtocolPrefix::DISPLAY + sep + std::string(getenv("DISPLAY") ? : ":0.0");
     VideoInput video;
     video.switchInput(resource);
-    usleep(10000);
+    std::this_thread::sleep_for(std::chrono::milliseconds(10));
 }
 
 }}} // namespace ring::video::test
diff --git a/src/media/video/video_mixer.cpp b/src/media/video/video_mixer.cpp
index 78a56d5f4b49b09e5346b9117b3c4b6d1efc947c..48c914df325fdfe1ce43e2855513feff52cb575d 100644
--- a/src/media/video/video_mixer.cpp
+++ b/src/media/video/video_mixer.cpp
@@ -44,7 +44,7 @@ private:
     std::mutex mutex_;
 };
 
-static constexpr const double FRAME_DURATION = 1/30.;
+static constexpr const auto FRAME_DURATION = std::chrono::duration<double>(1/30.);
 
 VideoMixer::VideoMixer(const std::string& id)
     : VideoGenerator::VideoGenerator()
@@ -122,10 +122,10 @@ void
 VideoMixer::process()
 {
     const auto now = std::chrono::system_clock::now();
-    const std::chrono::duration<double> diff = now - lastProcess_;
-    const double delay = FRAME_DURATION - diff.count();
-    if (delay > 0)
-        usleep(delay * 1e6);
+    const auto diff = now - lastProcess_;
+    const auto delay = FRAME_DURATION - diff;
+    if (delay.count() > 0)
+        std::this_thread::sleep_for(delay);
     lastProcess_ = now;
 
     VideoFrame& output = getNewFrame();