]> 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>
Mon, 24 Oct 2011 22:12:09 +0000 (22:12 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 24 Oct 2011 22:12:09 +0000 (22:12 +0000)
common/memory/memcpy.h
modules/decklink/producer/decklink_producer.cpp
modules/ffmpeg/producer/util.cpp
modules/ffmpeg/producer/video/video_decoder.cpp

index 62fa4908f4d0693ef6dc1e9529b8d445faaa8a0d..d731f2a419adabef078c8719af1a1775ea92d300 100644 (file)
@@ -20,6 +20,7 @@
 #pragma once\r
 \r
 #include "../utility/assert.h"\r
+#include "../memory/safe_ptr.h"\r
 \r
 #include <assert.h>\r
 \r
@@ -76,13 +77,8 @@ static void* fast_memcpy(void* dest, const void* source, size_t count)
        return dest;\r
 }\r
 \r
-}\r
-\r
 static void* fast_memcpy_small(void* dest, const void* source, size_t count)\r
 {   \r
-       if((reinterpret_cast<int>(source) & 15) || (reinterpret_cast<int>(dest) & 15))\r
-               return memcpy(reinterpret_cast<char*>(dest),  reinterpret_cast<const char*>(source), count);\r
-\r
        size_t rest = count & 127;\r
        count &= ~127;\r
 \r
@@ -90,6 +86,9 @@ static void* fast_memcpy_small(void* dest, const void* source, size_t count)
        return memcpy(reinterpret_cast<char*>(dest)+count,  reinterpret_cast<const char*>(source)+count, rest);\r
 }\r
 \r
+}\r
+\r
+\r
 static void* fast_memcpy(void* dest, const void* source, size_t count)\r
 {   \r
        if((reinterpret_cast<int>(source) & 15) || (reinterpret_cast<int>(dest) & 15))\r
@@ -103,30 +102,20 @@ static void* fast_memcpy(void* dest, const void* source, size_t count)
                internal::fast_memcpy(reinterpret_cast<char*>(dest) + n*512, reinterpret_cast<const char*>(source) + n*512, 512);   \r
        });\r
 \r
-       return fast_memcpy_small(reinterpret_cast<char*>(dest)+count,  reinterpret_cast<const char*>(source)+count, rest);\r
+       return internal::fast_memcpy_small(reinterpret_cast<char*>(dest)+count,  reinterpret_cast<const char*>(source)+count, rest);\r
 }\r
 \r
-\r
-static void* fast_memcpy_w_align_hack(void* dest, const void* source, size_t count)\r
+template<typename T>\r
+static safe_ptr<T> fast_memdup(const T* source, size_t count)\r
 {      \r
-       auto dest8                      = reinterpret_cast<char*>(dest);\r
-       auto source8            = reinterpret_cast<const char*>(source);\r
-       \r
+       auto dest                       = safe_ptr<T>(reinterpret_cast<T*>(scalable_aligned_malloc(count + 16, 32)), scalable_free);\r
+       auto dest8                      = reinterpret_cast<char*>(dest.get());\r
+       auto source8            = reinterpret_cast<const char*>(source);        \r
        auto source_align       = reinterpret_cast<int>(source) & 15;\r
                \r
-       source8 -= source_align;        \r
-       \r
-       size_t rest = count & 511;\r
-       count &= ~511;\r
-\r
-       Concurrency::parallel_for<int>(0, count / 512, [&](size_t n)\r
-       {       \r
-               internal::fast_memcpy(dest8 + n*512, source8 + n*512, 512);   \r
-       });\r
-\r
-       memcpy(dest8+count, source8+count, rest);\r
+       fast_memcpy(dest8, source8-source_align, count);\r
 \r
-       return dest8+source_align;\r
+       return safe_ptr<T>(reinterpret_cast<T*>(dest8+source_align), [dest](T*){});\r
 }\r
 \r
 \r
index 10fd7947455c2ee4c3ad67825f5eb45954f948be..b85b0b3cb860b18e00594dc2f3347fdf2b7f4bcb 100644 (file)
@@ -296,7 +296,7 @@ public:
                                                Concurrency::send(audio_buffers_, ffmpeg::frame_muxer2::audio_source_element_t(make_safe<core::audio_buffer>(audio_data, audio_data + sample_frame_count*format_desc_.audio_channels), ticket_t()));\r
                                        }\r
                                        else\r
-                                               Concurrency::send(audio_buffers_, ffmpeg::frame_muxer2::audio_source_element_t(ffmpeg::empty_audio(), ticket_t()));     \r
+                                               Concurrency::send(audio_buffers_, ffmpeg::frame_muxer2::audio_source_element_t(make_safe<core::audio_buffer>(format_desc_.audio_samples_per_frame, 0), ticket_t()));    \r
                                });\r
                        }\r
 \r
index 6e7cc342ee2b3562e811f4092013aa5176d68032..bd61a8474029677dee0e9705e4e0dfe577f72383 100644 (file)
@@ -196,7 +196,7 @@ safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_ptr<AVF
                        // Copy line by line since ffmpeg sometimes pads each line.\r
                        Concurrency::parallel_for(0, static_cast<int>(desc.planes[n].height), [&](size_t y)\r
                        {\r
-                               fast_memcpy_small(result + y*plane.linesize, decoded + y*decoded_linesize, plane.linesize);\r
+                               fast_memcpy(result + y*plane.linesize, decoded + y*decoded_linesize, plane.linesize);\r
                        });\r
 \r
                        write->commit(n);\r
index 75190cbd0da12b4cac85eee92482bd35b43e2ee5..29fb2f4ed9b4e8a1379490be1de51b67451d83b9 100644 (file)
@@ -172,22 +172,19 @@ public:
 \r
                auto count = desc.planes.size();\r
                std::array<uint8_t*, 4> org_ptrs;\r
-               std::array<uint8_t*, 4> real_ptrs; // We need to store the "real" pointers, due to alignment hack.\r
+               std::array<safe_ptr<uint8_t>, 4> new_ptrs;\r
                parallel_for<size_t>(0, count, [&](size_t n)\r
                {\r
                        auto size               = frame->linesize[n]*desc.planes[n].height;\r
+                       new_ptrs[n]             = fast_memdup(frame->data[n], size);\r
                        org_ptrs[n]             = frame->data[n];\r
-                       real_ptrs[n]    = reinterpret_cast<uint8_t*>(scalable_aligned_malloc(size+16, 32)); // Allocate 16 byte extra for alignment hack.\r
-                       frame->data[n]  = reinterpret_cast<uint8_t*>(fast_memcpy_w_align_hack(real_ptrs[n], org_ptrs[n], size));\r
+                       frame->data[n]  = new_ptrs[n].get();\r
                });\r
 \r
-               return safe_ptr<AVFrame>(frame.get(), [frame, org_ptrs, real_ptrs, count](AVFrame*)\r
+               return safe_ptr<AVFrame>(frame.get(), [frame, org_ptrs, new_ptrs, count](AVFrame*)\r
                {\r
                        for(size_t n = 0; n < count; ++n)\r
-                       {\r
-                               scalable_aligned_free(real_ptrs[n]);\r
                                frame->data[n] = org_ptrs[n];\r
-                       }\r
                });\r
        }\r
                \r