]> git.sesse.net Git - casparcg/commitdiff
2.1.0: Added link_target to stage an mixer to prepare for rerouting feature.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 15 Dec 2011 09:57:25 +0000 (09:57 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 15 Dec 2011 09:57:25 +0000 (09:57 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.1.0@1893 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

15 files changed:
common/memory/safe_ptr.h
core/core.vcxproj.filters
core/mixer/mixer.cpp
core/mixer/mixer.h
core/producer/color/color_producer.cpp
core/producer/color/color_producer.h
core/producer/playlist/playlist_producer.cpp
core/producer/playlist/playlist_producer.h
core/producer/separated/separated_producer.cpp
core/producer/separated/separated_producer.h
core/producer/stage.cpp
core/producer/stage.h
core/producer/transition/transition_producer.cpp
core/producer/transition/transition_producer.h
core/video_channel.cpp

index c30fbf9de02210a52f5cd593d04381d955c6d6c7..46f43d36639755d539f73ab3fefab7c4f6631e05 100644 (file)
@@ -136,15 +136,17 @@ public:
     { \r
         p_.swap(other.p_); \r
     } \r
-\r
-    operator std::shared_ptr<T>() const \r
+       \r
+       template<typename U>\r
+    operator std::shared_ptr<U>() const \r
     { \r
         return p_;\r
     }\r
 \r
-    operator std::weak_ptr<T>() const \r
+       template<typename U>\r
+    operator std::weak_ptr<U>() const \r
     { \r
-        return std::weak_ptr<T>(p_);\r
+        return std::weak_ptr<U>(p_);\r
     }\r
     \r
     template<class U>\r
index ed801f84f64b2fec2e78b86a95498231858832b5..a14d4f50caffaa0f6e020868be30800f849bed46 100644 (file)
@@ -40,6 +40,9 @@
     <Filter Include="source\mixer\image\shader">\r
       <UniqueIdentifier>{e0a140f8-e217-465c-a934-163b7ea786be}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="source\producer\reroute">\r
+      <UniqueIdentifier>{e5def302-a2b5-4e1f-8565-d6ef3927b31f}</UniqueIdentifier>\r
+    </Filter>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="producer\transition\transition_producer.h">\r
index 227053f78b5eea42a614c786d99b9b985b116aae..8dd6627a2093a1e1727884ef8e56909730ca3256 100644 (file)
 #include <boost/foreach.hpp>\r
 #include <boost/timer.hpp>\r
 #include <boost/property_tree/ptree.hpp>\r
+#include <boost/range/algorithm_ext.hpp>\r
 \r
 #include <tbb/concurrent_queue.h>\r
 #include <tbb/spin_mutex.h>\r
 \r
 #include <unordered_map>\r
+#include <vector>\r
 \r
 namespace caspar { namespace core {\r
                \r
 struct mixer::implementation : boost::noncopyable\r
 {              \r
-       safe_ptr<diagnostics::graph>    graph_;\r
-       boost::timer                                    mix_timer_;\r
+       safe_ptr<diagnostics::graph>                            graph_;\r
+       boost::timer                                                            mix_timer_;\r
+       \r
+       std::list<std::weak_ptr<mixer::target_t>>       targets_;\r
 \r
-       safe_ptr<mixer::target_t>               target_;\r
-       mutable tbb::spin_mutex                 format_desc_mutex_;\r
-       video_format_desc                               format_desc_;\r
-       safe_ptr<ogl_device>                    ogl_;\r
+       mutable tbb::spin_mutex                                         format_desc_mutex_;\r
+       video_format_desc                                                       format_desc_;\r
+       safe_ptr<ogl_device>                                            ogl_;\r
        \r
-       audio_mixer     audio_mixer_;\r
-       image_mixer image_mixer_;\r
+       audio_mixer                                                                     audio_mixer_;\r
+       image_mixer                                                                     image_mixer_;\r
        \r
-       std::unordered_map<int, blend_mode::type> blend_modes_;\r
+       std::unordered_map<int, blend_mode::type>       blend_modes_;\r
                        \r
        executor executor_;\r
 \r
 public:\r
-       implementation(const safe_ptr<diagnostics::graph>& graph, const safe_ptr<mixer::target_t>& target, const video_format_desc& format_desc, const safe_ptr<ogl_device>& ogl) \r
+       implementation(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc, const safe_ptr<ogl_device>& ogl) \r
                : graph_(graph)\r
-               , target_(target)\r
                , format_desc_(format_desc)\r
                , ogl_(ogl)\r
                , image_mixer_(ogl)\r
@@ -111,8 +113,14 @@ public:
                                image.wait();\r
 \r
                                graph_->set_value("mix-time", mix_timer_.elapsed()*format_desc_.fps*0.5);\r
+                               \r
+                               boost::range::remove_erase_if(targets_, [](const std::weak_ptr<target_t>& target)\r
+                               {\r
+                                       return target.lock() == nullptr;\r
+                               });\r
 \r
-                               target_->send(std::make_pair(make_safe<read_frame>(ogl_, format_desc_.width, format_desc_.height, std::move(image.get()), std::move(audio)), packet.second));                                   \r
+                               BOOST_FOREACH(auto target, targets_)\r
+                                       target.lock()->send(std::make_pair(make_safe<read_frame>(ogl_, format_desc_.width, format_desc_.height, std::move(image.get()), std::move(audio)), packet.second));     \r
                        }\r
                        catch(...)\r
                        {\r
@@ -120,6 +128,14 @@ public:
                        }       \r
                });             \r
        }\r
+       \r
+       void link_target(const std::weak_ptr<mixer::target_t>& target)\r
+       {\r
+               executor_.begin_invoke([=]\r
+               {\r
+                       targets_.push_back(target);\r
+               }, high_priority);\r
+       }\r
                                        \r
        safe_ptr<core::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc)\r
        {               \r
@@ -157,9 +173,10 @@ public:
        }\r
 };\r
        \r
-mixer::mixer(const safe_ptr<diagnostics::graph>& graph, const safe_ptr<target_t>& target, const video_format_desc& format_desc, const safe_ptr<ogl_device>& ogl) \r
-       : impl_(new implementation(graph, target, format_desc, ogl)){}\r
+mixer::mixer(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc, const safe_ptr<ogl_device>& ogl) \r
+       : impl_(new implementation(graph, format_desc, ogl)){}\r
 void mixer::send(const std::pair<std::map<int, safe_ptr<core::basic_frame>>, std::shared_ptr<void>>& frames){ impl_->send(frames);}\r
+void mixer::link_target(const std::weak_ptr<target_t>& target){impl_->link_target(target);}\r
 core::video_format_desc mixer::get_video_format_desc() const { return impl_->get_video_format_desc(); }\r
 safe_ptr<core::write_frame> mixer::create_frame(const void* tag, const core::pixel_format_desc& desc){ return impl_->create_frame(tag, desc); }                \r
 void mixer::set_blend_mode(int index, blend_mode::type value){impl_->set_blend_mode(index, value);}\r
index c80dce6df90b82c91715adf57f0c5dea3a4ac1cf..63012d72990648186f3e341cff924dd4497774f8 100644 (file)
@@ -53,7 +53,7 @@ class mixer sealed : public target<std::pair<std::map<int, safe_ptr<core::basic_
 public:        \r
        typedef target<std::pair<safe_ptr<read_frame>, std::shared_ptr<void>>> target_t;\r
 \r
-       explicit mixer(const safe_ptr<diagnostics::graph>& graph, const safe_ptr<target_t>& target, const video_format_desc& format_desc, const safe_ptr<ogl_device>& ogl);\r
+       explicit mixer(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc, const safe_ptr<ogl_device>& ogl);\r
                \r
        // target\r
 \r
@@ -61,6 +61,8 @@ public:
                \r
        // mixer\r
 \r
+       void link_target(const std::weak_ptr<target_t>& target);\r
+\r
        safe_ptr<core::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc);         \r
        \r
        core::video_format_desc get_video_format_desc() const; // nothrow\r
index 7a1dd4b30d4e3c9d933dd042083e848ac1fa41dd..1646312480e3e89acb1e151bfefdacc25eccd093 100644 (file)
@@ -23,6 +23,7 @@
 \r
 #include "color_producer.h"\r
 \r
+#include "../frame_producer.h"\r
 #include "../frame/basic_frame.h"\r
 #include "../frame/frame_factory.h"\r
 #include "../frame/pixel_format.h"\r
index 56bde5a82fdd53349b293f4c7264864fe6afdcaa..82522d1fc98467401df11cdf837c578164aad966 100644 (file)
@@ -21,8 +21,6 @@
 \r
 #pragma once\r
 \r
-#include "../frame_producer.h"\r
-\r
 #include <string>\r
 #include <vector>\r
 \r
@@ -30,6 +28,7 @@ namespace caspar { namespace core {
 \r
 class write_frame;\r
 struct frame_factory;\r
+struct frame_producer;\r
 \r
 safe_ptr<frame_producer> create_color_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::vector<std::wstring>& params);\r
 safe_ptr<core::write_frame> create_color_frame(void* tag, const safe_ptr<core::frame_factory>& frame_factory, const std::wstring& color);\r
index 305b36ce19b1c7a0f6348994a76d598ec7efaa09..c4494f75688dfc562dd73f43d226815fa8c13878 100644 (file)
@@ -23,8 +23,9 @@
 \r
 #include "playlist_producer.h"\r
 \r
-#include <core/producer/frame_producer.h>\r
-#include <core/producer/frame/basic_frame.h>\r
+#include "../frame_producer.h"\r
+#include "../frame_producer.h"\r
+#include "../frame/basic_frame.h"\r
 \r
 #include <boost/regex.hpp>\r
 #include <boost/property_tree/ptree.hpp>\r
index 23c130c3f000115ad382ad501fd0f2b8124ca760..0f0499fdd3223e3227954411a34266e5e463ed2e 100644 (file)
 \r
 #pragma once\r
 \r
-#include "../frame_producer.h"\r
-\r
 #include <string>\r
 #include <memory>\r
 #include <vector>\r
 \r
 namespace caspar { namespace core {\r
        \r
+struct frame_factory;\r
+struct frame_producer;\r
+       \r
 safe_ptr<frame_producer> create_playlist_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::vector<std::wstring>& params);\r
 \r
 }}
\ No newline at end of file
index b316e32093745466cf1218e2ddd151973dd40d8d..79a35fc7e4f5504eabd0dfb36156b738e9add3e6 100644 (file)
@@ -23,7 +23,8 @@
 \r
 #include "separated_producer.h"\r
 \r
-#include <core/producer/frame/basic_frame.h>\r
+#include "../frame_producer.h"\r
+#include "../frame/basic_frame.h"\r
 \r
 #include <tbb/parallel_invoke.h>\r
 \r
index 1efd6a2f0ab2a858670ba4194504143e2843793e..bc25895d7cf4bb513e4d8e055de8f265ae4d9239 100644 (file)
 \r
 #pragma once\r
 \r
-#include "../frame_producer.h"\r
-\r
 #include <string>\r
 #include <memory>\r
 \r
 namespace caspar { namespace core {\r
-       \r
+\r
+struct frame_producer;\r
+\r
 safe_ptr<frame_producer> create_separated_producer(const safe_ptr<frame_producer>& fill, const safe_ptr<frame_producer>& key);\r
 \r
 }}
\ No newline at end of file
index 3e69cb0979ebda0f2fef67a9d272b32ef7b983f0..9154c7148e2e1f08511eac8b5376a80f435107ba 100644 (file)
 #include <tbb/parallel_for_each.h>\r
 \r
 #include <boost/property_tree/ptree.hpp>\r
+#include <boost/range/algorithm_ext.hpp>\r
 \r
 #include <map>\r
+#include <vector>\r
 \r
 namespace caspar { namespace core {\r
        \r
@@ -78,22 +80,22 @@ public:
 struct stage::implementation : public std::enable_shared_from_this<implementation>\r
                                                         , boost::noncopyable\r
 {              \r
-       safe_ptr<diagnostics::graph>    graph_;\r
-       safe_ptr<stage::target_t>               target_;\r
-       video_format_desc                               format_desc_;\r
+       safe_ptr<diagnostics::graph>                                                    graph_;\r
 \r
-       boost::timer                                    produce_timer_;\r
-       boost::timer                                    tick_timer_;\r
+       std::vector<std::weak_ptr<stage::target_t>>                             targets_;\r
+       video_format_desc                                                                               format_desc_;\r
 \r
-       std::map<int, layer>                    layers_;        \r
+       boost::timer                                                                                    produce_timer_;\r
+       boost::timer                                                                                    tick_timer_;\r
+\r
+       std::map<int, layer>                                                                    layers_;        \r
        std::map<int, tweened_transform<core::frame_transform>> transforms_;    \r
 \r
-       executor                                                executor_;\r
+       executor                                                                                                executor_;\r
 public:\r
-       implementation(const safe_ptr<diagnostics::graph>& graph, const safe_ptr<stage::target_t>& target, const video_format_desc& format_desc)  \r
+       implementation(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc)  \r
                : graph_(graph)\r
                , format_desc_(format_desc)\r
-               , target_(target)\r
                , executor_(L"stage")\r
        {\r
                graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f));   \r
@@ -105,7 +107,12 @@ public:
                std::weak_ptr<implementation> self = shared_from_this();\r
                executor_.begin_invoke([=]{tick(self);});\r
        }\r
-                                                       \r
+\r
+       void link_target(const std::weak_ptr<stage::target_t>& target)\r
+       {\r
+               targets_.push_back(target);\r
+       }\r
+\r
        void tick(const std::weak_ptr<implementation>& self)\r
        {               \r
                try\r
@@ -154,8 +161,14 @@ public:
                                if(self2)                               \r
                                        self2->executor_.begin_invoke([=]{tick(self);});                                \r
                        });\r
+                                                       \r
+                       boost::range::remove_erase_if(targets_, [](const std::weak_ptr<target_t>& target)\r
+                       {\r
+                               return target.lock() == nullptr;\r
+                       });\r
 \r
-                       target_->send(std::make_pair(frames, ticket));\r
+                       BOOST_FOREACH(auto target, targets_)\r
+                               target.lock()->send(std::make_pair(frames, ticket));\r
 \r
                        graph_->set_value("tick-time", tick_timer_.elapsed()*format_desc_.fps*0.5);\r
                        tick_timer_.restart();\r
@@ -344,7 +357,8 @@ public:
        }\r
 };\r
 \r
-stage::stage(const safe_ptr<diagnostics::graph>& graph, const safe_ptr<target_t>& target, const video_format_desc& format_desc) : impl_(new implementation(graph, target, format_desc)){}\r
+stage::stage(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc) : impl_(new implementation(graph, format_desc)){}\r
+void stage::link_target(const std::weak_ptr<target_t>& target){impl_->link_target(target);}\r
 void stage::set_frame_transform(int index, const core::frame_transform& transform, unsigned int mix_duration, const std::wstring& tween){impl_->set_transform(index, transform, mix_duration, tween);}\r
 void stage::apply_frame_transform(int index, const std::function<core::frame_transform(core::frame_transform)>& transform, unsigned int mix_duration, const std::wstring& tween){impl_->apply_transform(index, transform, mix_duration, tween);}\r
 void stage::clear_transforms(int index){impl_->clear_transforms(index);}\r
index 0b366a1da57108a1e9759408cf3083025aee3f01..8bf798995819ac56aa172931c8584265cd8fbd31 100644 (file)
@@ -43,9 +43,10 @@ class stage sealed : boost::noncopyable
 public:\r
        typedef target<std::pair<std::map<int, safe_ptr<basic_frame>>, std::shared_ptr<void>>> target_t;\r
 \r
-       explicit stage(const safe_ptr<diagnostics::graph>& graph, const safe_ptr<target_t>& target, const video_format_desc& format_desc);\r
+       explicit stage(const safe_ptr<diagnostics::graph>& graph, const video_format_desc& format_desc);\r
        \r
        // stage\r
+       void link_target(const std::weak_ptr<target_t>& target);\r
        \r
        void set_frame_transform(int index, const frame_transform& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
        void apply_frame_transform(int index, const std::function<frame_transform(frame_transform)>& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
index 6a07ca25780bc528267bfba5e6a0d9ea56bd0f45..8e717dd4b159ed4a42075ef2cf0c5747fc172736 100644 (file)
 \r
 #include "transition_producer.h"\r
 \r
-#include <core/video_format.h>\r
-\r
-#include <core/producer/frame/basic_frame.h>\r
-#include <core/producer/frame/frame_transform.h>\r
+#include "../frame_producer.h"\r
+#include "../frame/basic_frame.h"\r
+#include "../frame/frame_transform.h"\r
 \r
 #include <tbb/parallel_invoke.h>\r
 \r
index b185d109efc17efd9d45c8e2f07f9555ea6a56e1..11ef6df6bdaef3743935540d5b72e402a4eac59f 100644 (file)
@@ -21,7 +21,6 @@
 \r
 #pragma once\r
 \r
-#include "../frame_producer.h"\r
 #include "../../video_format.h"\r
 \r
 #include <common/utility/tweener.h>\r
@@ -31,6 +30,8 @@
 \r
 namespace caspar { namespace core {\r
 \r
+struct frame_producer;\r
+\r
 struct transition\r
 {\r
        enum type\r
index 458a59d141f82e0c7efd85b29cbdaec856af0aa0..f5127e0ff9683a774ff7dce2adfe395249b25816 100644 (file)
@@ -56,9 +56,12 @@ public:
                , format_desc_(format_desc)\r
                , ogl_(ogl)\r
                , output_(new caspar::core::output(graph_, format_desc, index))\r
-               , mixer_(new caspar::core::mixer(graph_, output_, format_desc, ogl))\r
-               , stage_(new caspar::core::stage(graph_, mixer_, format_desc))  \r
+               , mixer_(new caspar::core::mixer(graph_, format_desc, ogl))\r
+               , stage_(new caspar::core::stage(graph_, format_desc))  \r
        {\r
+               mixer_->link_target(output_);\r
+               stage_->link_target(mixer_);\r
+\r
                graph_->set_text(print());\r
                diagnostics::register_graph(graph_);\r
 \r