]> git.sesse.net Git - casparcg/blobdiff - core/mixer/image/image_mixer.cpp
2.0. video_format: Renamed video_mode to field_mode. image_mixer: Refactored field...
[casparcg] / core / mixer / image / image_mixer.cpp
index cc4da64ba883b44a99f50b34093a822d9b442b50..906ceea5a9fc84cda7d5fdbbb60debee5e8b96ca 100644 (file)
@@ -57,7 +57,6 @@ struct image_mixer::implementation : boost::noncopyable
        video_channel_context&                                  channel_;\r
 \r
        std::vector<image_transform>                    transform_stack_;\r
-       std::vector<video_mode::type>                   video_mode_stack_;\r
        std::stack<blend_mode::type>                    blend_mode_stack_;\r
 \r
        std::deque<std::deque<render_item>>             layers_; // layer/stream/items\r
@@ -69,7 +68,6 @@ public:
        implementation(video_channel_context& video_channel) \r
                : channel_(video_channel)\r
                , transform_stack_(1)\r
-               , video_mode_stack_(1, video_mode::progressive)\r
        {\r
        }\r
 \r
@@ -81,22 +79,17 @@ public:
        void begin(core::basic_frame& frame)\r
        {\r
                transform_stack_.push_back(transform_stack_.back()*frame.get_image_transform());\r
-               video_mode_stack_.push_back(frame.get_mode() == video_mode::progressive ? video_mode_stack_.back() : frame.get_mode());\r
        }\r
                \r
        void visit(core::write_frame& frame)\r
        {       \r
-               CASPAR_ASSERT(!layers_.empty());\r
-\r
-               // Check if frame has been discarded by interlacing\r
-               if(boost::range::find(video_mode_stack_, video_mode::upper) != video_mode_stack_.end() && boost::range::find(video_mode_stack_, video_mode::lower) != video_mode_stack_.end())\r
+               if(transform_stack_.back().get_field_mode() == field_mode::empty)\r
                        return;\r
                \r
                core::render_item item;\r
                item.pix_desc           = frame.get_pixel_format_desc();\r
                item.textures           = frame.get_textures();\r
                item.transform          = transform_stack_.back();\r
-               item.mode                       = video_mode_stack_.back();\r
                item.tag                        = frame.tag();\r
                item.blend_mode         = blend_mode_stack_.top();      \r
 \r
@@ -108,7 +101,6 @@ public:
        void end()\r
        {\r
                transform_stack_.pop_back();\r
-               video_mode_stack_.pop_back();\r
        }\r
 \r
        void begin_layer(blend_mode::type blend_mode)\r
@@ -168,15 +160,15 @@ public:
                        int fields = 0;\r
                        BOOST_FOREACH(auto& item, layer)\r
                        {\r
-                               if(fields & item.mode)\r
+                               if(fields & item.transform.get_field_mode())\r
                                        item.blend_mode = blend_mode::normal; // Disable blending, it will be used when merging back into render stack.\r
                                else\r
                                {\r
                                        item.blend_mode = blend_mode::replace; // Target field is empty, no blending, just copy\r
-                                       fields |= item.mode;\r
+                                       fields |= item.transform.get_field_mode();\r
                                }\r
 \r
-                               draw_item(std::move(item), local_draw_buffer, local_key_buffer, layer_key_buffer);              \r
+                               draw_item(std::move(item), *local_draw_buffer, local_key_buffer, layer_key_buffer);             \r
                        }\r
                        \r
                        render_item item;\r
@@ -185,21 +177,21 @@ public:
                        item.textures.push_back(local_draw_buffer);\r
                        item.blend_mode = local_blend_mode;\r
 \r
-                       kernel_.draw(channel_.ogl(), std::move(item), draw_buffer, nullptr, nullptr);\r
+                       kernel_.draw(channel_.ogl(), std::move(item), *draw_buffer, nullptr, nullptr);\r
                }\r
                else // fast path\r
                {\r
                        BOOST_FOREACH(auto& item, layer)                \r
-                               draw_item(std::move(item), draw_buffer, local_key_buffer, layer_key_buffer);            \r
+                               draw_item(std::move(item), *draw_buffer, local_key_buffer, layer_key_buffer);           \r
                }                                       \r
 \r
-               CASPAR_ASSERT(local_key_buffer.first == 0 || local_key_buffer.first == core::video_mode::progressive);\r
+               CASPAR_ASSERT(local_key_buffer.first == 0 || local_key_buffer.first == core::field_mode::progressive);\r
 \r
                std::swap(local_key_buffer.second, layer_key_buffer);\r
        }\r
 \r
        void draw_item(render_item&&                                                                    item, \r
-                                  const safe_ptr<device_buffer>&                                       draw_buffer, \r
+                                  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
@@ -211,13 +203,13 @@ public:
                                local_key_buffer.second = create_device_buffer(1);\r
                        }\r
                        \r
-                       local_key_buffer.first |= item.mode; // Add field to flag.\r
-                       kernel_.draw(channel_.ogl(), std::move(item), make_safe(local_key_buffer.second), nullptr, nullptr);\r
+                       local_key_buffer.first |= item.transform.get_field_mode(); // Add field to flag.\r
+                       kernel_.draw(channel_.ogl(), std::move(item), *local_key_buffer.second, nullptr, nullptr);\r
                }\r
                else\r
                {\r
                        kernel_.draw(channel_.ogl(), std::move(item), draw_buffer, local_key_buffer.second, layer_key_buffer);\r
-                       local_key_buffer.first ^= item.mode; // Remove field from flag.\r
+                       local_key_buffer.first ^= item.transform.get_field_mode(); // Remove field from flag.\r
                        \r
                        if(local_key_buffer.first == 0) // If all fields from key has been used, reset it\r
                        {\r