From: Ronag Date: Mon, 15 Aug 2011 06:09:55 +0000 (+0000) Subject: git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches... X-Git-Tag: 2.0.1~164 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=e5e9cd98079ff77ba38368c99d71597eb3942055;p=casparcg git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1176 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- diff --git a/core/mixer/mixer.cpp b/core/mixer/mixer.cpp index f866c0b0e..3a7939320 100644 --- a/core/mixer/mixer.cpp +++ b/core/mixer/mixer.cpp @@ -116,24 +116,32 @@ public: safe_ptr execute(const std::map>& frames) { - decltype(mix_image(frames)) image; - decltype(mix_audio(frames)) audio; - - tbb::parallel_invoke - ( - [&]{image = mix_image(frames);}, - [&]{audio = mix_audio(frames);} - ); + try + { + decltype(mix_image(frames)) image; + decltype(mix_audio(frames)) audio; + + tbb::parallel_invoke + ( + [&]{image = mix_image(frames);}, + [&]{audio = mix_audio(frames);} + ); - buffer_.push(std::make_pair(std::move(image), audio)); + buffer_.push(std::make_pair(std::move(image), audio)); - if(buffer_.size()-1 < buffer_size_) - return make_safe(); + if(buffer_.size()-1 < buffer_size_) + return make_safe(); - auto res = std::move(buffer_.front()); - buffer_.pop(); - - return make_safe(channel_.ogl(), channel_.get_format_desc().size, std::move(res.first.get()), std::move(res.second)); + auto res = std::move(buffer_.front()); + buffer_.pop(); + + return make_safe(channel_.ogl(), channel_.get_format_desc().size, std::move(res.first.get()), std::move(res.second)); + } + catch(...) + { + CASPAR_LOG(error) << L"[mixer] Error detected."; + throw; + } } safe_ptr create_frame(const void* tag, const core::pixel_format_desc& desc) diff --git a/core/producer/stage.cpp b/core/producer/stage.cpp index 72a2e80e7..fdaa5a0a3 100644 --- a/core/producer/stage.cpp +++ b/core/producer/stage.cpp @@ -85,18 +85,27 @@ public: } std::map> execute() - { - std::map> frames; + { + try + { + std::map> frames; - BOOST_FOREACH(auto& layer, layers_) - frames[layer.first] = basic_frame::empty(); + BOOST_FOREACH(auto& layer, layers_) + frames[layer.first] = basic_frame::empty(); + + tbb::parallel_for_each(layers_.begin(), layers_.end(), [&](std::map::value_type& layer) + { + frames[layer.first] = layer.second.receive(); + }); - tbb::parallel_for_each(layers_.begin(), layers_.end(), [&](std::map::value_type& layer) + return frames; + + } + catch(...) { - frames[layer.first] = layer.second.receive(); - }); - - return frames; + CASPAR_LOG(error) << L"[stage] Error detected"; + throw; + } } void load(int index, const safe_ptr& producer, bool preview, int auto_play_delta)