]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2:
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 16 Nov 2010 07:42:33 +0000 (07:42 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 16 Nov 2010 07:42:33 +0000 (07:42 +0000)
 composite_frame:
  - Improved interface.

git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@251 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

12 files changed:
core/processor/composite_frame.cpp
core/processor/composite_frame.h
core/processor/frame.cpp
core/processor/frame.h
core/processor/frame_processor_device.cpp
core/processor/frame_shader.cpp
core/producer/flash/cg_producer.cpp
core/producer/flash/cg_producer.h
core/producer/flash/flash_producer.cpp
core/producer/flash/flash_producer.h
core/producer/transition/transition_producer.cpp
core/protocol/amcp/AMCPCommandsImpl.cpp

index 7056647b50d655aaec4a9447aa31ae5c961df25f..80116f633e58a297088215bfcb58bcffd0c8d28a 100644 (file)
 namespace caspar { namespace core {\r
        \r
 struct composite_frame::implementation : boost::noncopyable\r
-{\r
-       implementation(composite_frame* self) : self_(self){}\r
-       \r
+{      \r
        implementation(composite_frame* self, const std::vector<frame_ptr>& frames) : self_(self), frames_(frames)\r
+       {\r
+               mix_audio();\r
+       }\r
+\r
+       implementation(composite_frame* self, const frame_ptr& frame1, const frame_ptr& frame2) : self_(self)\r
+       {\r
+               frames_.push_back(frame1);\r
+               frames_.push_back(frame2);\r
+               mix_audio();\r
+       }\r
+\r
+       void mix_audio()\r
        {\r
                boost::range::remove_erase(frames_, nullptr);\r
                boost::range::remove_erase(frames_, frame::empty());\r
@@ -67,36 +77,26 @@ struct composite_frame::implementation : boost::noncopyable
                boost::range::for_each(frames_, std::bind(&frame::draw, std::placeholders::_1, shader));\r
                glPopMatrix();\r
        }\r
-\r
-       unsigned char* data(size_t)\r
-       {\r
-               BOOST_THROW_EXCEPTION(invalid_operation());\r
-       }\r
-\r
+       \r
        composite_frame* self_;\r
        std::vector<frame_ptr> frames_;\r
-       size_t size_;\r
 };\r
 \r
 #if defined(_MSC_VER)\r
 #pragma warning (disable : 4355) // 'this' : used in base member initializer list\r
 #endif\r
 \r
-composite_frame::composite_frame(const std::vector<frame_ptr>& frames) \r
-       : frame(0, 0), impl_(new implementation(this, frames)){}\r
+composite_frame::composite_frame(const std::vector<frame_ptr>& frames) : frame(pixel_format_desc()), impl_(new implementation(this, frames)){}\r
+composite_frame::composite_frame(const frame_ptr& frame1, const frame_ptr& frame2) : frame(pixel_format_desc()), impl_(new implementation(this, frame1, frame2)){}\r
 void composite_frame::begin_write(){impl_->begin_write();}\r
 void composite_frame::end_write(){impl_->end_write();} \r
 void composite_frame::begin_read(){impl_->begin_read();}\r
 void composite_frame::end_read(){impl_->end_read();}\r
 void composite_frame::draw(const frame_shader_ptr& shader){impl_->draw(shader);}\r
-unsigned char* composite_frame::data(size_t index){return impl_->data(index);}\r
 \r
 frame_ptr composite_frame::interlace(const frame_ptr& frame1, const frame_ptr& frame2, video_update_format::type mode)\r
 {                      \r
-       std::vector<frame_ptr> frames;\r
-       frames.push_back(frame1);\r
-       frames.push_back(frame2);\r
-       auto result = std::make_shared<composite_frame>(frames);\r
+       auto result = std::make_shared<composite_frame>(frame1, frame2);\r
        if(mode == video_update_format::upper)\r
        {\r
                frame1->update_fmt(video_update_format::upper);\r
index 331fa462a24482d7d9aa51dc45b0da2fa23a422f..910697a4d3d5fcd4444c3b78a96e23bb74c607b6 100644 (file)
@@ -11,12 +11,12 @@ class composite_frame : public frame
 {\r
 public:\r
        composite_frame(const std::vector<frame_ptr>& container);\r
+       composite_frame(const frame_ptr& frame1, const frame_ptr& frame2);\r
 \r
        static frame_ptr interlace(const frame_ptr& frame1,     const frame_ptr& frame2, video_update_format::type mode);\r
        \r
 private:\r
 \r
-       virtual unsigned char* data(size_t index);\r
        virtual void begin_write();\r
        virtual void end_write();\r
        virtual void begin_read();\r
index 09fd22f414a98d2194214b1695c546e745e7c1b0..e4a7b153e1f375f7e61d0b83c296ac4ab4ab060e 100644 (file)
@@ -52,19 +52,6 @@ GLubyte lower_pattern[] = {
                                                                                                                                                                                                                                                                                                                \r
 struct frame::implementation : boost::noncopyable\r
 {\r
-       implementation(size_t width, size_t height)\r
-               : alpha_(1.0f), x_(0.0f), y_(0.0f), update_fmt_(video_update_format::progressive), texcoords_(0.0, 1.0, 1.0, 0.0), pixel_data_(4, nullptr)\r
-       {       \r
-               desc_.planes[0] = pixel_format_desc::plane(width, height, 4);\r
-               desc_.pix_fmt = pixel_format::bgra;\r
-               pixel_data_.resize(4, 0);\r
-               if(width >= 2 && height >= 2)\r
-               {\r
-                       pbo_.push_back(std::make_shared<common::gl::pixel_buffer_object>(width, height, GL_BGRA));\r
-                       end_write();\r
-               }\r
-       }\r
-\r
        implementation(const pixel_format_desc& desc)\r
                : alpha_(1.0f), x_(0.0f), y_(0.0f), update_fmt_(video_update_format::progressive), texcoords_(0.0, 1.0, 1.0, 0.0), pixel_data_(4, nullptr)\r
        {                       \r
@@ -144,9 +131,7 @@ struct frame::implementation : boost::noncopyable
 \r
        unsigned char* data(size_t index)\r
        {\r
-               if(pbo_.size() < index)\r
-                       BOOST_THROW_EXCEPTION(out_of_range());\r
-               return static_cast<unsigned char*>(pixel_data_[index]);\r
+               return static_cast<unsigned char*>(pixel_data_.at(index));\r
        }\r
 \r
        void reset()\r
@@ -172,9 +157,6 @@ struct frame::implementation : boost::noncopyable
 \r
        pixel_format_desc desc_;\r
 };\r
-\r
-frame::frame(size_t width, size_t height) \r
-       : impl_(new implementation(width, height)){}\r
 frame::frame(const pixel_format_desc& desc)\r
        : impl_(new implementation(desc)){}\r
 void frame::draw(const frame_shader_ptr& shader){impl_->draw(shader);}\r
index 18d56fc650a6c0aed0e455e3d8f35eb9249f57de..c2b76ed5c4353668d90a9bf263c2208eb4f8ee2b 100644 (file)
@@ -37,12 +37,11 @@ public:
 \r
        static std::shared_ptr<frame> empty()\r
        {\r
-               static auto my_null_frame = std::shared_ptr<frame>(new frame(0,0));\r
+               static auto my_null_frame = std::shared_ptr<frame>(new frame(pixel_format_desc()));\r
                return my_null_frame;\r
        }\r
 \r
 protected:\r
-       frame(size_t width, size_t height);\r
        frame(const pixel_format_desc& desc);\r
 \r
        friend class frame_processor_device;\r
index eed3d295f83300a1e9db8319a3a4020d52fb8e04..bf7bbf392cfd1f9f7c3d6617aaeec2c1d346b512 100644 (file)
@@ -28,8 +28,7 @@ namespace caspar { namespace core {
        \r
 struct frame_processor_device::implementation : boost::noncopyable\r
 {      \r
-       implementation(frame_processor_device* self, const video_format_desc& format_desc) \r
-               : fmt_(format_desc), underrun_count_(0)\r
+       implementation(frame_processor_device* self, const video_format_desc& format_desc) : fmt_(format_desc), underrun_count_(0)\r
        {               \r
                output_.set_capacity(4);\r
                executor_.start();\r
@@ -61,13 +60,14 @@ struct frame_processor_device::implementation : boost::noncopyable
                if(!pool.try_pop(my_frame))             \r
                        my_frame = executor_.invoke([&]{return std::shared_ptr<frame>(new frame(desc));});              \r
                \r
-               auto destructor = [=]\r
+               return frame_ptr(my_frame.get(), [=](frame*)\r
                {\r
-                       my_frame->reset();\r
-                       frame_pools_[key].push(my_frame);\r
-               };\r
-\r
-               return frame_ptr(my_frame.get(), [=](frame*){executor_.begin_invoke(destructor);});\r
+                       executor_.begin_invoke([=]\r
+                       {\r
+                               my_frame->reset();\r
+                               frame_pools_[key].push(my_frame);\r
+                       });\r
+               });\r
        }\r
                \r
        void send(const frame_ptr& input_frame)\r
index 3a1f9ae22194e15e6a76645404e0d44b00c832f9..70b388c0d01c675b6a6473603883e49f2b1e12a6 100644 (file)
@@ -44,7 +44,6 @@ public:
                                char info[2048];\r
                                GL(glGetInfoLogARB(fragmemt_shader, sizeof(info), 0, info));\r
                                GL(glDeleteObjectARB(fragmemt_shader));\r
-                               GL(glDeleteObjectARB(program_));\r
                                std::stringstream str;\r
                                str << "Failed to compile fragment shader:" << std::endl << info << std::endl;\r
                                BOOST_THROW_EXCEPTION(common::gl::gl_error() << msg_info(str.str()));\r
@@ -181,7 +180,6 @@ struct frame_shader::implementation
        void use(const pixel_format_desc& desc)\r
        {\r
                set_pixel_format(desc.pix_fmt);\r
-//             set_size(desc);\r
        }\r
 \r
        void set_pixel_format(pixel_format::type format)\r
index 92c7c69e0d9fa57b44075a276c9f2946cbecbe9e..ef213d05273f0a84bf9111b24c74bcee37180042 100644 (file)
 #include "cg_producer.h"\r
 #include "flash_producer.h"\r
 \r
-#include "../../producer/frame_producer_device.h"\r
-#include "../../format/video_format.h"\r
 #include "../../processor/frame.h"\r
 #include "../../Server.h"\r
 \r
 #include <boost/filesystem.hpp>\r
 #include <boost/assign.hpp>\r
-#include <tbb/concurrent_unordered_map.h>\r
                \r
-namespace caspar { namespace core { namespace flash{\r
-\r
-struct flash_cg_proxy\r
-{\r
-       virtual std::wstring add(int layer, const std::wstring& templateName,  bool playOnLoad, const std::wstring& startFromLabel = TEXT(""), const std::wstring& data = TEXT("")) = 0;\r
-       virtual std::wstring remove(int layer) = 0;\r
-       virtual std::wstring play(int layer)  = 0;\r
-       virtual std::wstring stop(int layer, unsigned int mixOutDuration) = 0;\r
-       virtual std::wstring next(int layer) = 0;\r
-       virtual std::wstring update(int layer, const std::wstring& data) = 0;\r
-       virtual std::wstring invoke(int layer, const std::wstring& label) = 0;\r
-};\r
-\r
-struct flash_cg_proxy16 : public flash_cg_proxy\r
-{              \r
-       virtual std::wstring add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& label, const std::wstring& data) \r
-       {\r
-               std::wstringstream flashParam;\r
-               std::wstring::size_type pos = templateName.find('.');\r
-               std::wstring filename = (pos != std::wstring::npos) ? templateName.substr(0, pos) : templateName;               \r
-               flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << filename << TEXT("</string><number>0</number>") << (playOnLoad?TEXT("<true/>"):TEXT("<false/>")) << TEXT("<string>") << label << TEXT("</string><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring remove(int layer) \r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"Delete\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring play(int layer) \r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"Play\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring stop(int layer, unsigned int mixOutDuration) \r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"Stop\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><number>") << mixOutDuration << TEXT("</number></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring next(int layer) \r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"Next\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring update(int layer, const std::wstring& data) \r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"SetData\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring invoke(int layer, const std::wstring& label) \r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"ExecuteMethod\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << label << TEXT("</string></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-};\r
-\r
-struct flash_cg_proxy17 : public flash_cg_proxy\r
-{\r
-       virtual std::wstring add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& label, const std::wstring& data) \r
-       {\r
-               std::wstringstream flashParam;\r
-\r
-               std::wstring::size_type pos = templateName.find('.');\r
-               std::wstring filename = (pos != std::wstring::npos) ? templateName.substr(0, pos) : templateName;\r
-               \r
-               flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << filename << TEXT("</string>") << (playOnLoad?TEXT("<true/>"):TEXT("<false/>")) << TEXT("<string>") << label << TEXT("</string><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring remove(int layer) \r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"Delete\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring play(int layer) \r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"Play\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring stop(int layer, unsigned int mixOutDuration)\r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"Stop\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><number>") << mixOutDuration << TEXT("</number></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring next(int layer)\r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"Next\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring update(int layer, const std::wstring& data) \r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"SetData\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-\r
-       virtual std::wstring invoke(int layer, const std::wstring& label)\r
-       {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"Invoke\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><string>") << label << TEXT("</string></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
-};\r
-\r
-struct flash_cg_proxy18 : public flash_cg_proxy17\r
+namespace caspar { namespace core { namespace flash {\r
+       \r
+struct template_version\r
 {\r
-       virtual std::wstring add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& label, const std::wstring& data)\r
+       enum type\r
        {\r
-               std::wstringstream flashParam;\r
-               flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << templateName << TEXT("</string>") << (playOnLoad?TEXT("<true/>"):TEXT("<false/>")) << TEXT("<string>") << label << TEXT("</string><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
-               return flashParam.str();\r
-       }\r
+               _17,\r
+               _18,\r
+               invalid,\r
+               count\r
+       };\r
 };\r
 \r
 struct cg_producer::implementation : boost::noncopyable\r
 {\r
 public:\r
 \r
-       implementation()\r
+       implementation() : ver_(template_version::invalid)\r
        {\r
                if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth.18")))\r
                {\r
                        flash_producer_ = std::make_shared<flash_producer>(server::template_folder()+TEXT("cg.fth.18"));\r
-                       proxy_.reset(new flash_cg_proxy18());\r
                        CASPAR_LOG(info) << L"Running version 1.8 template graphics.";\r
+                       ver_ = template_version::_18;\r
                }\r
                else if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth.17")))\r
                {\r
                        flash_producer_ = std::make_shared<flash_producer>(server::template_folder()+TEXT("cg.fth.17"));\r
-                       proxy_.reset(new flash_cg_proxy17());\r
                        CASPAR_LOG(info) << L"Running version 1.7 template graphics.";\r
-               }\r
-               else if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth"))) \r
-               {\r
-                       flash_producer_ = std::make_shared<flash_producer>(server::template_folder()+TEXT("cg.fth"));\r
-                       proxy_.reset(new flash_cg_proxy16());\r
-                       CASPAR_LOG(info) << L"Running version 1.6 template graphics.";\r
+                       ver_ = template_version::_17;\r
                }\r
                else \r
-                       CASPAR_LOG(info) << L"No templatehost found. Template graphics will be disabled";\r
-               \r
+                       CASPAR_LOG(info) << L"No templatehost found. Template graphics will be disabled";               \r
        }\r
 \r
        void clear()\r
@@ -183,12 +53,25 @@ public:
                flash_producer_.reset();\r
        }\r
 \r
-       void add(int layer, const std::wstring& templateName,  bool playOnLoad, const std::wstring& startFromLabel, const std::wstring& data)\r
+       void add(int layer, const std::wstring& template_name,  bool play_on_load, const std::wstring& label, const std::wstring& data)\r
        {\r
                if(flash_producer_ == nullptr)\r
                        return;\r
                CASPAR_LOG(info) << "Invoking add-command";\r
-               flash_producer_->param(proxy_->add(layer, templateName, playOnLoad, startFromLabel, data));\r
+               \r
+               std::wstringstream param;\r
+\r
+               std::wstring filename = template_name;\r
+\r
+               if(ver_ == template_version::_17)\r
+               {\r
+                       std::wstring::size_type pos = template_name.find('.');\r
+                       filename = (pos != std::wstring::npos) ? template_name.substr(0, pos) : template_name;\r
+               }\r
+\r
+               param << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << filename << TEXT("</string>") << (play_on_load?TEXT("<true/>"):TEXT("<false/>")) << TEXT("<string>") << label << TEXT("</string><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
+               \r
+               flash_producer_->param(param.str());\r
        }\r
 \r
        void remove(int layer)\r
@@ -196,7 +79,11 @@ public:
                if(flash_producer_ == nullptr)\r
                        return;\r
                CASPAR_LOG(info) << "Invoking remove-command";\r
-               flash_producer_->param(proxy_->remove(layer));\r
+               \r
+               std::wstringstream param;\r
+               param << TEXT("<invoke name=\"Delete\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
+               \r
+               flash_producer_->param(param.str());\r
        }\r
 \r
        void play(int layer)\r
@@ -204,15 +91,23 @@ public:
                if(flash_producer_ == nullptr)\r
                        return;\r
                CASPAR_LOG(info) << "Invoking play-command";\r
-               flash_producer_->param(proxy_->play(layer));\r
+               \r
+               std::wstringstream param;\r
+               param << TEXT("<invoke name=\"Play\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
+               \r
+               flash_producer_->param(param.str());\r
        }\r
 \r
-       void stop(int layer, unsigned int mixOutDuration)\r
+       void stop(int layer, unsigned int mix_out_duration)\r
        {\r
                if(flash_producer_ == nullptr)\r
                        return;\r
                CASPAR_LOG(info) << "Invoking stop-command";\r
-               flash_producer_->param(proxy_->stop(layer, mixOutDuration));\r
+               \r
+               std::wstringstream param;\r
+               param << TEXT("<invoke name=\"Stop\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><number>") << mix_out_duration << TEXT("</number></arguments></invoke>");\r
+               \r
+               flash_producer_->param(param.str());\r
        }\r
 \r
        void next(int layer)\r
@@ -220,7 +115,11 @@ public:
                if(flash_producer_ == nullptr)\r
                        return;\r
                CASPAR_LOG(info) << "Invoking next-command";\r
-               flash_producer_->param(proxy_->next(layer));\r
+               \r
+               std::wstringstream param;\r
+               param << TEXT("<invoke name=\"Next\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
+               \r
+               flash_producer_->param(param.str());\r
        }\r
 \r
        void update(int layer, const std::wstring& data)\r
@@ -228,7 +127,11 @@ public:
                if(flash_producer_ == nullptr)\r
                        return;\r
                CASPAR_LOG(info) << "Invoking update-command";\r
-               flash_producer_->param(proxy_->update(layer, data));\r
+               \r
+               std::wstringstream param;\r
+               param << TEXT("<invoke name=\"SetData\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
+               \r
+               flash_producer_->param(param.str());\r
        }\r
 \r
        void invoke(int layer, const std::wstring& label)\r
@@ -236,7 +139,11 @@ public:
                if(flash_producer_ == nullptr)\r
                        return;\r
                CASPAR_LOG(info) << "Invoking invoke-command";\r
-               flash_producer_->param(proxy_->invoke(layer, label));\r
+               \r
+               std::wstringstream param;\r
+               param << TEXT("<invoke name=\"Invoke\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><string>") << label << TEXT("</string></arguments></invoke>");\r
+               \r
+               flash_producer_->param(param.str());\r
        }\r
 \r
        frame_ptr render_frame()\r
@@ -247,23 +154,22 @@ public:
        void initialize(const frame_processor_device_ptr& frame_processor)\r
        {\r
                frame_processor_ = frame_processor;\r
-               if(flash_producer_)\r
+               if(flash_producer_ != nullptr)\r
                        flash_producer_->initialize(frame_processor_);\r
        }\r
 \r
        flash_producer_ptr flash_producer_;\r
-       std::unique_ptr<flash_cg_proxy> proxy_;\r
+       template_version::type ver_;\r
        frame_processor_device_ptr frame_processor_;\r
 };\r
        \r
-// This is somewhat a hack... needs redesign\r
-cg_producer_ptr get_default_cg_producer(const channel_ptr& channel, unsigned int render_layer)\r
+cg_producer_ptr get_default_cg_producer(const channel_ptr& channel, int render_layer)\r
 {\r
        if(!channel)\r
                BOOST_THROW_EXCEPTION(null_argument() << msg_info("channel"));\r
        \r
        auto producer = std::dynamic_pointer_cast<cg_producer>(channel->foreground(render_layer));\r
-       if(!producer)\r
+       if(producer == nullptr)\r
        {\r
                producer = std::make_shared<cg_producer>();             \r
                channel->load(render_layer, producer, load_option::auto_play); \r
@@ -275,10 +181,10 @@ cg_producer_ptr get_default_cg_producer(const channel_ptr& channel, unsigned int
 cg_producer::cg_producer() : impl_(new implementation()){}\r
 frame_ptr cg_producer::render_frame(){return impl_->render_frame();}\r
 void cg_producer::clear(){impl_->clear();}\r
-void cg_producer::add(int layer, const std::wstring& templateName,  bool playOnLoad, const std::wstring& startFromLabel, const std::wstring& data){impl_->add(layer, templateName, playOnLoad, startFromLabel, data);}\r
+void cg_producer::add(int layer, const std::wstring& template_name,  bool play_on_load, const std::wstring& startFromLabel, const std::wstring& data){impl_->add(layer, template_name, play_on_load, startFromLabel, data);}\r
 void cg_producer::remove(int layer){impl_->remove(layer);}\r
 void cg_producer::play(int layer){impl_->play(layer);}\r
-void cg_producer::stop(int layer, unsigned int mixOutDuration){impl_->stop(layer, mixOutDuration);}\r
+void cg_producer::stop(int layer, unsigned int mix_out_duration){impl_->stop(layer, mix_out_duration);}\r
 void cg_producer::next(int layer){impl_->next(layer);}\r
 void cg_producer::update(int layer, const std::wstring& data){impl_->update(layer, data);}\r
 void cg_producer::invoke(int layer, const std::wstring& label){impl_->invoke(layer, label);}\r
index d63dbcbcad1077e2a634fd7dab163d1a22957708..ddb3fb6f3a8172b371a04b53b44b973af7d0438e 100644 (file)
@@ -9,6 +9,9 @@ namespace caspar { namespace core { namespace flash{
 class cg_producer : public frame_producer\r
 {\r
 public:\r
+\r
+       static const unsigned int DEFAULT_LAYER = 5000;\r
+\r
        cg_producer();\r
        \r
        frame_ptr render_frame();\r
@@ -30,8 +33,6 @@ private:
 };\r
 typedef std::shared_ptr<cg_producer> cg_producer_ptr;\r
 \r
-static const unsigned int CG_DEFAULT_LAYER = 5000;\r
-\r
-cg_producer_ptr get_default_cg_producer(const channel_ptr& channel, unsigned int layer_index = CG_DEFAULT_LAYER);\r
+cg_producer_ptr get_default_cg_producer(const channel_ptr& channel, int layer_index = cg_producer::DEFAULT_LAYER);\r
 \r
 }}}
\ No newline at end of file
index 41e9a4b6183db2dcb7071280e723bd6b79e1cfa7..b0f9743b3961f2c746a8bb512e27f7a6a484cc77 100644 (file)
@@ -62,7 +62,7 @@ struct flash_producer::implementation
                if(!boost::filesystem::exists(filename))\r
                        BOOST_THROW_EXCEPTION(file_not_found() << boost::errinfo_file_name(common::narrow(filename)));\r
 \r
-               frame_buffer_.set_capacity(flash_producer::DEFAULT_BUFFER_SIZE);                \r
+               frame_buffer_.set_capacity(3);          \r
        }\r
 \r
        ~implementation() \r
index ddfa354e8a676664b7880455058047fba134547c..548536976bb718a37b99fefeaed7905ab928f117 100644 (file)
@@ -35,12 +35,6 @@ class FlashAxContainer;
 class flash_producer : public frame_producer\r
 {\r
 public:\r
-       /// <summary> Default frame buffer size. </summary>\r
-       static const int DEFAULT_BUFFER_SIZE = 2;\r
-       /// <summary> The maximum number of retries when trying to invoce a flash method. </summary>\r
-       static const int MAX_PARAM_RETRIES = 5;\r
-       /// <summary> Timeout for blocking while trying to stop the producer. </summary>\r
-       static const int STOP_TIMEOUT = 2000;\r
 \r
        flash_producer(const std::wstring& filename);\r
        frame_ptr render_frame();\r
index 79977207e5adc7b51a62aa2b869a282139f6457a..0b1a937b0d8689e6770271fee634fb7049a667c7 100644 (file)
@@ -183,11 +183,7 @@ struct transition_producer::implementation : boost::noncopyable
                        }\r
                }\r
                                                \r
-               std::vector<frame_ptr> frames;\r
-               if(src_frame)\r
-                       frames.push_back(src_frame);\r
-               frames.push_back(dest_frame);\r
-               return std::make_shared<composite_frame>(frames);\r
+               return std::make_shared<composite_frame>(src_frame, dest_frame);\r
        }\r
                \r
        void initialize(const frame_processor_device_ptr& frame_processor)\r
index fccd2522c8bd7d2733497ce40811cc63eeea3f2b..6f9f00def13b76149dc598264f8ca4479d77b93b 100644 (file)
@@ -449,7 +449,7 @@ bool CGCommand::DoExecuteAdd() {
                std::wstring filename = _parameters[2];\r
                filename.append(extension);\r
 \r
-               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->add(layer, filename, bDoStart, label, (pDataString!=0) ? pDataString : TEXT(""));\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->add(layer, filename, bDoStart, label, (pDataString!=0) ? pDataString : TEXT(""));\r
                SetReplyString(TEXT("202 CG OK\r\n"));\r
        }\r
        else\r
@@ -470,7 +470,7 @@ bool CGCommand::DoExecutePlay()
                        return false;\r
                }\r
                int layer = _ttoi(_parameters[1].c_str());\r
-               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->play(layer);\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->play(layer);\r
        }\r
        else\r
        {\r
@@ -492,7 +492,7 @@ bool CGCommand::DoExecuteStop()
                        return false;\r
                }\r
                int layer = _ttoi(_parameters[1].c_str());\r
-               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->stop(layer, 0);\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->stop(layer, 0);\r
        }\r
        else \r
        {\r
@@ -514,7 +514,7 @@ bool CGCommand::DoExecuteNext()
                        return false;\r
                }\r
                int layer = _ttoi(_parameters[1].c_str());\r
-               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->next(layer);\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->next(layer);\r
        }\r
        else \r
        {\r
@@ -536,7 +536,7 @@ bool CGCommand::DoExecuteRemove()
                        return false;\r
                }\r
                int layer = _ttoi(_parameters[1].c_str());\r
-               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->remove(layer);\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->remove(layer);\r
        }\r
        else \r
        {\r
@@ -550,7 +550,7 @@ bool CGCommand::DoExecuteRemove()
 \r
 bool CGCommand::DoExecuteClear() \r
 {\r
-       flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->clear();\r
+       flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->clear();\r
        SetReplyString(TEXT("202 CG OK\r\n"));\r
        return true;\r
 }\r
@@ -566,7 +566,7 @@ bool CGCommand::DoExecuteUpdate()
                }\r
                int layer = _ttoi(_parameters[1].c_str());\r
                //TODO: Implement indirect data loading from file. Same as in Add\r
-               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->update(layer, _parameters[2]);\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->update(layer, _parameters[2]);\r
        }\r
        else \r
        {\r
@@ -588,7 +588,7 @@ bool CGCommand::DoExecuteInvoke()
                        return false;\r
                }\r
                int layer = _ttoi(_parameters[1].c_str());\r
-               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->invoke(layer, _parameters[2]);\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->invoke(layer, _parameters[2]);\r
        }\r
        else \r
        {\r