]> git.sesse.net Git - casparcg/blobdiff - modules/ffmpeg/producer/util.cpp
2.0.1: ffmpeg: Replaced TBB implementation with better Concurrency Runtime based...
[casparcg] / modules / ffmpeg / producer / util.cpp
index 79fae01a8cbb9bcae4b8ed949ff3fe1a8dae64dc..a98c08737f16450882371031dda2d57e2a4c4ee7 100644 (file)
@@ -5,7 +5,7 @@
 #include "format/flv.h"\r
 \r
 #include <tbb/concurrent_unordered_map.h>\r
-#include <tbb/concurrent_queue.h>\r
+#include <concurrent_queue.h>\r
 \r
 #include <core/producer/frame/frame_transform.h>\r
 #include <core/producer/frame/frame_factory.h>\r
@@ -14,7 +14,7 @@
 \r
 #include <common/exception/exceptions.h>\r
 \r
-#include <tbb/parallel_for.h>\r
+#include <ppl.h>\r
 \r
 #include <boost/filesystem.hpp>\r
 #include <boost/lexical_cast.hpp>\r
@@ -127,7 +127,7 @@ int make_alpha_format(int format)
 \r
 safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_ptr<AVFrame>& decoded_frame, const safe_ptr<core::frame_factory>& frame_factory, int hints)\r
 {                      \r
-       static tbb::concurrent_unordered_map<size_t, tbb::concurrent_queue<std::shared_ptr<SwsContext>>> sws_contexts_;\r
+       static tbb::concurrent_unordered_map<size_t, Concurrency::concurrent_queue<std::shared_ptr<SwsContext>>> sws_contexts_;\r
        \r
        const auto width  = decoded_frame->width;\r
        const auto height = decoded_frame->height;\r
@@ -188,12 +188,10 @@ safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_ptr<AVF
                        auto decoded_linesize = decoded_frame->linesize[n];\r
                                \r
                        // Copy line by line since ffmpeg sometimes pads each line.\r
-                       tbb::affinity_partitioner ap;\r
-                       tbb::parallel_for(tbb::blocked_range<size_t>(0, static_cast<int>(desc.planes[n].height)), [&](const tbb::blocked_range<size_t>& r)\r
+                       Concurrency::parallel_for(0, static_cast<int>(desc.planes[n].height), [&](size_t y)\r
                        {\r
-                               for(size_t y = r.begin(); y != r.end(); ++y)\r
-                                       memcpy(result + y*plane.linesize, decoded + y*decoded_linesize, plane.linesize);\r
-                       }, ap);\r
+                               memcpy(result + y*plane.linesize, decoded + y*decoded_linesize, plane.linesize);\r
+                       });\r
 \r
                        write->commit(n);\r
                }\r
@@ -287,4 +285,64 @@ void fix_meta_data(AVFormatContext& context)
        video_context.time_base.den = static_cast<int>(closest_fps*1000000.0);\r
 }\r
 \r
+std::shared_ptr<AVPacket> create_packet()\r
+{\r
+       std::shared_ptr<AVPacket> packet(new AVPacket, [](AVPacket* p)\r
+       {\r
+               av_free_packet(p);\r
+               delete p;\r
+       });\r
+       \r
+       av_init_packet(packet.get());\r
+       return packet;\r
+}\r
+\r
+const std::shared_ptr<AVPacket>& loop_packet()\r
+{\r
+       static auto packet1 = create_packet();\r
+       return packet1;\r
+}\r
+\r
+const std::shared_ptr<AVPacket>& eof_packet()\r
+{\r
+       static auto packet2 = create_packet();\r
+       return packet2;\r
+}\r
+\r
+const std::shared_ptr<AVFrame>& loop_video()\r
+{\r
+       static auto frame1 = std::shared_ptr<AVFrame>(avcodec_alloc_frame(), av_free);\r
+       return frame1;\r
+}\r
+\r
+const std::shared_ptr<AVFrame>& empty_video()\r
+{\r
+       static auto frame1 = std::shared_ptr<AVFrame>(avcodec_alloc_frame(), av_free);\r
+       return frame1;\r
+}\r
+\r
+const std::shared_ptr<AVFrame>& eof_video()\r
+{\r
+       static auto frame2 = std::shared_ptr<AVFrame>(avcodec_alloc_frame(), av_free);\r
+       return frame2;\r
+}\r
+\r
+const std::shared_ptr<core::audio_buffer>& loop_audio()\r
+{\r
+       static auto audio1 = std::make_shared<core::audio_buffer>();\r
+       return audio1;\r
+}\r
+\r
+const std::shared_ptr<core::audio_buffer>& empty_audio()\r
+{\r
+       static auto audio1 = std::make_shared<core::audio_buffer>();\r
+       return audio1;\r
+}\r
+\r
+const std::shared_ptr<core::audio_buffer>& eof_audio()\r
+{\r
+       static auto audio2 = std::make_shared<core::audio_buffer>();\r
+       return audio2;\r
+}\r
+\r
 }}
\ No newline at end of file