From: Helge Norberg Date: Mon, 23 Nov 2015 19:37:43 +0000 (+0100) Subject: Don't copy AVFrame line by line unless necessary X-Git-Tag: 2.1.0_Beta1~171 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=d604fa0c28761b84d92541e4d610cc26daf10f1e;p=casparcg Don't copy AVFrame line by line unless necessary --- diff --git a/modules/ffmpeg/producer/util/util.cpp b/modules/ffmpeg/producer/util/util.cpp index c9056288a..b71e40a4a 100644 --- a/modules/ffmpeg/producer/util/util.cpp +++ b/modules/ffmpeg/producer/util/util.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include @@ -241,13 +242,20 @@ core::mutable_frame make_frame(const void* tag, const spl::shared_ptr& 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(0, desc.planes[n].height), [&](const tbb::blocked_range& 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(0, desc.planes[n].height), [&](const tbb::blocked_range& 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);