]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Misc typos.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 28 Apr 2011 11:29:12 +0000 (11:29 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 28 Apr 2011 11:29:12 +0000 (11:29 +0000)
         Changed read_frame into abstract class. Must use read_frame::empty().

git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@652 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

20 files changed:
README.txt
common/memory/memclr.h
common/memory/memcpy.h
core/consumer/frame/read_frame.h
core/consumer/frame_consumer.cpp
core/consumer/frame_consumer_device.h
core/producer/color/color_producer.cpp
core/producer/color/color_producer.h
core/producer/frame/audio_transform.cpp
core/producer/frame/audio_transform.h
core/producer/frame/basic_frame.h
core/producer/frame/image_transform.h
core/producer/frame_producer.cpp
core/producer/frame_producer.h
core/producer/layer.cpp
core/producer/transition/transition_producer.cpp
modules/decklink/consumer/decklink_consumer.cpp
shell/main.cpp
shell/server.cpp
shell/server.h

index 8bae12b1cddcaee7962d3ef7858d5c7b75e0068b..8714842c8c407b35eb4c93958621d6ad5a7c3cd7 100644 (file)
@@ -4,7 +4,6 @@ CasparCG Video and Graphics Playout Server
 Thank you for your interest in CasparCG. The included software\r
 is provided as-is by Sveriges Televison AB.\r
 \r
-\r
 LICENSING\r
 ================================================\r
 CasparCG is distributed under the GNU General Public \r
index 516e398966cdf25cedf9152e99e27cf2c770a55a..19f7ff29b0ae534ac479b5f871eb422a5803e13f 100644 (file)
@@ -25,7 +25,7 @@ namespace caspar {
 \r
 static void* fast_memclr(void* dest, size_t count)\r
 {\r
-       assert(count % (16*4) == 0);\r
+       assert(count % 128 == 0);\r
        assert(dest != nullptr);\r
        assert(source != nullptr);\r
 \r
index 265621e18bbef5a8a82b9d05bd2bdfb6257d2267..a793b60e6f5a66389dd2eba028c6ae975a13dc48 100644 (file)
@@ -29,7 +29,7 @@ namespace internal {
 \r
 static void* fast_memcpy(void* dest, const void* source, size_t count)\r
 {\r
-       assert(count % (16*8) == 0);\r
+       assert(count % 128 == 0);\r
        assert(dest != nullptr);\r
        assert(source != nullptr);\r
 \r
@@ -74,11 +74,11 @@ static void* fast_memcpy(void* dest, const void* source, size_t count)
 \r
 static void* fast_memcpy(void* dest, const void* source, size_t num)\r
 {   \r
-       tbb::affinity_partitioner partitioner;\r
+       tbb::affinity_partitioner ap;\r
        tbb::parallel_for(tbb::blocked_range<size_t>(0, num/128), [&](const tbb::blocked_range<size_t>& r)\r
        {       \r
                internal::fast_memcpy(reinterpret_cast<char*>(dest) + r.begin()*128, reinterpret_cast<const char*>(source) + r.begin()*128, r.size()*128);   \r
-       }, partitioner);   \r
+       }, ap);   \r
        return dest;\r
 }\r
 \r
index bc5cd22ef25c5cb3e47deefb4c38294cb928a971..07c2296b797fbad381972cc235d7138cb177b51c 100644 (file)
@@ -32,12 +32,18 @@ namespace caspar { namespace core {
 class read_frame\r
 {\r
 public:\r
-       virtual const boost::iterator_range<const unsigned char*> image_data() const {return boost::iterator_range<const unsigned char*>();}\r
-       virtual const boost::iterator_range<const short*> audio_data() const {return boost::iterator_range<const short*>();}\r
+       virtual const boost::iterator_range<const unsigned char*> image_data() const = 0;\r
+       virtual const boost::iterator_range<const short*> audio_data() const = 0;\r
 \r
        static safe_ptr<const read_frame> empty()\r
        {\r
-               return safe_ptr<const read_frame>();\r
+               struct empty : public read_frame\r
+               {                       \r
+                       virtual const boost::iterator_range<const unsigned char*> image_data() const {return boost::iterator_range<const unsigned char*>();}\r
+                       virtual const boost::iterator_range<const short*> audio_data() const {return boost::iterator_range<const short*>();}\r
+               };\r
+               static safe_ptr<const empty> frame;\r
+               return frame;\r
        }\r
 };\r
 \r
index 0d57e5a69d003dc46ed104e4d64b00ef328a2e34..479b43f774e28ee6dc8b91f13bf4f0243da3784f 100644 (file)
 \r
 #include <common/memory/safe_ptr.h>\r
 \r
-#include <tbb/spin_rw_mutex.h>\r
-\r
 namespace caspar { namespace core {\r
        \r
-std::vector<const consumer_factory_t> c_factories;\r
-tbb::spin_rw_mutex c_factories_mutex;\r
+std::vector<const consumer_factory_t> g_factories;\r
 \r
 void register_consumer_factory(const consumer_factory_t& factory)\r
 {\r
-       tbb::spin_rw_mutex::scoped_lock(c_factories_mutex, true);\r
-       c_factories.push_back(factory);\r
+       g_factories.push_back(factory);\r
 }\r
 \r
 safe_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params)\r
@@ -41,9 +37,8 @@ safe_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>&
        if(params.empty())\r
                BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("params") << arg_value_info(""));\r
        \r
-       tbb::spin_rw_mutex::scoped_lock(c_factories_mutex, false);\r
        auto consumer = frame_consumer::empty();\r
-       std::any_of(c_factories.begin(), c_factories.end(), [&](const consumer_factory_t& factory) -> bool\r
+       std::any_of(g_factories.begin(), g_factories.end(), [&](const consumer_factory_t& factory) -> bool\r
                {\r
                        try\r
                        {\r
index 2c62e39ebe90c7730ae9b32b7c1cf5bbff998ba5..29d6dfa9121a0bcda921af3ce66ef8ffbb701777 100644 (file)
@@ -23,8 +23,6 @@
 \r
 #include <common/memory/safe_ptr.h>\r
 \r
-#include <vector>\r
-\r
 #include <boost/noncopyable.hpp>\r
 \r
 namespace caspar { namespace core {\r
index 997cf3fba5e0d49bc3b69b8fdce26ba87e0c1990..067662a2b69a6dcf84d9e9fad30601b4595bac81 100644 (file)
@@ -41,14 +41,18 @@ public:
                        BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(narrow(color)) << msg_info("Invalid color code"));\r
 \r
                auto frame = frame_factory->create_frame(this, 1, 1, pixel_format::bgra);\r
+               \r
+               // Read color from hex-string and write to frame pixel.\r
                auto& value = *reinterpret_cast<unsigned long*>(frame->image_data().begin());\r
                std::wstringstream str(color_str_.substr(1));\r
                str >> std::hex >> value;\r
+\r
                frame_ = std::move(frame);\r
        }\r
+\r
+       // frame_producer\r
                        \r
-       virtual safe_ptr<basic_frame> receive() { return frame_; }\r
-       \r
+       virtual safe_ptr<basic_frame> receive() { return frame_; }      \r
        virtual std::wstring print() const { return L"color[" + color_str_ + L"]"; }\r
 };\r
 \r
index f4eff6a848f48016ab1169e22660e08f87d1fd4c..dd280f61fd69586ff7dfca9982991b6811978f8c 100644 (file)
@@ -26,6 +26,6 @@
 \r
 namespace caspar { namespace core {\r
        \r
-       safe_ptr<frame_producer> create_color_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::vector<std::wstring>& params);\r
+safe_ptr<frame_producer> create_color_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::vector<std::wstring>& params);\r
 \r
 }}\r
index abf83068e2b115bbb35376b2609dc99ba4c2c2bd..b6857667283e9c3d8c8b7aa8297738e462ecd75e 100644 (file)
@@ -25,7 +25,7 @@ namespace caspar { namespace core {
        \r
 audio_transform::audio_transform()\r
        : gain_(1.0)\r
-       , audio_(true){}\r
+       , has_audio_(true){}\r
 \r
 void audio_transform::set_gain(double value)\r
 {\r
@@ -39,18 +39,18 @@ double audio_transform::get_gain() const
 \r
 void audio_transform::set_has_audio(bool value)\r
 {\r
-       audio_ = value;\r
+       has_audio_ = value;\r
 }\r
 \r
 bool audio_transform::get_has_audio() const\r
 {\r
-       return audio_;\r
+       return has_audio_;\r
 }\r
 \r
 audio_transform& audio_transform::operator*=(const audio_transform &other) \r
 {\r
        gain_ *= other.gain_;\r
-       audio_ &= other.audio_;\r
+       has_audio_ &= other.has_audio_;\r
        return *this;\r
 }\r
 \r
index a81431d452d5f71ef2aef27bdabb4a72c0e86407..c8747cc18c2618b3f1eeb5771baa6dcf715e2786 100644 (file)
@@ -38,9 +38,19 @@ public:
        const audio_transform operator*(const audio_transform &other) const;\r
 private:\r
        double gain_;\r
-       bool audio_;\r
+       bool has_audio_;\r
 };\r
 \r
 audio_transform tween(double time, const audio_transform& source, const audio_transform& dest, double duration, const tweener_t& tweener);\r
 \r
+inline bool operator==(const audio_transform& lhs, const audio_transform& rhs)\r
+{\r
+       return memcmp(&lhs, &rhs, sizeof(audio_transform)) == 0;\r
+}\r
+\r
+inline bool operator!=(const audio_transform& lhs, const audio_transform& rhs)\r
+{\r
+       return !(lhs == rhs);\r
+}\r
+\r
 }}
\ No newline at end of file
index b34b42807a9163c29ed8d546426e6a04e109f24c..9b0bc38a1d2939668e2d1d0081c27c01d6ce4d75 100644 (file)
@@ -27,8 +27,8 @@
 #include <boost/noncopyable.hpp>\r
 #include <boost/range/iterator_range.hpp>\r
 \r
-#include <memory>\r
 #include <array>\r
+#include <memory>\r
 #include <vector>\r
 \r
 namespace caspar { namespace core {\r
@@ -65,15 +65,13 @@ public:
                \r
        static const safe_ptr<basic_frame>& eof()\r
        {\r
-               struct eof_frame : public basic_frame{};\r
-               static safe_ptr<basic_frame> frame = make_safe<eof_frame>();\r
+               static safe_ptr<basic_frame> frame = make_safe<basic_frame>();\r
                return frame;\r
        }\r
 \r
        static const safe_ptr<basic_frame>& empty()\r
        {\r
-               struct empty_frame : public basic_frame{};\r
-               static safe_ptr<basic_frame> frame = make_safe<empty_frame>();\r
+               static safe_ptr<basic_frame> frame = make_safe<basic_frame>();\r
                return frame;\r
        }\r
        \r
index d473f9597f6e226f5077ad45cfa46141f47a9114..ed29bbd40d395b1efcaf4af1cb478048b68ccde7 100644 (file)
@@ -23,6 +23,7 @@
 #include <core/video_format.h>\r
 \r
 #include <array>\r
+#include <type_traits>\r
 \r
 namespace caspar { namespace core {\r
 \r
index b78d151ccb0d10053705d18dc86c24eeb44bc6c9..e1f910d41e88a86753872bbce45a17a721d372f0 100644 (file)
 \r
 #include <common/memory/safe_ptr.h>\r
 \r
-#include <tbb/spin_rw_mutex.h>\r
-\r
 namespace caspar { namespace core {\r
        \r
-std::vector<const producer_factory_t> p_factories;\r
-tbb::spin_rw_mutex p_factories_mutex;\r
+std::vector<const producer_factory_t> g_factories;\r
 \r
 safe_ptr<basic_frame> receive_and_follow(safe_ptr<frame_producer>& producer)\r
 {      \r
@@ -64,22 +61,9 @@ safe_ptr<basic_frame> receive_and_follow(safe_ptr<frame_producer>& producer)
        return frame;\r
 }\r
 \r
-std::wostream& operator<<(std::wostream& out, const frame_producer& producer)\r
-{\r
-       out << producer.print().c_str();\r
-       return out;\r
-}\r
-\r
-std::wostream& operator<<(std::wostream& out, const safe_ptr<const frame_producer>& producer)\r
-{\r
-       out << producer->print().c_str();\r
-       return out;\r
-}\r
-\r
 void register_producer_factory(const producer_factory_t& factory)\r
 {\r
-       tbb::spin_rw_mutex::scoped_lock(p_factories_mutex, true);\r
-       p_factories.push_back(factory);\r
+       g_factories.push_back(factory);\r
 }\r
 \r
 safe_ptr<core::frame_producer> create_producer(const safe_ptr<frame_factory>& my_frame_factory, const std::vector<std::wstring>& params)\r
@@ -87,9 +71,8 @@ safe_ptr<core::frame_producer> create_producer(const safe_ptr<frame_factory>& my
        if(params.empty())\r
                BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("params") << arg_value_info(""));\r
        \r
-       tbb::spin_rw_mutex::scoped_lock(p_factories_mutex, false);\r
        auto producer = frame_producer::empty();\r
-       std::any_of(p_factories.begin(), p_factories.end(), [&](const producer_factory_t& factory) -> bool\r
+       std::any_of(g_factories.begin(), g_factories.end(), [&](const producer_factory_t& factory) -> bool\r
                {\r
                        try\r
                        {\r
index c5663fabcf08f85781a023350b7581e1e74dfe29..c32c1838ce3da83cea5da399f6618ff834c22aed 100644 (file)
@@ -27,7 +27,6 @@
 #include <boost/noncopyable.hpp>\r
 \r
 #include <functional>\r
-#include <ostream>\r
 #include <string>\r
 \r
 namespace caspar { namespace core {\r
@@ -60,12 +59,8 @@ public:
 \r
 safe_ptr<basic_frame> receive_and_follow(safe_ptr<frame_producer>& producer);\r
 \r
-std::wostream& operator<<(std::wostream& out, const frame_producer& producer);\r
-std::wostream& operator<<(std::wostream& out, const safe_ptr<const frame_producer>& producer);\r
-\r
 typedef std::function<safe_ptr<core::frame_producer>(const safe_ptr<frame_factory>&, const std::vector<std::wstring>&)> producer_factory_t;\r
-\r
-void register_producer_factory(const producer_factory_t& factory);\r
+void register_producer_factory(const producer_factory_t& factory); // Not thread-safe.\r
 safe_ptr<core::frame_producer> create_producer(const safe_ptr<frame_factory>&, const std::vector<std::wstring>& params);\r
 \r
 \r
index a8c59030bf7d177dcab00660f5583c4a279d574a..a76b9b50e103b61f3f5743be7e95b93354b8ece3 100644 (file)
@@ -48,8 +48,9 @@ public:
        {               \r
                background_ = producer;\r
 \r
-               if(preview)\r
+               if(preview) \r
                {\r
+                       // Play the first frame and pause.\r
                        play();\r
                        receive();\r
                        pause();\r
@@ -95,8 +96,8 @@ layer& layer::operator=(layer&& other)
 layer::layer(const layer& other) : impl_(new implementation(*other.impl_)){}\r
 layer& layer::operator=(const layer& other)\r
 {\r
-       layer tmp(other);\r
-       tmp.swap(*this);\r
+       layer temp(other);\r
+       temp.swap(*this);\r
        return *this;\r
 }\r
 void layer::swap(layer& other)\r
index 3a7184699632e702ddb8cf4d72952c764f4d95ce..8313b046314bf3a0dc6016c61abe36c23d6f421d 100644 (file)
@@ -39,24 +39,26 @@ struct transition_producer : public frame_producer
        safe_ptr<frame_producer>        dest_producer_;\r
        safe_ptr<frame_producer>        source_producer_;\r
                \r
-       transition_producer(const video_format_desc& format_desc, const safe_ptr<frame_producer>& dest, const transition_info& info) \r
+       explicit transition_producer(const video_format_desc& format_desc, const safe_ptr<frame_producer>& dest, const transition_info& info) \r
                : format_desc_(format_desc)\r
                , current_frame_(0)\r
                , info_(info)\r
                , dest_producer_(dest)\r
                , source_producer_(frame_producer::empty()){}\r
-                                       \r
-       safe_ptr<frame_producer> get_following_producer() const\r
+       \r
+       // frame_producer\r
+\r
+       virtual safe_ptr<frame_producer> get_following_producer() const\r
        {\r
                return dest_producer_;\r
        }\r
        \r
-       void set_leading_producer(const safe_ptr<frame_producer>& producer)\r
+       virtual void set_leading_producer(const safe_ptr<frame_producer>& producer)\r
        {\r
                source_producer_ = producer;\r
        }\r
 \r
-       safe_ptr<basic_frame> receive()\r
+       virtual safe_ptr<basic_frame> receive()\r
        {\r
                if(current_frame_++ >= info_.duration)\r
                        return basic_frame::eof();\r
@@ -72,6 +74,13 @@ struct transition_producer : public frame_producer
 \r
                return compose(dest, source);\r
        }\r
+\r
+       virtual std::wstring print() const\r
+       {\r
+               return L"transition";\r
+       }\r
+\r
+       // transition_producer\r
                                                \r
        safe_ptr<basic_frame> compose(const safe_ptr<basic_frame>& dest_frame, const safe_ptr<basic_frame>& src_frame) \r
        {       \r
@@ -129,11 +138,6 @@ struct transition_producer : public frame_producer
 \r
                return basic_frame(s_frame, d_frame);\r
        }\r
-\r
-       std::wstring print() const\r
-       {\r
-               return L"transition";\r
-       }\r
 };\r
 \r
 safe_ptr<frame_producer> create_transition_producer(const video_format_desc& format_desc, const safe_ptr<frame_producer>& destination, const transition_info& info)\r
index 3792ca2a80e82c5ec5c7e0ce9c54b8009d1d6cba..67024b3899d2fdb116975dcb2a341e373c1cd265 100644 (file)
@@ -85,8 +85,8 @@ struct decklink_output : public IDeckLinkVideoOutputCallback, public IDeckLinkAu
        unsigned long frames_scheduled_;\r
        unsigned long audio_scheduled_;\r
        \r
-       tbb::concurrent_bounded_queue<safe_ptr<const core::read_frame>> video_frame_buffer_;\r
-       tbb::concurrent_bounded_queue<safe_ptr<const core::read_frame>> audio_frame_buffer_;\r
+       tbb::concurrent_bounded_queue<std::shared_ptr<const core::read_frame>> video_frame_buffer_;\r
+       tbb::concurrent_bounded_queue<std::shared_ptr<const core::read_frame>> audio_frame_buffer_;\r
 \r
 public:\r
        decklink_output(const core::video_format_desc& format_desc,size_t device_index, bool embed_audio, bool internalKey) \r
@@ -183,9 +183,9 @@ public:
                audio_frame_buffer_.set_capacity(buffer_size);\r
                for(size_t n = 0; n < std::max<size_t>(2, buffer_size-2); ++n)\r
                {\r
-                       video_frame_buffer_.try_push(safe_ptr<const core::read_frame>());\r
+                       video_frame_buffer_.try_push(core::read_frame::empty());\r
                        if(embed_audio_)\r
-                               audio_frame_buffer_.try_push(safe_ptr<const core::read_frame>());\r
+                               audio_frame_buffer_.try_push(core::read_frame::empty());\r
                }\r
                \r
                if(FAILED(output_->StartScheduledPlayback(0, frame_time_scale_, 1.0))) \r
@@ -219,9 +219,9 @@ public:
                if(!is_running_)\r
                        return S_OK;\r
 \r
-               safe_ptr<const core::read_frame> frame;         \r
+               std::shared_ptr<const core::read_frame> frame;  \r
                video_frame_buffer_.pop(frame);         \r
-               schedule_next_video(frame);\r
+               schedule_next_video(safe_ptr<const core::read_frame>(frame));\r
 \r
                return S_OK;\r
        }\r
@@ -236,9 +236,9 @@ public:
                if(!is_running_)\r
                        return S_OK;\r
 \r
-               safe_ptr<const core::read_frame> frame;\r
+               std::shared_ptr<const core::read_frame> frame;\r
                audio_frame_buffer_.pop(frame);\r
-               schedule_next_audio(frame);\r
+               schedule_next_audio(safe_ptr<const core::read_frame>(frame));\r
 \r
                return S_OK;\r
        }\r
index 876039d85e2b7e0d8afa79d81b2b7659135e9be4..570aed3fae4dc169f4df3fbf9aad523416ac268c 100644 (file)
@@ -126,6 +126,8 @@ void print_info()
  \r
 int main(int argc, wchar_t* argv[])\r
 {      \r
+       static_assert(sizeof(void*) == 4, "64-bit code generation is not supported.");\r
+       \r
        // Install unstructured exception handler.\r
        caspar::win32_exception::install_handler();\r
 \r
index 4f695b334b95cd3b8594aa08e5843729c220cc7a..610487e328fc60749f895e5e64cb4b7f70828b4b 100644 (file)
@@ -153,7 +153,7 @@ struct server::implementation : boost::noncopyable
                                        async_servers_.push_back(asyncbootstrapper);\r
                                }\r
                                else\r
-                                       BOOST_THROW_EXCEPTION(invalid_bootstrapper() << arg_name_info(name) << msg_info("Invalid controller."));\r
+                                       BOOST_THROW_EXCEPTION(caspar_exception() << arg_name_info(name) << msg_info("Invalid controller."));\r
                        }\r
                        catch(...)\r
                        {\r
@@ -171,7 +171,7 @@ struct server::implementation : boost::noncopyable
                else if(name == "CLOCK")\r
                        return make_safe<CLK::CLKProtocolStrategy>(channels_);\r
                \r
-               BOOST_THROW_EXCEPTION(invalid_bootstrapper() << arg_name_info("name") << arg_value_info(name) << msg_info("Invalid protocol"));\r
+               BOOST_THROW_EXCEPTION(caspar_exception() << arg_name_info("name") << arg_value_info(name) << msg_info("Invalid protocol"));\r
        }\r
 };\r
 \r
index d73088611735bcd8e9bda790f9bb09f195381dba..fb4917cfff61e96061209a6eb5f1ccec8e2abc22 100644 (file)
 #include <vector>\r
 \r
 namespace caspar {\r
-\r
-std::vector<safe_ptr<core::channel>> initialize_channels();\r
-       \r
-struct invalid_bootstrapper : virtual boost::exception, virtual std::exception {};\r
-\r
+               \r
 class server : boost::noncopyable\r
 {\r
 public:\r