#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
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
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