]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Fixed IS_KEY. Added separate local-key and layer-key to enable proper rendering.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 17 May 2011 20:14:18 +0000 (20:14 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 17 May 2011 20:14:18 +0000 (20:14 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@766 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/frame_mixer_device.cpp
core/mixer/gpu/device_buffer.cpp
core/mixer/gpu/device_buffer.h
core/mixer/image/image_kernel.cpp
core/mixer/image/image_kernel.h
core/mixer/image/image_mixer.cpp
core/mixer/image/image_mixer.h
protocol/amcp/AMCPCommandsImpl.cpp
shell/caspar.config
shell/main.cpp

index 150c0a9a17c73c6a2ecb6a05f4976037c46d16ef..219a79f44cb10c368da14b0ce47ee915b5dffda4 100644 (file)
@@ -133,9 +133,11 @@ public:
        {               \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
+               \r
                BOOST_FOREACH(auto& frame, frames)\r
                {\r
+                       image_mixer_.begin_layer();\r
+                       \r
                        if(format_desc_.mode != core::video_mode::progressive)\r
                        {\r
                                auto frame1 = make_safe<core::basic_frame>(frame.second);\r
@@ -155,6 +157,8 @@ public:
                                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
+                       image_mixer_.end_layer();\r
                }\r
 \r
                return image_mixer_.render();\r
index 52c08ee01dd6d57a3388dc654c4675d48154ea96..22ca870c12973961ce7960306836eac5911c45e0 100644 (file)
@@ -62,6 +62,12 @@ public:
                GL(glBindTexture(GL_TEXTURE_2D, id_));\r
        }\r
 \r
+       void bind(int index)\r
+       {\r
+               GL(glActiveTexture(GL_TEXTURE0+index));\r
+               bind();\r
+       }\r
+\r
        void unbind()\r
        {\r
                GL(glBindTexture(GL_TEXTURE_2D, 0));\r
@@ -91,6 +97,12 @@ public:
        {\r
                GL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_2D, id_, 0));\r
        }\r
+\r
+       void clear()\r
+       {\r
+               attach(0);\r
+               GL(glClear(GL_COLOR_BUFFER_BIT));\r
+       }\r
 };\r
 \r
 device_buffer::device_buffer(size_t width, size_t height, size_t stride) : impl_(new implementation(width, height, stride)){}\r
@@ -99,8 +111,10 @@ size_t device_buffer::width() const { return impl_->width_; }
 size_t device_buffer::height() const { return impl_->height_; }\r
 void device_buffer::attach(int index){impl_->attach(index);}\r
 void device_buffer::bind(){impl_->bind();}\r
+void device_buffer::bind(int index){impl_->bind(index);}\r
 void device_buffer::unbind(){impl_->unbind();}\r
 void device_buffer::read(host_buffer& source){impl_->read(source);}\r
 void device_buffer::write(host_buffer& target){impl_->write(target);}\r
+void device_buffer::clear(){impl_->clear();}\r
 \r
 }}
\ No newline at end of file
index 3435e9b5603c64c82480e0f4238efc5fad67e259..f05a06b78a0fafa89bc2e3fc214e65721fb3b246 100644 (file)
@@ -37,8 +37,11 @@ public:
        size_t height() const;\r
                \r
        void bind();\r
+       void bind(int index);\r
        void unbind();\r
 \r
+       void clear();\r
+\r
        void attach(int index = 0);\r
        void read(host_buffer& source);\r
        void write(host_buffer& target);\r
index 7da9627e0e41cf26b0395af773930aece2d44969..560f5cde7f56322743e10504e2c184ec14382011 100644 (file)
@@ -108,6 +108,7 @@ public:
                glUniform1i(glGetUniformLocation(program_, "plane[1]"), 1);\r
                glUniform1i(glGetUniformLocation(program_, "plane[2]"), 2);\r
                glUniform1i(glGetUniformLocation(program_, "plane[3]"), 3);\r
+               glUniform1i(glGetUniformLocation(program_, "plane[4]"), 4);\r
        }\r
 \r
        GLint get_location(const char* name)\r
@@ -175,10 +176,11 @@ public:
                        "}                                                                                                                                              ";\r
 \r
                std::string common_fragment = \r
-                       "uniform sampler2D      plane[4];                                                                                       "\r
+                       "uniform sampler2D      plane[5];                                                                                       "\r
                        "uniform float          gain;                                                                                           "\r
                        "uniform bool           HD;                                                                                                     "\r
-                       "uniform bool           has_separate_key;                                                                       "\r
+                       "uniform bool           local_key;                                                                                      "\r
+                       "uniform bool           layer_key;                                                                                      "\r
                                                                                                                                                                \r
                        // NOTE: YCbCr, ITU-R, http://www.intersil.com/data/an/an9717.pdf               \r
                        // TODO: Support for more yuv formats might be needed.                                  \r
@@ -219,8 +221,10 @@ public:
                        "void main()                                                                                                                    "\r
                        "{                                                                                                                                              "\r
                        "       vec4 rgba = vec4(texture2D(plane[0], gl_TexCoord[0].st).rrr, 1.0);      "\r
-                       "       if(has_separate_key)                                                                                            "\r
+                       "       if(local_key)                                                                                                           "\r
                        "               rgba.a = texture2D(plane[3], gl_TexCoord[1].st).r;                              "\r
+                       "       if(layer_key)                                                                                                           "\r
+                       "               rgba.a *= texture2D(plane[4], gl_TexCoord[1].st).r;                             "\r
                        "       gl_FragColor = rgba * gain;                                                                                     "\r
                        "}                                                                                                                                              ");\r
 \r
@@ -229,8 +233,10 @@ public:
                        "void main()                                                                                                                    "\r
                        "{                                                                                                                                              "\r
                        "       vec4 abgr = texture2D(plane[0], gl_TexCoord[0].st);                                     "\r
-                       "       if(has_separate_key)                                                                                            "\r
+                       "       if(local_key)                                                                                                           "\r
                        "               abgr.b = texture2D(plane[3], gl_TexCoord[1].st).r;                              "\r
+                       "       if(layer_key)                                                                                                           "\r
+                       "               abgr.b *= texture2D(plane[4], gl_TexCoord[1].st).r;                             "\r
                        "       gl_FragColor = abgr.argb * gain;                                                                        "\r
                        "}                                                                                                                                              ");\r
                \r
@@ -239,8 +245,10 @@ public:
                        "void main()                                                                                                                    "       \r
                        "{                                                                                                                                              "\r
                        "       vec4 argb = texture2D(plane[0], gl_TexCoord[0].st);                                     "\r
-                       "       if(has_separate_key)                                                                                            "\r
+                       "       if(local_key)                                                                                                           "\r
                        "               argb.b = texture2D(plane[3], gl_TexCoord[1].st).r;                              "\r
+                       "       if(layer_key)                                                                                                           "\r
+                       "               argb.b *= texture2D(plane[4], gl_TexCoord[1].st).r;                             "\r
                        "       gl_FragColor = argb.grab * gl_Color * gain;                                                     "\r
                        "}                                                                                                                                              ");\r
                \r
@@ -249,8 +257,10 @@ public:
                        "void main()                                                                                                                    "\r
                        "{                                                                                                                                              "\r
                        "       vec4 bgra = texture2D(plane[0], gl_TexCoord[0].st);                                     "\r
-                       "       if(has_separate_key)                                                                                            "\r
+                       "       if(local_key)                                                                                                           "\r
                        "               bgra.a = texture2D(plane[3], gl_TexCoord[1].st).r;                              "\r
+                       "       if(layer_key)                                                                                                           "\r
+                       "               bgra.a *= texture2D(plane[4], gl_TexCoord[1].st).r;                             "\r
                        "       gl_FragColor = bgra.rgba * gl_Color * gain;                                                     "\r
                        "}                                                                                                                                              ");\r
                \r
@@ -259,8 +269,10 @@ public:
                        "void main()                                                                                                                    "\r
                        "{                                                                                                                                              "\r
                        "       vec4 rgba = texture2D(plane[0], gl_TexCoord[0].st);                                     "\r
-                       "       if(has_separate_key)                                                                                            "\r
+                       "       if(local_key)                                                                                                           "\r
                        "               rgba.a = texture2D(plane[3], gl_TexCoord[1].st).r;                              "\r
+                       "       if(layer_key)                                                                                                           "\r
+                       "               rgba.a *= texture2D(plane[4], gl_TexCoord[1].st).r;                             "\r
                        "       gl_FragColor = rgba.bgra * gl_Color * gain;                                                     "\r
                        "}                                                                                                                                              ");\r
                \r
@@ -272,8 +284,10 @@ public:
                        "       float cb = texture2D(plane[1], gl_TexCoord[0].st).r;                            "\r
                        "       float cr = texture2D(plane[2], gl_TexCoord[0].st).r;                            "\r
                        "       float a = 1.0;                                                                                                          "       \r
-                       "       if(has_separate_key)                                                                                            "\r
+                       "       if(local_key)                                                                                                           "\r
                        "               a = texture2D(plane[3], gl_TexCoord[1].st).r;                                   "\r
+                       "       if(layer_key)                                                                                                           "\r
+                       "               a *= texture2D(plane[4], gl_TexCoord[1].st).r;                                  "\r
                        "       if(HD)                                                                                                                          "\r
                        "               gl_FragColor = ycbcra_to_bgra_hd(y, cb, cr, a) * gl_Color * gain;"\r
                        "       else                                                                                                                            "\r
@@ -287,7 +301,13 @@ public:
                        "       float y  = texture2D(plane[0], gl_TexCoord[0].st).r;                            "\r
                        "       float cb = texture2D(plane[1], gl_TexCoord[0].st).r;                            "\r
                        "       float cr = texture2D(plane[2], gl_TexCoord[0].st).r;                            "\r
-                       "       float a  = texture2D(plane[3], gl_TexCoord[0].st).r;                            "\r
+                       "       float a  = 1.0;                                                                                                         "\r
+                       "       if(local_key)                                                                                                           "\r
+                       "               a = texture2D(plane[3], gl_TexCoord[1].st).r;                                   "\r
+                       "       else                                                                                                                            "\r
+                       "               a  = texture2D(plane[3], gl_TexCoord[0].st).r;                                  "\r
+                       "       if(layer_key)                                                                                                           "\r
+                       "               a *= texture2D(plane[4], gl_TexCoord[1].st).r;                                  "\r
                        "       if(HD)                                                                                                                          "\r
                        "               gl_FragColor = ycbcra_to_bgra_hd(y, cb, cr, a) * gl_Color * gain;"\r
                        "       else                                                                                                                            "\r
@@ -300,7 +320,7 @@ public:
 \r
 image_kernel::image_kernel() : impl_(new implementation()){}\r
 \r
-void image_kernel::draw(size_t width, size_t height, const core::pixel_format_desc& pix_desc, const core::image_transform& transform, bool has_separate_key)\r
+void image_kernel::draw(size_t width, size_t height, const core::pixel_format_desc& pix_desc, const core::image_transform& transform, bool local_key, bool layer_key)\r
 {\r
        GL(glEnable(GL_TEXTURE_2D));\r
        GL(glDisable(GL_DEPTH_TEST));   \r
@@ -309,7 +329,8 @@ void image_kernel::draw(size_t width, size_t height, const core::pixel_format_de
 \r
        GL(glUniform1f(impl_->shaders()[pix_desc.pix_fmt].get_location("gain"), static_cast<GLfloat>(transform.get_gain())));\r
        GL(glUniform1i(impl_->shaders()[pix_desc.pix_fmt].get_location("HD"), pix_desc.planes.at(0).height > 700 ? 1 : 0));\r
-       GL(glUniform1i(impl_->shaders()[pix_desc.pix_fmt].get_location("has_separate_key"), has_separate_key ? 1 : 0));\r
+       GL(glUniform1i(impl_->shaders()[pix_desc.pix_fmt].get_location("local_key"), local_key ? 1 : 0));\r
+       GL(glUniform1i(impl_->shaders()[pix_desc.pix_fmt].get_location("layer_key"), layer_key ? 1 : 0));\r
 \r
        if(transform.get_mode() == core::video_mode::upper)\r
                glPolygonStipple(upper_pattern);\r
index 4c07091fa877951f8629b1d8f3f930cca70fb18a..8eeaffb95a7af5cac2bb059c4e09c68090ee5b0e 100644 (file)
@@ -30,7 +30,7 @@ class image_kernel
 {\r
 public:\r
        image_kernel();\r
-       void draw(size_t width, size_t height, const core::pixel_format_desc& pix_desc, const core::image_transform& mode, bool has_seperate_key);\r
+       void draw(size_t width, size_t height, const core::pixel_format_desc& pix_desc, const core::image_transform& mode, bool local_key, bool layer_key);\r
 \r
 private:\r
        struct implementation;\r
index a3b68a257a6c17a4ce48cbe058bccd4dd0408942..92fa718923f072030595c89b9e33aa0693783a36 100644 (file)
@@ -56,29 +56,33 @@ struct image_mixer::implementation : boost::noncopyable
 \r
        const core::video_format_desc format_desc_;\r
        \r
-       std::stack<core::image_transform> transform_stack_;\r
-\r
-       bool is_key_;\r
-\r
-       safe_ptr<device_buffer> front_target_;\r
-       safe_ptr<device_buffer> back_target_;\r
-       safe_ptr<device_buffer> key_target_;\r
-\r
-       safe_ptr<host_buffer>   reading_;\r
-\r
+       std::stack<core::image_transform>               transform_stack_;\r
+       std::vector<std::vector<render_item>>   transferring_queue_;\r
+       std::vector<std::vector<render_item>>   render_queue_;\r
+       \r
        image_kernel kernel_;\r
                \r
-       std::vector<render_item> waiting_queue_;\r
-       std::vector<render_item> render_queue_;\r
+       safe_ptr<host_buffer>   read_buffer_;\r
+       \r
+       safe_ptr<device_buffer> draw_buffer_;\r
+       safe_ptr<device_buffer> write_buffer_;\r
+\r
+       safe_ptr<device_buffer> local_key_buffer_;\r
+       safe_ptr<device_buffer> layer_key_buffer_;\r
+\r
+       bool local_key_;\r
+       bool layer_key_;\r
 \r
 public:\r
        implementation(const core::video_format_desc& format_desc) \r
                : format_desc_(format_desc)\r
-               , is_key_(false)\r
-               , back_target_(ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4))\r
-               , front_target_(ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4))\r
-               , key_target_(ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4))\r
-               , reading_(ogl_device::create_host_buffer(format_desc_.size, host_buffer::read_only))\r
+               , read_buffer_(ogl_device::create_host_buffer(format_desc_.size, host_buffer::read_only))\r
+               , draw_buffer_(ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4))\r
+               , write_buffer_ (ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4))\r
+               , local_key_buffer_(ogl_device::create_device_buffer(format_desc.width, format_desc.height, 1))\r
+               , layer_key_buffer_(ogl_device::create_device_buffer(format_desc.width, format_desc.height, 1))\r
+               , local_key_(false)\r
+               , layer_key_(false)\r
        {\r
                transform_stack_.push(core::image_transform());\r
        }\r
@@ -93,10 +97,10 @@ public:
                auto gpu_frame = dynamic_cast<gpu_write_frame*>(&frame);\r
                if(!gpu_frame)\r
                        return;\r
-               \r
-               auto desc = gpu_frame->get_pixel_format_desc();\r
-               auto buffers = gpu_frame->get_plane_buffers();\r
-               auto transform = transform_stack_.top();\r
+                               \r
+               auto desc               = gpu_frame->get_pixel_format_desc();\r
+               auto buffers    = gpu_frame->get_plane_buffers();\r
+               auto transform  = transform_stack_.top()*gpu_frame->get_image_transform();\r
 \r
                ogl_device::begin_invoke([=]\r
                {\r
@@ -105,15 +109,16 @@ public:
                        item.desc = desc;\r
                        item.transform = transform;\r
                        \r
+                       // Start transfer from host to device.\r
+\r
                        for(size_t n = 0; n < buffers.size(); ++n)\r
                        {\r
-                               GL(glActiveTexture(GL_TEXTURE0+n));\r
                                auto texture = ogl_device::create_device_buffer(desc.planes[n].width, desc.planes[n].height, desc.planes[n].channels);\r
                                texture->read(*buffers[n]);\r
                                item.textures.push_back(texture);\r
                        }       \r
 \r
-                       waiting_queue_.push_back(item);\r
+                       transferring_queue_.back().push_back(item);\r
                });\r
        }\r
 \r
@@ -122,89 +127,105 @@ public:
                transform_stack_.pop();\r
        }\r
 \r
+       void begin_layer()\r
+       {\r
+               ogl_device::begin_invoke([=]\r
+               {\r
+                       transferring_queue_.push_back(std::vector<render_item>());\r
+               });\r
+       }\r
+\r
+       void end_layer()\r
+       {\r
+       }\r
+\r
        boost::unique_future<safe_ptr<const host_buffer>> render()\r
        {\r
                auto result = ogl_device::begin_invoke([=]() -> safe_ptr<const host_buffer>\r
                {\r
-                       reading_->map(); // Might block.\r
-                       return reading_;\r
+                       read_buffer_->map(); // Might block.\r
+                       return read_buffer_;\r
                });\r
                        \r
                ogl_device::begin_invoke([=]\r
                {\r
-                       is_key_ = false;\r
+                       local_key_ = false;\r
+                       layer_key_ = false;\r
 \r
-                       // Clear and bind frame-buffers.\r
+                       // Clear buffers.\r
+                       local_key_buffer_->clear();\r
+                       layer_key_buffer_->clear();\r
+                       draw_buffer_->clear();\r
 \r
-                       key_target_->attach();\r
-                       GL(glClear(GL_COLOR_BUFFER_BIT));       \r
+                       // Draw items in device.\r
 \r
-                       front_target_->attach();\r
-                       GL(glClear(GL_COLOR_BUFFER_BIT));\r
+                       BOOST_FOREACH(auto layer, render_queue_)\r
+                       {\r
+                               draw_buffer_->attach(); \r
 \r
-                       // Render items.\r
+                               BOOST_FOREACH(auto item, layer)                 \r
+                                       draw(item);     \r
+                                                               \r
+                               layer_key_ = local_key_; // If there was only key in last layer then use it as key for the entire next layer.\r
+                               local_key_ = false;\r
 \r
-                       BOOST_FOREACH(auto item, render_queue_)\r
-                               render(item);                   \r
+                               std::swap(local_key_buffer_, layer_key_buffer_);\r
+                               layer_key_buffer_->bind(4);\r
+                       }\r
 \r
                        // Move waiting items to queue.\r
 \r
-                       render_queue_ = std::move(waiting_queue_);\r
+                       render_queue_ = std::move(transferring_queue_);\r
 \r
-                       // Start read-back.\r
+                       // Start transfer from device to host.\r
 \r
-                       reading_ = ogl_device::create_host_buffer(format_desc_.size, host_buffer::read_only);\r
-                       front_target_->attach();\r
-                       front_target_->write(*reading_);\r
-                       std::swap(front_target_, back_target_);\r
+                       read_buffer_ = ogl_device::create_host_buffer(format_desc_.size, host_buffer::read_only);\r
+                       draw_buffer_->attach();\r
+                       draw_buffer_->write(*read_buffer_);\r
+\r
+                       std::swap(draw_buffer_, write_buffer_);\r
                });\r
 \r
                return std::move(result);\r
        }\r
-\r
-       void render(const render_item& item)\r
-       {               \r
-               const auto desc          = item.desc;\r
-               auto       textures      = item.textures;\r
-               const auto transform = item.transform;\r
-                               \r
+       \r
+       void draw(const render_item& item)\r
+       {                                               \r
                // Bind textures\r
 \r
-               for(size_t n = 0; n < textures.size(); ++n)\r
-               {\r
-                       GL(glActiveTexture(GL_TEXTURE0+n));\r
-                       textures[n]->bind();\r
-               }               \r
+               for(size_t n = 0; n < item.textures.size(); ++n)\r
+                       item.textures[n]->bind(n);              \r
 \r
                // Setup key and kernel\r
 \r
-               bool has_separate_key = false;\r
-\r
-               if(transform.get_is_key())\r
+               bool local_key = false;\r
+               bool layer_key = false;\r
+               \r
+               if(item.transform.get_is_key())\r
                {\r
-                       if(!is_key_)\r
+                       if(!local_key_)\r
                        {\r
-                               key_target_->attach();\r
-                               is_key_ = true;\r
-                               GL(glClear(GL_COLOR_BUFFER_BIT));               \r
+                               local_key_buffer_->clear();\r
+                               local_key_buffer_->attach();\r
+                               local_key_ = true;\r
                        }\r
                }               \r
                else\r
-               {                                               \r
-                       if(is_key_)\r
-                       {\r
-                               has_separate_key = true;\r
-                               is_key_ = false;\r
+               {               \r
+                       local_key = local_key_;\r
+                       layer_key = layer_key_;\r
 \r
-                               front_target_->attach();                        \r
-                               GL(glActiveTexture(GL_TEXTURE0+3));\r
-                               key_target_->bind();\r
-                       }       \r
+                       if(local_key_)\r
+                       {\r
+                               local_key_buffer_->bind(3);\r
+                               draw_buffer_->attach(); \r
+                               local_key_ = false;\r
+                       }                       \r
                }       \r
 \r
                // Draw\r
 \r
-               kernel_.draw(format_desc_.width, format_desc_.height, desc, transform, has_separate_key);       \r
+               kernel_.draw(format_desc_.width, format_desc_.height, item.desc, item.transform, local_key, layer_key); \r
        }\r
                        \r
        std::vector<safe_ptr<host_buffer>> create_buffers(const core::pixel_format_desc& format)\r
@@ -224,5 +245,7 @@ void image_mixer::visit(core::write_frame& frame){impl_->visit(frame);}
 void image_mixer::end(){impl_->end();}\r
 boost::unique_future<safe_ptr<const host_buffer>> image_mixer::render(){return impl_->render();}\r
 std::vector<safe_ptr<host_buffer>> image_mixer::create_buffers(const core::pixel_format_desc& format){return impl_->create_buffers(format);}\r
+void image_mixer::begin_layer(){impl_->begin_layer();}\r
+void image_mixer::end_layer(){impl_->end_layer();}\r
 \r
 }}
\ No newline at end of file
index 537ac6eabca45be6859d88734dcba0c0fa20fe62..cdedbef9dc5886a707e65374469e405fabaf6723 100644 (file)
@@ -42,6 +42,9 @@ public:
        virtual void begin(const core::basic_frame& frame);\r
        virtual void visit(core::write_frame& frame);\r
        virtual void end();\r
+\r
+       void begin_layer();\r
+       void end_layer();\r
        \r
        boost::unique_future<safe_ptr<const host_buffer>> render();\r
 \r
index 2c5c402915149481ac2758004f5e03980441411a..d6620ffb015837fba398de7a070cd33b79e51d50 100644 (file)
@@ -204,18 +204,18 @@ bool MixerCommand::DoExecute()
                {\r
                        if(_parameters[1] == L"IS_KEY")\r
                        {\r
-                               //bool value = lexical_cast_or_default(_parameters.at(2), false);\r
-                               //auto transform = [=](image_transform transform) -> image_transform\r
-                               //{\r
-                               //      transform.set_is_key(value);\r
-                               //      return transform;                                       \r
-                               //};\r
-\r
-                               //int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
-                               //if(layer != std::numeric_limits<int>::min())                                  \r
-                               //      GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, 0);\r
-                               //else\r
-                               //      GetChannel()->mixer()->apply_image_transform(transform, 0);\r
+                               bool value = lexical_cast_or_default(_parameters.at(2), false);\r
+                               auto transform = [=](image_transform transform) -> image_transform\r
+                               {\r
+                                       transform.set_is_key(value);\r
+                                       return transform;                                       \r
+                               };\r
+\r
+                               int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
+                               if(layer != std::numeric_limits<int>::min())                                    \r
+                                       GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, 0);\r
+                               else\r
+                                       GetChannel()->mixer()->apply_image_transform(transform, 0);\r
                        }\r
                        else if(_parameters[1] == L"OPACITY")\r
                        {\r
index 523a89ee4826556b214c929e3557ddc0c2652624..c6de7991f2f4cd2b93803b383760d07c5f8a577d 100644 (file)
@@ -5,21 +5,21 @@
     <log-path>L:\\Casparcg\\_log\\</log-path>\r
     <data-path>L:\\Casparcg\\_data\\</data-path>\r
     <template-path>L:\\Casparcg\\_templates\\</template-path>\r
-    <template-host>cg.fth.1920x1080p29.97</template-host>\r
+    <template-host>cg.fth.1920x1080i59.94</template-host>\r
   </paths>\r
   <diagnostics>\r
     <graphs>true</graphs>\r
   </diagnostics>\r
   <channels>\r
     <channel>\r
-      <videomode>PAL</videomode>\r
+      <videomode>1080i5000</videomode>\r
       <consumers>\r
         <decklink>\r
           <device>1</device>\r
           <embedded-audio>true</embedded-audio>\r
           <latency>low</latency>\r
           <key>external</key>\r
-          <output>key_and_fill</output>\r
+          <output>default</output>\r
         </decklink>\r
         <ogl>\r
           <device>1</device>\r
index 1089edd7ee04c2e00ef3ad38b7617ea850f134b8..70584c1d068730790dca70d36bf9c3d767575b04 100644 (file)
@@ -204,7 +204,7 @@ int main(int argc, wchar_t* argv[])
                        else if(wcmd.substr(0, 1) == L"1")\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"MIXER 1-1 VIDEO KEY_DEPTH 1";\r
+                               wcmd = L"MIXER 1-0 VIDEO IS_KEY 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 \r\nPLAY 1-1";\r
                        else if(wcmd.substr(0, 1) == L"4")\r