]> git.sesse.net Git - casparcg/blobdiff - core/mixer/mixer.cpp
2.0. image_mixer: Refactored, draw fields in separate draw calls. This way we don...
[casparcg] / core / mixer / mixer.cpp
index 9041b2803ad7ab30c82d626bc71e15812b74fd84..4fbf8d8a5a451cde9df712d57f920aaebbd25729 100644 (file)
@@ -118,35 +118,19 @@ public:
                        {\r
                                auto blend_it = blend_modes_.find(frame.first);\r
                                image_mixer_.begin_layer(blend_it != blend_modes_.end() ? blend_it->second : blend_mode::normal);\r
+                               \r
+                               auto frame1 = make_safe<core::basic_frame>(frame.second);\r
+                               frame1->get_frame_transform() = transforms_[frame.first].fetch_and_tick(1);\r
 \r
                                if(channel_.get_format_desc().field_mode != core::field_mode::progressive)\r
-                               {\r
-                                       auto frame1 = make_safe<core::basic_frame>(frame.second);\r
-                                       frame1->get_frame_transform() = transforms_[frame.first].fetch_and_tick(1);\r
-                               \r
+                               {                               \r
                                        auto frame2 = make_safe<core::basic_frame>(frame.second);\r
                                        frame2->get_frame_transform() = transforms_[frame.first].fetch_and_tick(1);\r
-                                               \r
-                                       if(frame1->get_frame_transform() != frame2->get_frame_transform())\r
-                                               frame2 = core::basic_frame::interlace(frame1, frame2, channel_.get_format_desc().field_mode);\r
-\r
-                                       frame2->accept(audio_mixer_);                                   \r
-                                       frame2->accept(image_mixer_);\r
-                               }\r
-                               else\r
-                               {\r
-                                       auto frame2 = make_safe<core::basic_frame>(frame.second);\r
-                                       frame2->get_frame_transform() = transforms_[frame.first].fetch_and_tick(1);\r
-                                       \r
-                                       // Audio\r
-                                       frame2->accept(audio_mixer_);\r
-\r
-                                       // Video\r
-                                       auto blend_it = blend_modes_.find(frame.first);\r
-                                       image_mixer_.begin_layer(blend_it != blend_modes_.end() ? blend_it->second : blend_mode::normal);\r
-                                       \r
-                                       frame2->accept(image_mixer_);\r
+                                       frame1 = core::basic_frame::interlace(frame1, frame2, channel_.get_format_desc().field_mode);\r
                                }\r
+                                                                       \r
+                               frame1->accept(audio_mixer_);                                   \r
+                               frame1->accept(image_mixer_);\r
 \r
                                image_mixer_.end_layer();\r
                        }\r
@@ -183,7 +167,7 @@ public:
                        auto src = transforms_[index].fetch();\r
                        auto dst = transform;\r
                        transforms_[index] = tweened_transform<frame_transform>(src, dst, mix_duration, tween);\r
-               });\r
+               }, high_priority);\r
        }\r
                                \r
        void apply_transform(int index, const std::function<frame_transform(frame_transform)>& transform, unsigned int mix_duration, const std::wstring& tween)\r
@@ -193,17 +177,24 @@ public:
                        auto src = transforms_[index].fetch();\r
                        auto dst = transform(src);\r
                        transforms_[index] = tweened_transform<frame_transform>(src, dst, mix_duration, tween);\r
-               });\r
+               }, high_priority);\r
        }\r
 \r
        void clear_transforms()\r
        {\r
-               channel_.execution().invoke([&]{transforms_.clear();});\r
+               channel_.execution().invoke([&]\r
+               {\r
+                       transforms_.clear();\r
+                       blend_modes_.clear();\r
+               }, high_priority);\r
        }\r
                \r
        void set_blend_mode(int index, blend_mode::type value)\r
        {\r
-               blend_modes_[index] = value;\r
+               channel_.execution().invoke([&]\r
+               {\r
+                       blend_modes_[index] = value;\r
+               }, high_priority);\r
        }\r
 \r
        std::wstring print() const\r