]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 16 Feb 2012 11:28:39 +0000 (11:28 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 16 Feb 2012 11:28:39 +0000 (11:28 +0000)
accelerator/cpu/image/image_mixer.cpp

index 5c3b8b1f522623ba208fd9d81bd03d7487a7ae06..f649e018637007149cc10f284f160b81747336d6 100644 (file)
@@ -44,6 +44,7 @@
 \r
 #include <tbb/cache_aligned_allocator.h>\r
 #include <tbb/parallel_for_each.h>\r
+#include <tbb/concurrent_queue.h>\r
 \r
 #include <boost/assign.hpp>\r
 #include <boost/foreach.hpp>\r
@@ -151,7 +152,7 @@ class image_renderer
 {\r
        std::pair<std::vector<item>, boost::shared_future<boost::iterator_range<const uint8_t*>>>               last_image_;\r
        tbb::concurrent_unordered_map<int, tbb::concurrent_bounded_queue<std::shared_ptr<SwsContext>>>  sws_contexts_;\r
-       std::vector<spl::shared_ptr<host_buffer>>                                                                                                               temp_buffers_;\r
+       tbb::concurrent_bounded_queue<spl::shared_ptr<host_buffer>>                                                                             temp_buffers_;\r
 public:        \r
        boost::shared_future<boost::iterator_range<const uint8_t*>> operator()(std::vector<item> items, const core::video_format_desc& format_desc)\r
        {       \r
@@ -273,6 +274,7 @@ private:
                                BOOST_THROW_EXCEPTION(operation_failed() << msg_info("Could not create software scaling context.") << boost::errinfo_api_function("sws_getContext"));                           \r
                \r
                        auto dest_frame = spl::make_shared<host_buffer>(width*height*4);\r
+                       temp_buffers_.push(dest_frame);\r
 \r
                        {\r
                                spl::shared_ptr<AVFrame> dest_av_frame(avcodec_alloc_frame(), av_free); \r
@@ -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);                          \r
                                pool.push(sws_context);\r
                        }\r
-\r
-                       temp_buffers_.push_back(dest_frame);\r
-               \r
+                                       \r
                        for(std::size_t n = 0; n < source_items.size(); ++n)\r
                        {\r
                                if(source_items[n].data == data)\r
@@ -330,6 +330,9 @@ public:
 \r
                if(frame.pixel_format_desc().planes.empty())\r
                        return;\r
+               \r
+               if(frame.pixel_format_desc().planes.at(0).size < 16)\r
+                       return;\r
 \r
                if(transform_stack_.back().field_mode == core::field_mode::empty)\r
                        return;\r