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");