]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: - Refactored frame layer tagging.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 21 Apr 2011 12:57:00 +0000 (12:57 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 21 Apr 2011 12:57:00 +0000 (12:57 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@644 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/channel.cpp
core/producer/frame/basic_frame.cpp
core/producer/frame/basic_frame.h
core/producer/frame_producer_device.cpp
core/producer/frame_producer_device.h
core/producer/layer.cpp
core/producer/layer.h
mixer/frame_mixer_device.cpp
mixer/frame_mixer_device.h
modules/flash/producer/cg_producer.cpp
shell/main.cpp

index 59b28b24bf1fa0da3fe3db486eab6536bb9db0b2..2fda119fd68ef208b7534e566424e38d396878e6 100644 (file)
@@ -41,7 +41,7 @@ public:
                , mixer_(new mixer::frame_mixer_device(format_desc))\r
                , producer_(new frame_producer_device(format_desc_))    \r
                , mixer_connection_(mixer_->connect([=](const safe_ptr<const read_frame>& frame){consumer_->send(frame);}))\r
-               , producer_connection_(producer_->connect([=](const std::vector<safe_ptr<basic_frame>>& frames){mixer_->send(frames);}))\r
+               , producer_connection_(producer_->connect([=](const std::map<int, safe_ptr<basic_frame>>& frames){mixer_->send(frames);}))\r
        {}\r
                \r
        std::wstring print() const\r
@@ -60,7 +60,7 @@ public:
                producer_ = make_safe<frame_producer_device>(format_desc_);\r
 \r
                mixer_connection_ = mixer_->connect([=](const safe_ptr<const read_frame>& frame){consumer_->send(frame);});\r
-               producer_connection_ = producer_->connect([=](const std::vector<safe_ptr<basic_frame>>& frames){mixer_->send(frames);});\r
+               producer_connection_ = producer_->connect([=](const std::map<int, safe_ptr<basic_frame>>& frames){mixer_->send(frames);});\r
        }\r
 };\r
 \r
index 7bfb4d939112a329811e1443ac20489ee82ee9bf..79621d4feeee21cd808af1197d60383a2849f560 100644 (file)
@@ -17,16 +17,12 @@ struct basic_frame::implementation
 \r
        image_transform image_transform_;       \r
        audio_transform audio_transform_;\r
-\r
-       int index_;\r
-\r
+       \r
 public:\r
        implementation(const std::vector<safe_ptr<basic_frame>>& frames) \r
-               : frames_(frames)\r
-               , index_(std::numeric_limits<int>::min()) {}\r
+               : frames_(frames) {}\r
        implementation(std::vector<safe_ptr<basic_frame>>&& frames) \r
-               : frames_(std::move(frames))\r
-               , index_(std::numeric_limits<int>::min()) {}\r
+               : frames_(std::move(frames)){}\r
        \r
        void accept(const basic_frame& self, frame_visitor& visitor)\r
        {\r
@@ -112,8 +108,5 @@ safe_ptr<basic_frame> basic_frame::interlace(const safe_ptr<basic_frame>& frame1
        frames.push_back(my_frame2);\r
        return make_safe<basic_frame>(frames);\r
 }\r
-\r
-void basic_frame::set_layer_index(int index) { impl_->index_ = index; }\r
-int basic_frame::get_layer_index() const { return impl_->index_; }\r
        \r
 }}
\ No newline at end of file
index e12fce9caa666b382d0445de48a6c5004cb66645..6f1236352ed5e5e9fb39c301fcbe062d2097155b 100644 (file)
@@ -59,9 +59,6 @@ public:
        }\r
        \r
        virtual void accept(frame_visitor& visitor);\r
-\r
-       void set_layer_index(int index);\r
-       int get_layer_index() const;\r
 private:\r
        struct implementation;\r
        std::shared_ptr<implementation> impl_;\r
index a2f16cef5cf59cfd3d9db96619452b50363b05f7..e283614f2ae3866a844001eecb1d8beafa83463f 100644 (file)
@@ -14,6 +14,7 @@
 \r
 #include <tbb/parallel_for.h>\r
 #include <tbb/mutex.h>\r
+#include <tbb/combinable.h>\r
 \r
 #include <array>\r
 #include <memory>\r
@@ -62,20 +63,24 @@ public:
                executor_.begin_invoke([=]{tick();});\r
        }\r
                        \r
-       std::vector<safe_ptr<basic_frame>> draw()\r
+       std::map<int, safe_ptr<basic_frame>> draw()\r
        {       \r
-               std::vector<safe_ptr<basic_frame>> frames(layers_.size(), basic_frame::empty());\r
-               tbb::parallel_for(tbb::blocked_range<size_t>(0, frames.size(), 1), [&](const tbb::blocked_range<size_t>& r)\r
+               tbb::combinable<std::map<int, safe_ptr<basic_frame>>> frames;\r
+\r
+               tbb::parallel_for_each(layers_.begin(), layers_.end(), [&](decltype(*layers_.begin())& pair)\r
                {\r
-                       auto it = layers_.begin();\r
-                       std::advance(it, r.begin());\r
-                       for(size_t i = r.begin(); i != r.end(); ++i, ++it)\r
-                       {\r
-                               frames[i] = it->second.receive();\r
-                               frames[i]->set_layer_index(it->first);\r
-                       }\r
-               });             \r
-               return frames;\r
+                       auto frame = pair.second.receive();\r
+                       if(frame != basic_frame::empty() && frame != basic_frame::eof())\r
+                               frames.local()[pair.first] = frame;             \r
+               });\r
+\r
+               std::map<int, safe_ptr<basic_frame>> result;\r
+               frames.combine_each([&](const std::map<int, safe_ptr<basic_frame>>& map)\r
+               {\r
+                       result.insert(map.begin(), map.end());\r
+               });\r
+\r
+               return result;\r
        }\r
 \r
        void load(int index, const safe_ptr<frame_producer>& producer, bool preview)\r
@@ -127,7 +132,7 @@ public:
 \r
                        auto func = [&]\r
                        {\r
-                               layers_[index].swap(other.impl_->layers_.at(other_index));              \r
+                               layers_[index].swap(other.impl_->layers_[other_index]);         \r
 \r
                                CASPAR_LOG(info) << print() << L" Swapped layer " << index << L" with " << other.impl_->print() << L" layer " << other_index << L".";   \r
                        };\r
@@ -146,7 +151,7 @@ public:
 \r
                auto func = [&]\r
                {\r
-                       auto sel_first = [](const decltype(*layers_.begin())& pair){return pair.first;};\r
+                       auto sel_first = [](const std::pair<int, layer>& pair){return pair.first;};\r
 \r
                        std::set<int> indices;\r
                        std::transform(layers_.begin(), layers_.end(), std::inserter(indices, indices.begin()), sel_first);\r
@@ -162,12 +167,11 @@ public:
                executor_.invoke([&]{other.impl_->executor_.invoke(func);});\r
        }\r
        \r
-       boost::unique_future<safe_ptr<frame_producer>> foreground(int index) const\r
+       boost::unique_future<safe_ptr<frame_producer>> foreground(int index)\r
        {\r
-               return executor_.begin_invoke([=]() mutable -> safe_ptr<frame_producer>\r
+               return executor_.begin_invoke([=]\r
                {                       \r
-                       auto it = layers_.find(index);\r
-                       return it != layers_.end() ? it->second.foreground() : frame_producer::empty();\r
+                       return layers_[index].foreground();\r
                });\r
        }\r
 \r
@@ -189,5 +193,5 @@ void frame_producer_device::clear(int index){impl_->clear(index);}
 void frame_producer_device::clear(){impl_->clear();}\r
 void frame_producer_device::swap_layer(int index, size_t other_index){impl_->swap_layer(index, other_index);}\r
 void frame_producer_device::swap_layer(int index, size_t other_index, frame_producer_device& other){impl_->swap_layer(index, other_index, other);}\r
-boost::unique_future<safe_ptr<frame_producer>> frame_producer_device::foreground(size_t index) const{  return impl_->foreground(index);}\r
+boost::unique_future<safe_ptr<frame_producer>> frame_producer_device::foreground(size_t index) {       return impl_->foreground(index);}\r
 }}
\ No newline at end of file
index 72959ff6de7fa13b4205887fab5188a2f3d54691..e0d1d912844d7da8550583b8ace89d3be6d0cde9 100644 (file)
@@ -27,7 +27,7 @@ namespace caspar { namespace core {
 class frame_producer_device : boost::noncopyable\r
 {\r
 public:\r
-       typedef boost::signals2::signal<void(const std::vector<safe_ptr<basic_frame>>&)> output_t;\r
+       typedef boost::signals2::signal<void(const std::map<int, safe_ptr<basic_frame>>&)> output_t;\r
         \r
        boost::signals2::connection connect(const output_t::slot_type& subscriber);\r
 \r
@@ -43,7 +43,7 @@ public:
        void clear();   \r
        void swap_layer(int index, size_t other_index);\r
        void swap_layer(int index, size_t other_index, frame_producer_device& other);\r
-       boost::unique_future<safe_ptr<frame_producer>> foreground(size_t index) const;\r
+       boost::unique_future<safe_ptr<frame_producer>> foreground(size_t index);\r
 \r
 private:\r
        struct implementation;\r
index f85f407f39b03785ed541beb99015986abd6f28e..febb7721661895d5d63987451e9a3abaa79d9d9d 100644 (file)
@@ -8,7 +8,7 @@
 \r
 namespace caspar { namespace core {\r
        \r
-struct layer::implementation : boost::noncopyable\r
+struct layer::implementation\r
 {                              \r
        safe_ptr<frame_producer>        foreground_;\r
        safe_ptr<frame_producer>        background_;\r
@@ -21,15 +21,8 @@ public:
                , last_frame_(basic_frame::empty())\r
                , is_paused_(false){}\r
        \r
-       void pause() \r
-       {\r
-               is_paused_ = true; \r
-       }\r
-\r
-       void resume()\r
-       {\r
-               is_paused_ = false;\r
-       }\r
+       void pause(){is_paused_ = true;}\r
+       void resume(){is_paused_ = false;}\r
 \r
        void load(const safe_ptr<frame_producer>& producer, bool preview)\r
        {               \r
@@ -79,6 +72,13 @@ layer& layer::operator=(layer&& other)
        impl_ = std::move(other.impl_);\r
        return *this;\r
 }\r
+layer::layer(const layer& other) : impl_(new implementation(*other.impl_)){}\r
+layer& layer::operator=(const layer& other)\r
+{\r
+       layer tmp(other);\r
+       tmp.swap(*this);\r
+       return *this;\r
+}\r
 void layer::swap(layer& other)\r
 {      \r
        impl_.swap(other.impl_);\r
index c4db351350337a7acb17e5fc9422c376af45e274..da0527a8a747e3e71d3f0a7ef1c207cd6035df98 100644 (file)
@@ -12,12 +12,14 @@ namespace caspar { namespace core {
 class frame_producer;\r
 class basic_frame;\r
 \r
-class layer : boost::noncopyable\r
+class layer //: boost::noncopyable\r
 {\r
 public:\r
        layer(); // nothrow\r
        layer(layer&& other); // nothrow\r
        layer& operator=(layer&& other); // nothrow\r
+       layer(const layer&);\r
+       layer& operator=(const layer&);\r
 \r
        void swap(layer& other); // nothrow \r
                \r
index d973ad630e583d00b4a50291420f9466671e475c..c56ca9e93646220dd29235e55ace95e80c0590cb 100644 (file)
@@ -103,11 +103,8 @@ public:
                return output_.connect(subscriber);\r
        }\r
 \r
-       boost::unique_future<safe_ptr<const host_buffer>> mix_image(std::vector<safe_ptr<core::basic_frame>> frames)\r
-       {\r
-               frames.erase(std::remove(frames.begin(), frames.end(), core::basic_frame::empty()), frames.end());\r
-               frames.erase(std::remove(frames.begin(), frames.end(), core::basic_frame::eof()), frames.end());\r
-               \r
+       boost::unique_future<safe_ptr<const host_buffer>> mix_image(std::map<int, safe_ptr<core::basic_frame>> frames)\r
+       {               \r
                auto& root_image_transform = boost::fusion::at_key<core::image_transform>(root_transforms_);\r
                auto& image_transforms = boost::fusion::at_key<core::image_transform>(transforms_);\r
 \r
@@ -116,11 +113,11 @@ public:
                {\r
                        if(format_desc_.mode != core::video_mode::progressive)\r
                        {\r
-                               auto frame1 = make_safe<core::basic_frame>(frame);\r
-                               auto frame2 = make_safe<core::basic_frame>(frame);\r
+                               auto frame1 = make_safe<core::basic_frame>(frame.second);\r
+                               auto frame2 = make_safe<core::basic_frame>(frame.second);\r
                                \r
-                               frame1->get_image_transform() = root_image_transform.fetch_and_tick(1)*image_transforms[frame->get_layer_index()].fetch_and_tick(1);\r
-                               frame2->get_image_transform() = root_image_transform.fetch_and_tick(1)*image_transforms[frame->get_layer_index()].fetch_and_tick(1);\r
+                               frame1->get_image_transform() = root_image_transform.fetch_and_tick(1)*image_transforms[frame.first].fetch_and_tick(1);\r
+                               frame2->get_image_transform() = root_image_transform.fetch_and_tick(1)*image_transforms[frame.first].fetch_and_tick(1);\r
 \r
                                if(frame1->get_image_transform() != frame2->get_image_transform())\r
                                        core::basic_frame::interlace(frame1, frame2, format_desc_.mode)->accept(image_mixer_);\r
@@ -129,8 +126,8 @@ public:
                        }\r
                        else\r
                        {\r
-                               auto frame1 = make_safe<core::basic_frame>(frame);\r
-                               frame1->get_image_transform() = root_image_transform.fetch_and_tick(1)*image_transforms[frame->get_layer_index()].fetch_and_tick(1);\r
+                               auto frame1 = make_safe<core::basic_frame>(frame.second);\r
+                               frame1->get_image_transform() = root_image_transform.fetch_and_tick(1)*image_transforms[frame.first].fetch_and_tick(1);\r
                                frame1->accept(image_mixer_);\r
                        }\r
                }\r
@@ -138,7 +135,7 @@ public:
                return std::move(image);\r
        }\r
 \r
-       std::vector<short> mix_audio(const std::vector<safe_ptr<core::basic_frame>>& frames)\r
+       std::vector<short> mix_audio(const std::map<int, safe_ptr<core::basic_frame>>& frames)\r
        {\r
                auto& root_audio_transform = boost::fusion::at_key<core::audio_transform>(root_transforms_);\r
                auto& audio_transforms = boost::fusion::at_key<core::audio_transform>(transforms_);\r
@@ -148,15 +145,15 @@ public:
                {\r
                        int num = format_desc_.mode == core::video_mode::progressive ? 1 : 2;\r
 \r
-                       auto frame1 = make_safe<core::basic_frame>(frame);\r
-                       frame1->get_audio_transform() = root_audio_transform.fetch_and_tick(num)*audio_transforms[frame->get_layer_index()].fetch_and_tick(num);\r
+                       auto frame1 = make_safe<core::basic_frame>(frame.second);\r
+                       frame1->get_audio_transform() = root_audio_transform.fetch_and_tick(num)*audio_transforms[frame.first].fetch_and_tick(num);\r
                        frame1->accept(audio_mixer_);\r
                }\r
                audio_mixer_.end_pass();\r
                return audio;\r
        }\r
                \r
-       void send(const std::vector<safe_ptr<core::basic_frame>>& frames)\r
+       void send(const std::map<int, safe_ptr<core::basic_frame>>& frames)\r
        {                       \r
                executor_.begin_invoke([=]\r
                {                       \r
@@ -266,7 +263,7 @@ public:
 frame_mixer_device::frame_mixer_device(const core::video_format_desc& format_desc) : impl_(new implementation(format_desc)){}\r
 frame_mixer_device::frame_mixer_device(frame_mixer_device&& other) : impl_(std::move(other.impl_)){}\r
 boost::signals2::connection frame_mixer_device::connect(const output_t::slot_type& subscriber){return impl_->connect(subscriber);}\r
-void frame_mixer_device::send(const std::vector<safe_ptr<core::basic_frame>>& frames){impl_->send(frames);}\r
+void frame_mixer_device::send(const std::map<int, safe_ptr<core::basic_frame>>& frames){impl_->send(frames);}\r
 const core::video_format_desc& frame_mixer_device::get_video_format_desc() const { return impl_->format_desc_; }\r
 safe_ptr<core::write_frame> frame_mixer_device::create_frame(void* tag, const core::pixel_format_desc& desc){ return impl_->create_frame(tag, desc); }         \r
 safe_ptr<core::write_frame> frame_mixer_device::create_frame(void* tag, size_t width, size_t height, core::pixel_format::type pix_fmt)\r
index be4de85e5c1eac4ec171f182cc7884608a9ce1cb..d72c42bbe71b99050c522e263091217c5a317106 100644 (file)
@@ -45,7 +45,7 @@ public:
        frame_mixer_device(const core::video_format_desc& format_desc);\r
        frame_mixer_device(frame_mixer_device&& other); // nothrow\r
                \r
-       void send(const std::vector<safe_ptr<core::basic_frame>>& frames); // nothrow\r
+       void send(const std::map<int, safe_ptr<core::basic_frame>>& frames); // nothrow\r
                \r
        safe_ptr<core::write_frame> create_frame(void* tag, const core::pixel_format_desc& desc);               \r
        safe_ptr<core::write_frame> create_frame(void* tag, size_t width, size_t height, core::pixel_format::type pix_fmt = core::pixel_format::bgra);                  \r
index 31afdf136f3fa61b5ec74a5f3aab1a18a502dcb6..b06634c623afea438bc02b3a8cfcdd3788382c64 100644 (file)
@@ -90,6 +90,7 @@ safe_ptr<cg_producer> get_default_cg_producer(const safe_ptr<core::channel>& cha
                safe_ptr<core::frame_factory> factory = channel->mixer();\r
                auto producer = make_safe<cg_producer>(factory);                \r
                channel->producer()->load(render_layer, producer, true); \r
+               channel->producer()->play(render_layer);\r
                return producer;\r
        }\r
 }\r
index 67a9c2f9b24f936de8286a7c25a9e1e069944317..51f067cc80a7705f377d48f1cc6d7da1c64c81db 100644 (file)
@@ -184,9 +184,9 @@ int main(int argc, wchar_t* argv[])
                        is_running = wcmd != L"exit" && wcmd != L"q";\r
                        if(wcmd.substr(0, 2) == L"12")\r
                        {\r
-                               wcmd = L"LOADBG 1-1 A LOOP AUTOPLAY\r\n";\r
+                               wcmd = L"LOADBG 1-1 A LOOP \r\nPLAY 1-1\r\n";\r
                                amcp.Parse(wcmd.c_str(), wcmd.length(), dummy);\r
-                               wcmd = L"LOADBG 1-2 DV LOOP AUTOPLAY\r\n";\r
+                               wcmd = L"LOADBG 1-2 DV LOOP AUTOPLAY\r\nnPLAY 1-1\r\n";\r
                                amcp.Parse(wcmd.c_str(), wcmd.length(), dummy);\r
                                wcmd = L"MIXER 1-1 VIDEO FIX_RECT 0.0 0.0 0.5 0.5\r\n";\r
                                amcp.Parse(wcmd.c_str(), wcmd.length(), dummy);\r
@@ -198,15 +198,15 @@ int main(int argc, wchar_t* argv[])
                        if(wcmd.substr(0, 2) == L"11")\r
                                wcmd = L"MIXER 1-1 VIDEO FIX_RECT 0.4 0.4 0.5 0.5";\r
                        else if(wcmd.substr(0, 1) == L"1")\r
-                               wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" SLIDE 100 LOOP AUTOPLAY";\r
+                               wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" SLIDE 100 LOOP \r\nPLAY 1-1";\r
                        else if(wcmd.substr(0, 1) == L"2")\r
-                               wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" PUSH 100 LOOP AUTOPLAY";\r
+                               wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" PUSH 100 LOOP \r\nPLAY 1-1";\r
                        else if(wcmd.substr(0, 1) == L"3")\r
-                               wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" MIX 100 LOOP AUTOPLAY";\r
+                               wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" MIX 100 LOOP \r\nPLAY 1-1";\r
                        else if(wcmd.substr(0, 1) == L"4")\r
-                               wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" WIPE 100 LOOP AUTOPLAY";\r
+                               wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" WIPE 100 LOOP \r\nPLAY 1-1";\r
                        else if(wcmd.substr(0, 1) == L"5")\r
-                               wcmd = L"LOADBG 1-2 " + wcmd.substr(1, wcmd.length()-1) + L" LOOP AUTOPLAY";\r
+                               wcmd = L"LOADBG 1-2 " + wcmd.substr(1, wcmd.length()-1) + L" LOOP \r\nPLAY 1-2";\r
                        else if(wcmd.substr(0, 1) == L"6")\r
                                wcmd = L"CG 1-2 ADD 1 BBTELEFONARE 1";\r
                        else if(wcmd.substr(0, 1) == L"7")\r