]> git.sesse.net Git - casparcg/commitdiff
2.0. image_mixer: Fixed problems interlacing with progressive local separate key.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 17 Aug 2011 11:10:29 +0000 (11:10 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 17 Aug 2011 11:10:29 +0000 (11:10 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1204 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/image/image_mixer.cpp
core/producer/transition/transition_producer.cpp

index ac24a170cba8355ac1b7566654086d044f1d5359..6967cf6b998a9ea063fbaa0599ea1f7c662c55f8 100644 (file)
@@ -150,7 +150,7 @@ public:
                if(layer.empty())\r
                        return;\r
 \r
-               std::shared_ptr<device_buffer> local_key_buffer;\r
+               std::pair<int, std::shared_ptr<device_buffer>> local_key_buffer;\r
                                        \r
                if(has_overlapping_items(layer, layer.front().transform.get_blend_mode()))\r
                {\r
@@ -170,24 +170,40 @@ public:
                                draw_item(std::move(item), draw_buffer, local_key_buffer, layer_key_buffer);            \r
                }                                       \r
 \r
-               std::swap(local_key_buffer, layer_key_buffer);\r
+               CASPAR_ASSERT(local_key_buffer.first == 0 || local_key_buffer.first == core::video_mode:progressive);\r
+\r
+               std::swap(local_key_buffer.second, layer_key_buffer);\r
        }\r
 \r
-       void draw_item(render_item&& item, const safe_ptr<device_buffer>& draw_buffer, std::shared_ptr<device_buffer>& local_key_buffer, std::shared_ptr<device_buffer>& layer_key_buffer)\r
+       void draw_item(render_item&&                                                                    item, \r
+                                  const safe_ptr<device_buffer>&                                       draw_buffer, \r
+                                  std::pair<int, std::shared_ptr<device_buffer>>&      local_key_buffer, \r
+                                  std::shared_ptr<device_buffer>&                                      layer_key_buffer)\r
        {                                                                                       \r
                if(item.transform.get_is_key())\r
                {\r
-                       if(!local_key_buffer)\r
-                               local_key_buffer = create_device_buffer(1);\r
+                       if(!local_key_buffer.second)\r
+                       {\r
+                               local_key_buffer.first = 0;\r
+                               local_key_buffer.second = create_device_buffer(1);\r
+                       }\r
 \r
                        item.transform.set_opacity(1.0);\r
                        item.transform.set_blend_mode(image_transform::blend_mode::normal);\r
-                       kernel_.draw(channel_.ogl(), std::move(item), make_safe(local_key_buffer), nullptr, nullptr);\r
+\r
+                       local_key_buffer.first |= item.mode;\r
+                       kernel_.draw(channel_.ogl(), std::move(item), make_safe(local_key_buffer.second), nullptr, nullptr);\r
                }\r
                else\r
                {\r
-                       kernel_.draw(channel_.ogl(), std::move(item), draw_buffer, local_key_buffer, layer_key_buffer);\r
-                       local_key_buffer.reset();\r
+                       kernel_.draw(channel_.ogl(), std::move(item), draw_buffer, local_key_buffer.second, layer_key_buffer);\r
+                       local_key_buffer.first ^= item.mode;\r
+                       \r
+                       if(local_key_buffer.first == 0)\r
+                       {\r
+                               local_key_buffer.first = 0;\r
+                               local_key_buffer.second.reset();\r
+                       }\r
                }\r
        }\r
 \r
index b2f1dbafb7a4c04ea98971e525cdc740b1c92693..ca8092644a9d3fb0454c0cf5832057a1915e393a 100644 (file)
@@ -85,7 +85,7 @@ struct transition_producer : public frame_producer
                                source = source_producer_->last_frame();\r
                });\r
 \r
-               return last_frame_ = compose(dest, source);\r
+               return compose(dest, source);\r
        }\r
 \r
        virtual safe_ptr<core::basic_frame> last_frame() const\r
@@ -159,6 +159,8 @@ struct transition_producer : public frame_producer
                const auto s_frame = s_frame1->get_image_transform() == s_frame2->get_image_transform() ? s_frame2 : basic_frame::interlace(s_frame1, s_frame2, mode_);\r
                const auto d_frame = d_frame1->get_image_transform() == d_frame2->get_image_transform() ? d_frame2 : basic_frame::interlace(d_frame1, d_frame2, mode_);\r
                \r
+               last_frame_ = basic_frame::combine(s_frame2, d_frame2);\r
+\r
                return basic_frame::combine(s_frame, d_frame);\r
        }\r
 };\r