#include <common/concurrency/executor.h>\r
#include <common/utility/tweener.h>\r
#include <common/env.h>\r
+#include <common/gl/gl_check.h>\r
\r
#include <core/mixer/read_frame.h>\r
#include <core/mixer/write_frame.h>\r
\r
safe_ptr<read_frame> execute(const std::map<int, safe_ptr<core::basic_frame>>& frames)\r
{ \r
- try\r
- {\r
- decltype(mix_image(frames)) image;\r
- decltype(mix_audio(frames)) audio;\r
-\r
- tbb::parallel_invoke\r
- (\r
- [&]{image = mix_image(frames);}, \r
- [&]{audio = mix_audio(frames);}\r
- );\r
+ decltype(mix_image(frames)) image;\r
+ decltype(mix_audio(frames)) audio;\r
+\r
+ tbb::parallel_invoke\r
+ (\r
+ [&]{image = mix_image(frames);}, \r
+ [&]{audio = mix_audio(frames);}\r
+ );\r
\r
- buffer_.push(std::make_pair(std::move(image), audio));\r
+ buffer_.push(std::make_pair(std::move(image), audio));\r
\r
- if(buffer_.size() > buffer_size_)\r
- {\r
- auto res = std::move(buffer_.front());\r
- buffer_.pop();\r
- \r
- return make_safe<read_frame>(channel_.ogl(), channel_.get_format_desc().size, std::move(res.first.get()), std::move(res.second));\r
- }\r
- }\r
- catch(...)\r
- {\r
- channel_.ogl().gc().wait();\r
- image_mixer_ = image_mixer(channel_);\r
- audio_mixer_ = audio_mixer(channel_.get_format_desc());\r
- channel_.ogl().gc().wait();\r
-\r
- CASPAR_LOG_CURRENT_EXCEPTION();\r
- }\r
+ if(buffer_.size()-1 < buffer_size_) \r
+ return make_safe<read_frame>();\r
\r
- return make_safe<read_frame>();\r
- }\r
+ auto res = std::move(buffer_.front());\r
+ buffer_.pop();\r
\r
+ return make_safe<read_frame>(channel_.ogl(), channel_.get_format_desc().size, std::move(res.first.get()), std::move(res.second)); \r
+ }\r
+ \r
safe_ptr<core::write_frame> create_frame(const void* tag, const core::pixel_format_desc& desc)\r
{ \r
return image_mixer_.create_frame(tag, desc);\r