]> git.sesse.net Git - casparcg/blobdiff - core/consumer/frame_consumer.cpp
2.1.0: Refactoring.
[casparcg] / core / consumer / frame_consumer.cpp
index f649f185361cd6dece6ccb3218a5ae9b558f7de8..9b74a7143adecb9a63f1e89ef012468222ec00f2 100644 (file)
 \r
 #include "frame_consumer.h"\r
 \r
-#include <common/env.h>\r
-#include <common/memory/safe_ptr.h>\r
-#include <common/except.h>\r
-#include <core/video_format.h>\r
-#include <core/frame/data_frame.h>\r
-\r
-#include <boost/circular_buffer.hpp>\r
+#include "cadence/cadence_guard_consumer.h"\r
 \r
 namespace caspar { namespace core {\r
                \r
@@ -65,77 +59,6 @@ safe_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>&
        return consumer;\r
 }\r
 \r
-// This class is used to guarantee that audio cadence is correct. This is important for NTSC audio.\r
-class cadence_guard : public frame_consumer\r
-{\r
-       safe_ptr<frame_consumer>                consumer_;\r
-       std::vector<int>                                audio_cadence_;\r
-       boost::circular_buffer<int>     sync_buffer_;\r
-public:\r
-       cadence_guard(const safe_ptr<frame_consumer>& consumer)\r
-               : consumer_(consumer)\r
-       {\r
-       }\r
-       \r
-       virtual void initialize(const video_format_desc& format_desc, int channel_index) override\r
-       {\r
-               audio_cadence_  = format_desc.audio_cadence;\r
-               sync_buffer_    = boost::circular_buffer<int>(format_desc.audio_cadence.size());\r
-               consumer_->initialize(format_desc, channel_index);\r
-       }\r
-\r
-       virtual bool send(const safe_ptr<const data_frame>& frame) override\r
-       {               \r
-               if(audio_cadence_.size() == 1)\r
-                       return consumer_->send(frame);\r
-\r
-               bool result = true;\r
-               \r
-               if(boost::range::equal(sync_buffer_, audio_cadence_) && audio_cadence_.front() == static_cast<int>(frame->audio_data().size())) \r
-               {       \r
-                       // Audio sent so far is in sync, now we can send the next chunk.\r
-                       result = consumer_->send(frame);\r
-                       boost::range::rotate(audio_cadence_, std::begin(audio_cadence_)+1);\r
-               }\r
-               else\r
-                       CASPAR_LOG(trace) << print() << L" Syncing audio.";\r
-\r
-               sync_buffer_.push_back(static_cast<int>(frame->audio_data().size()));\r
-               \r
-               return result;\r
-       }\r
-\r
-       virtual std::wstring print() const override\r
-       {\r
-               return consumer_->print();\r
-       }\r
-\r
-       virtual boost::property_tree::wptree info() const override\r
-       {\r
-               return consumer_->info();\r
-       }\r
-\r
-       virtual bool has_synchronization_clock() const override\r
-       {\r
-               return consumer_->has_synchronization_clock();\r
-       }\r
-\r
-       virtual int buffer_depth() const override\r
-       {\r
-               return consumer_->buffer_depth();\r
-       }\r
-\r
-       virtual int index() const override\r
-       {\r
-               return consumer_->index();\r
-       }\r
-};\r
-\r
-safe_ptr<frame_consumer> create_consumer_cadence_guard(const safe_ptr<frame_consumer>& consumer)\r
-{\r
-       return make_safe<cadence_guard>(std::move(consumer));\r
-}\r
-\r
 const safe_ptr<frame_consumer>& frame_consumer::empty()\r
 {\r
        struct empty_frame_consumer : public frame_consumer\r