diff --git a/configure.ac b/configure.ac
index b117399a593576a17b8c96eb1cb2ac6d795c7d83..62a55ef5a74b4f0f982152e19288f0cfef4d138b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -425,29 +425,16 @@ AS_IF([test "x$with_restcpp" = "xyes"], [
 );
 
 dnl Check for libav
-AS_IF([test "${SYS}" = "darwin"], [
-    PKG_CHECK_MODULES(LIBAVUTIL, libavutil >= 55.58.100,, AC_MSG_ERROR([Missing libavutil development files]))
+PKG_CHECK_MODULES(LIBAVUTIL, libavutil >= 55.75.100,, AC_MSG_ERROR([Missing libavutil development files]))
 
-    PKG_CHECK_MODULES(LIBAVCODEC, libavcodec >= 53.89.100,, AC_MSG_ERROR([Missing libavcodec development files]))
-    LIBAVCODEC_CFLAGS="${LIBAVCODEC_CFLAGS} -D__STDC_CONSTANT_MACROS"
+PKG_CHECK_MODULES(LIBAVCODEC, libavcodec >= 53.106.101,, AC_MSG_ERROR([Missing libavcodec development files]))
+LIBAVCODEC_CFLAGS="${LIBAVCODEC_CFLAGS} -D__STDC_CONSTANT_MACROS"
 
-    PKG_CHECK_MODULES(LIBAVFORMAT, libavformat >= 57.71.100,, AC_MSG_ERROR([Missing libavformat development files]))
+PKG_CHECK_MODULES(LIBAVFORMAT, libavformat >= 57.81.100,, AC_MSG_ERROR([Missing libavformat development files]))
 
-    PKG_CHECK_MODULES(LIBAVDEVICE, libavdevice >= 57.6.100,, AC_MSG_ERROR([Missing libavdevice development files]))
+PKG_CHECK_MODULES(LIBAVDEVICE, libavdevice >= 57.8.101,, AC_MSG_ERROR([Missing libavdevice development files]))
 
-    PKG_CHECK_MODULES(LIBSWSCALE, libswscale >= 4.6.100,, AC_MSG_ERROR([Missing libswscale development files]))
-],[
-    PKG_CHECK_MODULES(LIBAVUTIL, libavutil >= 55.75.100,, AC_MSG_ERROR([Missing libavutil development files]))
-
-    PKG_CHECK_MODULES(LIBAVCODEC, libavcodec >= 53.106.101,, AC_MSG_ERROR([Missing libavcodec development files]))
-    LIBAVCODEC_CFLAGS="${LIBAVCODEC_CFLAGS} -D__STDC_CONSTANT_MACROS"
-
-    PKG_CHECK_MODULES(LIBAVFORMAT, libavformat >= 57.81.100,, AC_MSG_ERROR([Missing libavformat development files]))
-
-    PKG_CHECK_MODULES(LIBAVDEVICE, libavdevice >= 57.8.101,, AC_MSG_ERROR([Missing libavdevice development files]))
-
-    PKG_CHECK_MODULES(LIBSWSCALE, libswscale >= 4.7.103,, AC_MSG_ERROR([Missing libswscale development files]))
-]);
+PKG_CHECK_MODULES(LIBSWSCALE, libswscale >= 4.7.103,, AC_MSG_ERROR([Missing libswscale development files]))
 
 dnl Video is default-enabled
 AC_ARG_ENABLE([video], AS_HELP_STRING([--disable-video], [Disable video]))
diff --git a/contrib/src/ffmpeg/rules.mak b/contrib/src/ffmpeg/rules.mak
index e86403e2567f1d9bbf5697c81cb52d88ae2807a4..fbe1e581e8da5eaf8c3929d096c77af04dbcdf2e 100644
--- a/contrib/src/ffmpeg/rules.mak
+++ b/contrib/src/ffmpeg/rules.mak
@@ -1,8 +1,4 @@
-ifndef HAVE_MACOSX
 FFMPEG_HASH := 18516d3e695980525bd9758dc7b8a8e36cd3f09e
-else
-FFMPEG_HASH := n3.3.3
-endif
 FFMPEG_URL := https://git.ffmpeg.org/gitweb/ffmpeg.git/snapshot/$(FFMPEG_HASH).tar.gz
 
 PKGS+=ffmpeg
@@ -24,6 +20,7 @@ FFMPEGCONF += \
 	--enable-gpl \
 	--enable-swscale \
 	--enable-protocols \
+	--enable-bsfs \
 	--disable-programs
 
 #enable muxers/demuxers
@@ -136,7 +133,7 @@ endif
 
 ifdef HAVE_MACOSX
 FFMPEGCONF += \
-	--disable-sdl \
+	--enable-avfoundation \
 	--enable-indev=avfoundation \
 	--enable-videotoolbox \
 	--enable-hwaccel=h263_videotoolbox \
diff --git a/src/media/video/osxvideo/videotoolbox.h b/src/media/video/osxvideo/videotoolbox.h
index a006f70abbd5ba9ba5d0bc33bacb907c14e61aa2..90ea36031050aff04d0d4e5c269a1b0501694789 100644
--- a/src/media/video/osxvideo/videotoolbox.h
+++ b/src/media/video/osxvideo/videotoolbox.h
@@ -28,6 +28,7 @@
 
 extern "C" {
 #include <libavcodec/avcodec.h>
+#include <libavutil/hwcontext.h>
 #include <libavcodec/videotoolbox.h>
 #include <libavutil/imgutils.h>
 }
@@ -48,6 +49,10 @@ class VideoToolboxAccel : public HardwareAccel {
         bool init() override;
         int allocateBuffer(AVFrame* frame, int flags) override;
         void extractData(VideoFrame& input, VideoFrame& output) override;
+
+    private:
+        using AVBufferRefPtr = std::unique_ptr<AVBufferRef, std::function<void(AVBufferRef*)>>;
+        AVBufferRefPtr deviceBufferRef_;
 };
 
 }} // namespace ring::video
diff --git a/src/media/video/osxvideo/videotoolbox.mm b/src/media/video/osxvideo/videotoolbox.mm
index 2316154ec22982a5c68c6000a95552768b94babc..ab058d772a9a315b759254ad955c85d82fae452c 100644
--- a/src/media/video/osxvideo/videotoolbox.mm
+++ b/src/media/video/osxvideo/videotoolbox.mm
@@ -35,8 +35,11 @@
 
 namespace ring { namespace video {
 
+static auto avBufferRefDeleter = [](AVBufferRef* buf){ av_buffer_unref(&buf); };
+
 VideoToolboxAccel::VideoToolboxAccel(const std::string name, const AVPixelFormat format)
     : HardwareAccel(name, format)
+    , deviceBufferRef_(nullptr, avBufferRefDeleter)
 {
 }
 
@@ -127,9 +130,14 @@ VideoToolboxAccel::extractData(VideoFrame& input, VideoFrame& output)
 bool
 VideoToolboxAccel::checkAvailability()
 {
-    // VideoToolbox is always present on Mac 10.8+ and iOS 8+
-    // VDA is always present on Mac 10.6.3+
-    return true;
+    AVBufferRef* hardwareDeviceCtx;
+    if (av_hwdevice_ctx_create(&hardwareDeviceCtx, AV_HWDEVICE_TYPE_VIDEOTOOLBOX, nullptr, nullptr, 0) == 0) {
+        deviceBufferRef_.reset(hardwareDeviceCtx);
+        return true;
+    }
+
+    av_buffer_unref(&hardwareDeviceCtx);
+    return false;
 }
 
 bool
@@ -137,6 +145,7 @@ VideoToolboxAccel::init()
 {
     if (av_videotoolbox_default_init(codecCtx_) >= 0) {
         RING_DBG("VideoToolbox decoder initialized");
+        codecCtx_->hw_device_ctx = av_buffer_ref(deviceBufferRef_.get());
         return true;
     } else {
         RING_ERR("Failed to initialize VideoToolbox decoder");