+ return executor_.invoke([=]() -> std::map<int, safe_ptr<draw_frame>>\r
+ {\r
+ std::map<int, safe_ptr<class draw_frame>> frames;\r
+\r
+ try\r
+ { \r
+ BOOST_FOREACH(auto& layer, layers_) \r
+ frames[layer.first] = draw_frame::empty(); \r
+\r
+ auto format_desc2 = format_desc;\r
+\r
+ tbb::parallel_for_each(layers_.begin(), layers_.end(), [&](std::map<int, layer>::value_type& layer)\r
+ {\r
+ auto transform = transforms_[layer.first].fetch_and_tick(1);\r
+\r
+ frame_producer::flags flags = frame_producer::flags::none;\r
+ if(format_desc2.field_mode != field_mode::progressive)\r
+ {\r
+ flags |= std::abs(transform.fill_scale[1] - 1.0) > 0.0001 ? frame_producer::flags::deinterlace : frame_producer::flags::none;\r
+ flags |= std::abs(transform.fill_translation[1]) > 0.0001 ? frame_producer::flags::deinterlace : frame_producer::flags::none;\r
+ }\r
+\r
+ if(transform.is_key)\r
+ flags |= frame_producer::flags::alpha_only;\r
+\r
+ auto frame = layer.second.receive(flags); \r
+ \r
+ auto frame1 = make_safe<core::draw_frame>(frame);\r
+ frame1->get_frame_transform() = transform;\r
+\r
+ if(format_desc2.field_mode != core::field_mode::progressive)\r
+ { \r
+ auto frame2 = make_safe<core::draw_frame>(frame);\r
+ frame2->get_frame_transform() = transforms_[layer.first].fetch_and_tick(1);\r
+ frame1 = core::draw_frame::interlace(frame1, frame2, format_desc2.field_mode);\r
+ }\r
+\r
+ frames[layer.first] = frame1;\r
+ }); \r
+ }\r
+ catch(...)\r
+ {\r
+ layers_.clear();\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ } \r