]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: decklink_producer: parallelized YUV conversion.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 12 Jan 2011 21:22:06 +0000 (21:22 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 12 Jan 2011 21:22:06 +0000 (21:22 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@345 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/core.vcxproj.filters
core/producer/decklink/decklink_producer.cpp

index a0f54851e99e6ebdb3156895c9ce7a7c73ec96f9..867feb07f991c62486d6fc09609eac45369d1b2d 100644 (file)
     <Filter Include="Source\producer\transition">\r
       <UniqueIdentifier>{26bf9811-1954-46f5-86ce-ecdc26e6db16}</UniqueIdentifier>\r
     </Filter>\r
-    <Filter Include="Source\producer\flash">\r
-      <UniqueIdentifier>{fc25232a-cab1-4c79-962a-b51dc51161fb}</UniqueIdentifier>\r
-    </Filter>\r
-    <Filter Include="Source\producer\flash\interop">\r
-      <UniqueIdentifier>{f99e4727-2b1b-4009-a445-99b11b071e8e}</UniqueIdentifier>\r
-    </Filter>\r
     <Filter Include="Source\producer\image">\r
       <UniqueIdentifier>{3d4314f3-8a39-44e3-a0c9-9b833bb8f809}</UniqueIdentifier>\r
     </Filter>\r
     <Filter Include="Source\producer\decklink">\r
       <UniqueIdentifier>{3685fbd9-c2ff-495c-9864-6b0c5778d852}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="Source\producer\flash">\r
+      <UniqueIdentifier>{fc25232a-cab1-4c79-962a-b51dc51161fb}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\producer\flash\interop">\r
+      <UniqueIdentifier>{f99e4727-2b1b-4009-a445-99b11b071e8e}</UniqueIdentifier>\r
+    </Filter>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="consumer\decklink\DeckLinkAPI_h.h">\r
index 0ab48ba516f879f7771c8e5e0514af9a75285324..dbb258a5cdedc2e5c3bc352184a6c7c168960553 100644 (file)
@@ -55,8 +55,6 @@ class decklink_input : public IDeckLinkInputCallback
        CComQIPtr<IDeckLinkInput>       input_;\r
 \r
        tbb::atomic<ULONG> ref_count_;\r
-       size_t width_;\r
-       size_t height_;\r
        std::shared_ptr<frame_processor_device> frame_processor_;\r
 \r
        tbb::concurrent_bounded_queue<safe_ptr<draw_frame>> frame_buffer_;\r
@@ -73,7 +71,7 @@ public:
                , tail_(draw_frame::empty())\r
        {\r
                ref_count_ = 1;\r
-               frame_buffer_.set_capacity(8);\r
+               frame_buffer_.set_capacity(4);\r
                \r
                CComPtr<IDeckLinkIterator> pDecklinkIterator;\r
                if(FAILED(pDecklinkIterator.CoCreateInstance(CLSID_CDeckLinkIterator)))\r
@@ -185,17 +183,21 @@ public:
                int frame_size = (format_desc_.width * 16 / 8) * format_desc_.height;\r
 \r
                // Convert to planar YUV422\r
-               unsigned char* y = frame->image_data(0).begin();\r
+               unsigned char* y  = frame->image_data(0).begin();\r
                unsigned char* cb = frame->image_data(1).begin();\r
                unsigned char* cr = frame->image_data(2).begin();\r
-\r
-               for(int n = 0; n < frame_size; n += 4)\r
+               \r
+               tbb::parallel_for(tbb::blocked_range<size_t>(0, frame_size/4), \r
+               [&](const tbb::blocked_range<size_t>& r)\r
                {\r
-                       *(cb++) = data[n+0];\r
-                       *(y++)  = data[n+1];\r
-                       *(cr++) = data[n+2];\r
-                       *(y++)  = data[n+3];\r
-               }\r
+                       for(auto n = r.begin(); n != r.end(); ++n)\r
+                       {\r
+                               cb[n]     = data[n*4+0];\r
+                               y [n*2+0] = data[n*4+1];\r
+                               cr[n]     = data[n*4+2];\r
+                               y [n*2+1] = data[n*4+3];\r
+                       }\r
+               });\r
 \r
                head_ = frame;\r
 \r