From 3605352ab9396a593cc7d1a95bcb556d57591e02 Mon Sep 17 00:00:00 2001 From: ronag Date: Thu, 16 Jun 2011 09:35:20 +0000 Subject: [PATCH] 2.0. ffmpeg: Fixed ffmpeg multithreaded codec support. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@898 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- modules/ffmpeg/ffmpeg.cpp | 52 +++++++++++++++++++++++++++++++++++++++ modules/ffmpeg/ffmpeg.h | 1 + shell/casparcg.config | 2 +- shell/server.cpp | 4 ++- 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/modules/ffmpeg/ffmpeg.cpp b/modules/ffmpeg/ffmpeg.cpp index 21490a92d..80d2bb447 100644 --- a/modules/ffmpeg/ffmpeg.cpp +++ b/modules/ffmpeg/ffmpeg.cpp @@ -25,6 +25,8 @@ #include #include +#include + #if defined(_MSC_VER) #pragma warning (disable : 4244) #endif @@ -40,16 +42,66 @@ extern "C" } namespace caspar { + +int ffmpeg_lock_callback(void **mutex, enum AVLockOp op) +{ + static tbb::mutex container_mutex; + static std::vector container; + + if(!mutex) + return 0; + + auto my_mutex = reinterpret_cast(*mutex); + + switch(op) + { + case AV_LOCK_CREATE: + { + tbb::mutex::scoped_lock lock(container_mutex); + container.push_back(tbb::mutex()); + *mutex = &container.back(); + break; + } + case AV_LOCK_OBTAIN: + { + if(my_mutex) + my_mutex->lock(); + break; + } + case AV_LOCK_RELEASE: + { + if(my_mutex) + my_mutex->unlock(); + break; + } + case AV_LOCK_DESTROY: + { + tbb::mutex::scoped_lock lock(container_mutex); + container.erase(std::remove_if(container.begin(), container.end(), [&](const tbb::mutex& m) + { + return &m == my_mutex; + }), container.end()); + break; + } + } + return 0; +} void init_ffmpeg() { av_register_all(); avcodec_init(); + av_lockmgr_register(ffmpeg_lock_callback); core::register_consumer_factory([](const std::vector& params){return create_ffmpeg_consumer(params);}); core::register_producer_factory(create_ffmpeg_producer); } +void uninit_ffmpeg() +{ + av_lockmgr_register(nullptr); +} + std::wstring make_version(unsigned int ver) { std::wstringstream str; diff --git a/modules/ffmpeg/ffmpeg.h b/modules/ffmpeg/ffmpeg.h index f86f09f24..1147dafd5 100644 --- a/modules/ffmpeg/ffmpeg.h +++ b/modules/ffmpeg/ffmpeg.h @@ -22,6 +22,7 @@ namespace caspar { void init_ffmpeg(); +void uninit_ffmpeg(); std::wstring get_avcodec_version(); std::wstring get_avformat_version(); diff --git a/shell/casparcg.config b/shell/casparcg.config index e1a7145f8..7a4d54127 100644 --- a/shell/casparcg.config +++ b/shell/casparcg.config @@ -15,7 +15,7 @@ 1080i5000 - false + true 1 diff --git a/shell/server.cpp b/shell/server.cpp index d094fdf8d..dabcccb92 100644 --- a/shell/server.cpp +++ b/shell/server.cpp @@ -84,7 +84,9 @@ struct server::implementation : boost::noncopyable } ~implementation() - { + { + uninit_ffmpeg(); + async_servers_.clear(); channels_.clear(); } -- 2.39.5