]> git.sesse.net Git - casparcg/commitdiff
2.0. ffmpeg: Fixed ffmpeg multithreaded codec support.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 16 Jun 2011 09:35:20 +0000 (09:35 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 16 Jun 2011 09:35:20 +0000 (09:35 +0000)
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
modules/ffmpeg/ffmpeg.h
shell/casparcg.config
shell/server.cpp

index 21490a92d500eab86a191e7e7ffa527e76ccbd3c..80d2bb447d8507cce86c9ad1702fa34602a263bb 100644 (file)
@@ -25,6 +25,8 @@
 #include <core/consumer/frame_consumer.h>\r
 #include <core/producer/frame_producer.h>\r
 \r
+#include <tbb/mutex.h>\r
+\r
 #if defined(_MSC_VER)\r
 #pragma warning (disable : 4244)\r
 #endif\r
@@ -40,16 +42,66 @@ extern "C"
 }\r
 \r
 namespace caspar {\r
+       \r
+int ffmpeg_lock_callback(void **mutex, enum AVLockOp op) \r
+{ \r
+       static tbb::mutex                               container_mutex;\r
+       static std::vector<tbb::mutex>  container; \r
+\r
+       if(!mutex)\r
+               return 0;\r
+\r
+       auto my_mutex = reinterpret_cast<tbb::mutex*>(*mutex);\r
+       \r
+       switch(op) \r
+       { \r
+               case AV_LOCK_CREATE: \r
+               { \r
+                       tbb::mutex::scoped_lock lock(container_mutex);\r
+                       container.push_back(tbb::mutex());\r
+                       *mutex = &container.back(); \r
+                       break; \r
+               } \r
+               case AV_LOCK_OBTAIN: \r
+               { \r
+                       if(my_mutex)\r
+                               my_mutex->lock(); \r
+                       break; \r
+               } \r
+               case AV_LOCK_RELEASE: \r
+               { \r
+                       if(my_mutex)\r
+                               my_mutex->unlock(); \r
+                       break; \r
+               } \r
+               case AV_LOCK_DESTROY: \r
+               { \r
+                       tbb::mutex::scoped_lock lock(container_mutex);\r
+                       container.erase(std::remove_if(container.begin(), container.end(), [&](const tbb::mutex& m)\r
+                       {\r
+                               return &m == my_mutex;\r
+                       }), container.end());\r
+                       break; \r
+               } \r
+       } \r
+       return 0; \r
+} \r
 \r
 void init_ffmpeg()\r
 {\r
        av_register_all();\r
        avcodec_init();\r
+       av_lockmgr_register(ffmpeg_lock_callback);\r
        \r
        core::register_consumer_factory([](const std::vector<std::wstring>& params){return create_ffmpeg_consumer(params);});\r
        core::register_producer_factory(create_ffmpeg_producer);\r
 }\r
 \r
+void uninit_ffmpeg()\r
+{\r
+       av_lockmgr_register(nullptr);\r
+}\r
+\r
 std::wstring make_version(unsigned int ver)\r
 {\r
        std::wstringstream str;\r
index f86f09f24d85c0618da6b8c0a4800aaa5eaf36ba..1147dafd510997a1d576be409d48f5c5d4ec572c 100644 (file)
@@ -22,6 +22,7 @@
 namespace caspar {\r
 \r
 void init_ffmpeg();\r
+void uninit_ffmpeg();\r
 \r
 std::wstring get_avcodec_version();\r
 std::wstring get_avformat_version();\r
index e1a7145f8d48682e0050e0ffd12be645c170ed61..7a4d541272e0e025745f0ab2d0fb9e40902143fa 100644 (file)
@@ -15,7 +15,7 @@
       <video-mode>1080i5000</video-mode>\r
       <consumers>\r
         <decklink>\r
-          <embedded-audio>false</embedded-audio>\r
+          <embedded-audio>true</embedded-audio>\r
           <device>1</device>                      \r
         </decklink>\r
       </consumers>\r
index d094fdf8dfb7b84d7ab3af754d69994099c5d498..dabcccb921e48c49b2cb5e6d47327b91106df0e8 100644 (file)
@@ -84,7 +84,9 @@ struct server::implementation : boost::noncopyable
        }\r
 \r
        ~implementation()\r
-       {                               \r
+       {               \r
+               uninit_ffmpeg();\r
+\r
                async_servers_.clear();\r
                channels_.clear();\r
        }\r