]> git.sesse.net Git - casparcg/blobdiff - core/producer/transition/transition_producer.cpp
2.0. - image_mixer: Fixed bug where amongst others mixing to alpha did not work.
[casparcg] / core / producer / transition / transition_producer.cpp
index e25bb0c95de5cb81a96568611344ef7d2263c608..b2f1dbafb7a4c04ea98971e525cdc740b1c92693 100644 (file)
@@ -27,6 +27,8 @@
 #include <core/producer/frame/image_transform.h>\r
 #include <core/producer/frame/audio_transform.h>\r
 \r
+#include <tbb/parallel_invoke.h>\r
+\r
 namespace caspar { namespace core {    \r
 \r
 struct transition_producer : public frame_producer\r
@@ -66,20 +68,29 @@ struct transition_producer : public frame_producer
                if(current_frame_++ >= info_.duration)\r
                        return basic_frame::eof();\r
                \r
-               auto dest = receive_and_follow(dest_producer_, hints);\r
-               if(dest == core::basic_frame::late())\r
-                       dest = dest_producer_->last_frame();\r
-               \r
-               auto source = receive_and_follow(source_producer_, hints);\r
-               if(source == core::basic_frame::late())\r
-                       source = source_producer_->last_frame();\r
+               auto dest = basic_frame::empty();\r
+               auto source = basic_frame::empty();\r
+\r
+               tbb::parallel_invoke(\r
+               [&]\r
+               {\r
+                       dest = receive_and_follow(dest_producer_, hints);\r
+                       if(dest == core::basic_frame::late())\r
+                               dest = dest_producer_->last_frame();\r
+               },\r
+               [&]\r
+               {\r
+                       source = receive_and_follow(source_producer_, hints);\r
+                       if(source == core::basic_frame::late())\r
+                               source = source_producer_->last_frame();\r
+               });\r
 \r
                return last_frame_ = compose(dest, source);\r
        }\r
 \r
        virtual safe_ptr<core::basic_frame> last_frame() const\r
        {\r
-               return last_frame_;\r
+               return disable_audio(last_frame_);\r
        }\r
 \r
        virtual int64_t nb_frames() const \r
@@ -121,7 +132,10 @@ struct transition_producer : public frame_producer
                if(info_.type == transition::mix)\r
                {\r
                        d_frame1->get_image_transform().set_opacity(delta1);    \r
-                       d_frame2->get_image_transform().set_opacity(delta2);    \r
+                       d_frame2->get_image_transform().set_opacity(delta2);\r
+\r
+                       s_frame1->get_image_transform().set_opacity(1.0-delta1);        \r
+                       s_frame2->get_image_transform().set_opacity(1.0-delta2);                \r
                }\r
                else if(info_.type == transition::slide)\r
                {\r