X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=accelerator%2Fcpu%2Fimage%2Fimage_mixer.cpp;h=f649e018637007149cc10f284f160b81747336d6;hb=9d2956cec60d63cf7db4af80420524327107dc40;hp=5c3b8b1f522623ba208fd9d81bd03d7487a7ae06;hpb=551945d488673572cbf327f202e2d731603348c6;p=casparcg diff --git a/accelerator/cpu/image/image_mixer.cpp b/accelerator/cpu/image/image_mixer.cpp index 5c3b8b1f5..f649e0186 100644 --- a/accelerator/cpu/image/image_mixer.cpp +++ b/accelerator/cpu/image/image_mixer.cpp @@ -44,6 +44,7 @@ #include #include +#include #include #include @@ -151,7 +152,7 @@ class image_renderer { std::pair, boost::shared_future>> last_image_; tbb::concurrent_unordered_map>> sws_contexts_; - std::vector> temp_buffers_; + tbb::concurrent_bounded_queue> temp_buffers_; public: boost::shared_future> operator()(std::vector items, const core::video_format_desc& format_desc) { @@ -273,6 +274,7 @@ private: BOOST_THROW_EXCEPTION(operation_failed() << msg_info("Could not create software scaling context.") << boost::errinfo_api_function("sws_getContext")); auto dest_frame = spl::make_shared(width*height*4); + temp_buffers_.push(dest_frame); { spl::shared_ptr dest_av_frame(avcodec_alloc_frame(), av_free); @@ -282,9 +284,7 @@ private: sws_scale(sws_context.get(), input_av_frame->data, input_av_frame->linesize, 0, input_av_frame->height, dest_av_frame->data, dest_av_frame->linesize); pool.push(sws_context); } - - temp_buffers_.push_back(dest_frame); - + for(std::size_t n = 0; n < source_items.size(); ++n) { if(source_items[n].data == data) @@ -330,6 +330,9 @@ public: if(frame.pixel_format_desc().planes.empty()) return; + + if(frame.pixel_format_desc().planes.at(0).size < 16) + return; if(transform_stack_.back().field_mode == core::field_mode::empty) return;