]> git.sesse.net Git - casparcg/commitdiff
Don't copy AVFrame line by line unless necessary
authorHelge Norberg <helge.norberg@svt.se>
Mon, 23 Nov 2015 19:37:43 +0000 (20:37 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Mon, 23 Nov 2015 19:37:43 +0000 (20:37 +0100)
modules/ffmpeg/producer/util/util.cpp

index c9056288a5df1674204aec124951e6d959363f38..b71e40a4adc9d0d75d273530537a0f647285b472 100644 (file)
@@ -40,6 +40,7 @@
 #include <common/except.h>
 #include <common/array.h>
 #include <common/os/filesystem.h>
+#include <common/memcpy.h>
 
 #include <tbb/parallel_for.h>
 
@@ -241,13 +242,20 @@ core::mutable_frame make_frame(const void* tag, const spl::shared_ptr<AVFrame>&
                        CASPAR_ASSERT(decoded);
                        CASPAR_ASSERT(write.image_data(n).begin());
 
-                       // Copy line by line since ffmpeg sometimes pads each line.
-                       tbb::affinity_partitioner ap;
-                       tbb::parallel_for(tbb::blocked_range<int>(0, desc.planes[n].height), [&](const tbb::blocked_range<int>& r)
+                       if (decoded_linesize != plane.linesize)
                        {
-                               for(int y = r.begin(); y != r.end(); ++y)
-                                       A_memcpy(result + y*plane.linesize, decoded + y*decoded_linesize, plane.linesize);
-                       }, ap);
+                               // Copy line by line since ffmpeg sometimes pads each line.
+                               tbb::affinity_partitioner ap;
+                               tbb::parallel_for(tbb::blocked_range<int>(0, desc.planes[n].height), [&](const tbb::blocked_range<int>& r)
+                               {
+                                       for (int y = r.begin(); y != r.end(); ++y)
+                                               A_memcpy(result + y*plane.linesize, decoded + y*decoded_linesize, plane.linesize);
+                               }, ap);
+                       }
+                       else
+                       {
+                               fast_memcpy(result, decoded, plane.size);
+                       }
                }
        
                return std::move(write);