]> git.sesse.net Git - casparcg/commitdiff
On Linux Decklink cannot DMA transfer from memory returned by glMapBuffer. Thanks...
authorHelge Norberg <helge.norberg@svt.se>
Tue, 5 Jan 2016 22:02:47 +0000 (23:02 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Tue, 5 Jan 2016 22:02:47 +0000 (23:02 +0100)
modules/decklink/CMakeLists.txt
modules/decklink/consumer/decklink_consumer.cpp

index a379f27428d6f37825c817293e2dc9308178e453..84ce9d29f7714c417f4217a51a1d4b92e76c3227 100644 (file)
@@ -60,6 +60,7 @@ include_directories(${BOOST_INCLUDE_PATH})
 include_directories(${TBB_INCLUDE_PATH})
 include_directories(${FFMPEG_INCLUDE_PATH})
 include_directories(${RXCPP_INCLUDE_PATH})
+include_directories(${ASMLIB_INCLUDE_PATH})
 
 set_target_properties(decklink PROPERTIES FOLDER modules)
 source_group(sources ./*)
index 2031d19d675afdb00cbac41b76d739c5c06c83f4..58a53e658f10e618ff4d1d752936df04ab9b5ba2 100644 (file)
@@ -40,6 +40,8 @@
 #include <common/diagnostics/graph.h>
 #include <common/except.h>
 #include <common/memshfl.h>
+#include <common/memcpy.h>
+#include <common/no_init_proxy.h>
 #include <common/array.h>
 #include <common/future.h>
 #include <common/cache_aligned_vector.h>
@@ -168,12 +170,12 @@ void set_keyer(
 
 class decklink_frame : public IDeckLinkVideoFrame
 {
-       tbb::atomic<int>                                ref_count_;
-       core::const_frame                               frame_;
-       const core::video_format_desc   format_desc_;
+       tbb::atomic<int>                                                                ref_count_;
+       core::const_frame                                                               frame_;
+       const core::video_format_desc                                   format_desc_;
 
-       const bool                                              key_only_;
-       cache_aligned_vector<uint8_t>   data_;
+       const bool                                                                              key_only_;
+       cache_aligned_vector<no_init_proxy<uint8_t>>    data_;
 public:
        decklink_frame(core::const_frame frame, const core::video_format_desc& format_desc, bool key_only)
                : frame_(frame)
@@ -216,7 +218,7 @@ public:
                {
                        if(static_cast<int>(frame_.image_data().size()) != format_desc_.size)
                        {
-                               data_.resize(format_desc_.size, 0);
+                               data_.resize(format_desc_.size);
                                *buffer = data_.data();
                        }
                        else if(key_only_)
@@ -229,7 +231,16 @@ public:
                                *buffer = data_.data();
                        }
                        else
+                       {
                                *buffer = const_cast<uint8_t*>(frame_.image_data().begin());
+
+#if !defined(_MSC_VER)
+                               // On Linux Decklink cannot DMA transfer from memory returned by glMapBuffer
+                               data_.resize(frame_.image_data().size());
+                               fast_memcpy(data_.data(), *buffer, frame_.image_data().size());
+                               *buffer = data_.data();
+#endif
+                       }
                }
                catch(...)
                {