]> git.sesse.net Git - casparcg/commitdiff
2.0. mixer: Fixed issues where local_key would not propagate to all frames in a stream.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 20 Jun 2011 09:05:48 +0000 (09:05 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 20 Jun 2011 09:05:48 +0000 (09:05 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@920 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/image/image_mixer.cpp

index 9ca9c12602d89dfda5dbc29adc7e1646b07f2a73..9a5edc8805ff43b3c026917ce544da0410a73ec0 100644 (file)
@@ -53,6 +53,7 @@ struct image_mixer::implementation : boost::noncopyable
        {\r
                pixel_format_desc                                        desc;\r
                std::vector<safe_ptr<device_buffer>> textures;\r
+               int                                                                      tag;\r
                core::image_transform                            transform;\r
        };\r
 \r
@@ -100,7 +101,7 @@ public:
                \r
        void visit(core::write_frame& frame)\r
        {                       \r
-               render_item item = {frame.get_pixel_format_desc(), frame.get_textures(), transform_stack_.top()*frame.get_image_transform()};   \r
+               render_item item = {frame.get_pixel_format_desc(), frame.get_textures(), frame.tag(), transform_stack_.top()*frame.get_image_transform()};      \r
                render_queue_.back().push(item);\r
        }\r
 \r
@@ -160,13 +161,20 @@ public:
                                render_queue.pop();\r
                                \r
                                draw_buffer_->attach(); \r
-\r
+                               \r
                                while(!layer.empty())\r
                                {\r
-                                       auto frame = layer.front();\r
-                                       layer.pop();\r
+                                       // Split layer into streams\r
+                                       std::vector<render_item> stream;\r
+                                       do\r
+                                       {\r
+                                               stream.push_back(layer.front());\r
+                                               layer.pop();\r
+                                       }\r
+                                       while(!layer.empty() && layer.front().tag == stream.front().tag);\r
+\r
+                                       draw(stream);\r
 \r
-                                       draw(frame);\r
                                        channel_.ogl().yield(); // Allow quick buffer allocation to execute.\r
                                }\r
 \r
@@ -186,46 +194,53 @@ public:
                return std::move(result.get());\r
        }\r
        \r
-       void draw(const render_item& item)\r
-       {               \r
-               // Bind textures\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 local_key = false;\r
-               bool layer_key = false;\r
+       void draw(const std::vector<render_item>& stream)\r
+       {       \r
+               if(stream.empty())\r
+                       return;                         \r
                \r
-               if(item.transform.get_is_key()) // This is a key frame, render it to the local_key buffer for later use.\r
+               BOOST_FOREACH(auto item, stream)\r
                {\r
-                       if(!local_key_) // Initialize local-key if it is not active.\r
-                       {\r
-                               local_key_buffer_->clear();\r
-                               local_key_buffer_->attach();\r
-                               local_key_ = true;\r
-                       }\r
-               }               \r
-               else // This is a normal frame. Use key buffers if they are active.\r
-               {               \r
-                       local_key = local_key_;\r
-                       layer_key = layer_key_;\r
+                       bool local_key = false;\r
+                       bool layer_key = false;\r
 \r
-                       if(local_key_) // Use local key if we have it.\r
+                       // Setup key and kernel\r
+                                       \r
+                       if(item.transform.get_is_key()) // This is a key frame, render it to the local_key buffer for later use.\r
                        {\r
-                               local_key_buffer_->bind(LOCAL_KEY_INDEX);\r
-                               draw_buffer_->attach(); \r
-                               local_key_ = false; // Use it only one time.\r
+                               if(!local_key_) // Initialize local-key if it is not active.\r
+                               {\r
+                                       local_key_buffer_->clear();\r
+                                       local_key_buffer_->attach();\r
+                                       local_key_ = true;\r
+                               }\r
                        }               \r
+                       else // This is a normal frame. Use key buffers if they are active.\r
+                       {               \r
+                               local_key = local_key_;\r
+                               layer_key = layer_key_;\r
+\r
+                               if(local_key_) // Use local key if we have it.\r
+                               {\r
+                                       local_key_buffer_->bind(LOCAL_KEY_INDEX);\r
+                                       draw_buffer_->attach(); \r
+                               }               \r
+\r
+                               if(layer_key_) // Use layer key if we have it.\r
+                                       layer_key_buffer_->bind(LAYER_KEY_INDEX);\r
+                       }       \r
 \r
-                       if(layer_key_) // Use layer key if we have it.\r
-                               layer_key_buffer_->bind(LAYER_KEY_INDEX);\r
-               }       \r
+                       // Bind textures\r
+\r
+                       for(size_t n = 0; n < item.textures.size(); ++n)\r
+                               item.textures[n]->bind(n);              \r
+                       \r
+                       // Draw\r
 \r
-               // Draw\r
+                       kernel_.draw(channel_.get_format_desc().width, channel_.get_format_desc().height, item.desc, item.transform, local_key, layer_key);     \r
+               }\r
 \r
-               kernel_.draw(channel_.get_format_desc().width, channel_.get_format_desc().height, item.desc, item.transform, local_key, layer_key);     \r
+               local_key_ = stream.back().transform.get_is_key(); // Keep for next layer if last frame is key\r
        }\r
                        \r
        safe_ptr<write_frame> create_frame(void* tag, const core::pixel_format_desc& desc)\r