]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 29 Nov 2011 20:02:58 +0000 (20:02 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 29 Nov 2011 20:02:58 +0000 (20:02 +0000)
core/consumer/output.cpp

index ff16c280e9ca763800715bc679b17aac77d8f6c9..f2c6c559594c50fb99e34ab8846343913ce26344 100644 (file)
 \r
 #include <boost/circular_buffer.hpp>\r
 #include <boost/timer.hpp>\r
+#include <boost/range/algorithm.hpp>\r
+#include <boost/range/adaptors.hpp>\r
 \r
 namespace caspar { namespace core {\r
        \r
 struct output::implementation\r
-{      \r
-       typedef std::pair<safe_ptr<read_frame>, safe_ptr<read_frame>> fill_and_key;\r
-       \r
-       const int                                               channel_index_;\r
-       safe_ptr<diagnostics::graph>    graph_;\r
-       boost::timer                                    consume_timer_;\r
+{              \r
+       const int                                                                               channel_index_;\r
+       const safe_ptr<diagnostics::graph>                              graph_;\r
+       boost::timer                                                                    consume_timer_;\r
 \r
-       video_format_desc                               format_desc_;\r
+       video_format_desc                                                               format_desc_;\r
 \r
-       std::map<int, safe_ptr<frame_consumer>> consumers_;\r
-       typedef std::map<int, safe_ptr<frame_consumer>>::value_type layer_t;\r
+       std::map<int, safe_ptr<frame_consumer>>                 consumers_;\r
        \r
-       high_prec_timer timer_;\r
-\r
-       boost::circular_buffer<safe_ptr<read_frame>> frames_;\r
+       high_prec_timer                                                                 sync_timer_;\r
 \r
-       tbb::concurrent_bounded_queue<std::shared_ptr<read_frame>> input_;\r
+       boost::circular_buffer<safe_ptr<read_frame>>    frames_;\r
 \r
-       executor executor_;\r
+       executor                                                                                executor_;\r
                \r
 public:\r
        implementation(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc, int channel_index) \r
@@ -77,7 +74,7 @@ public:
                executor_.invoke([&]\r
                {\r
                        consumers_.erase(index);\r
-               });\r
+               }, high_priority);\r
 \r
                consumer = create_consumer_cadence_guard(std::move(consumer));\r
                consumer->initialize(format_desc_, channel_index_, index);\r
@@ -87,7 +84,7 @@ public:
                        consumers_.insert(std::make_pair(index, consumer));\r
 \r
                        CASPAR_LOG(info) << print() << L" " << consumer->print() << L" Added.";\r
-               });\r
+               }, high_priority);\r
        }\r
 \r
        void remove(int index)\r
@@ -97,18 +94,16 @@ public:
                        auto it = consumers_.find(index);\r
                        if(it != consumers_.end())\r
                        {\r
-                               CASPAR_LOG(info) << print() << L" " << it->second->print() << L" Removed.";\r
                                consumers_.erase(it);\r
+                               CASPAR_LOG(info) << print() << L" " << it->second->print() << L" Removed.";\r
                        }\r
-               });\r
+               }, high_priority);\r
        }\r
        \r
        void set_video_format_desc(const video_format_desc& format_desc)\r
        {\r
                executor_.invoke([&]\r
                {\r
-                       format_desc_ = format_desc;\r
-\r
                        auto it = consumers_.begin();\r
                        while(it != consumers_.end())\r
                        {                                               \r
@@ -123,24 +118,28 @@ public:
                                        consumers_.erase(it++);\r
                                }\r
                        }\r
-\r
+                       \r
+                       format_desc_ = format_desc;\r
                        frames_.clear();\r
                });\r
        }\r
-                       \r
+\r
        std::pair<size_t, size_t> minmax_buffer_depth() const\r
        {               \r
                if(consumers_.empty())\r
                        return std::make_pair(0, 0);\r
-               std::vector<size_t> buffer_depths;\r
-               std::transform(consumers_.begin(), consumers_.end(), std::back_inserter(buffer_depths), [](const decltype(*consumers_.begin())& pair)\r
-               {\r
-                       return pair.second->buffer_depth();\r
-               });\r
-               std::sort(buffer_depths.begin(), buffer_depths.end());\r
-               auto min = buffer_depths.front();\r
-               auto max = buffer_depths.back();\r
-               return std::make_pair(min, max);\r
+               \r
+               auto buffer_depths = consumers_ | \r
+                                                        boost::adaptors::map_values | // std::function is MSVC workaround\r
+                                                        boost::adaptors::transformed(std::function<int(const safe_ptr<frame_consumer>&)>([](const safe_ptr<frame_consumer>& x){return x->buffer_depth();})); \r
+               \r
+\r
+               return std::make_pair(*boost::range::min_element(buffer_depths), *boost::range::max_element(buffer_depths));\r
+       }\r
+\r
+       bool has_synchronization_clock() const\r
+       {\r
+               return boost::range::count_if(consumers_ | boost::adaptors::map_values, [](const safe_ptr<frame_consumer>& x){return x->has_synchronization_clock();}) > 0;\r
        }\r
 \r
        void send(const std::pair<safe_ptr<read_frame>, std::shared_ptr<void>>& packet)\r
@@ -154,15 +153,15 @@ public:
                                auto input_frame = packet.first;\r
 \r
                                if(!has_synchronization_clock())\r
-                                       timer_.tick(1.0/format_desc_.fps);\r
+                                       sync_timer_.tick(1.0/format_desc_.fps);\r
 \r
                                if(input_frame->image_size() != format_desc_.size)\r
                                {\r
-                                       timer_.tick(1.0/format_desc_.fps);\r
+                                       sync_timer_.tick(1.0/format_desc_.fps);\r
                                        return;\r
                                }\r
                                        \r
-                               const auto minmax = minmax_buffer_depth();\r
+                               auto minmax = minmax_buffer_depth();\r
 \r
                                frames_.set_capacity(minmax.second - minmax.first + 1);\r
                                frames_.push_back(input_frame);\r
@@ -212,19 +211,9 @@ public:
                });\r
        }\r
 \r
-private:\r
-       \r
-       bool has_synchronization_clock()\r
-       {\r
-               return std::any_of(consumers_.begin(), consumers_.end(), [](const decltype(*consumers_.begin())& p)\r
-               {\r
-                       return p.second->has_synchronization_clock();\r
-               });\r
-       }\r
-       \r
        std::wstring print() const\r
        {\r
-               return L"output";\r
+               return L"output[" + boost::lexical_cast<std::wstring>(channel_index_) + L"]";\r
        }\r
 };\r
 \r