--- /dev/null
+#include "../../stdafx.h"\r
+\r
+#include "../frame_consumer.h"\r
+\r
+#include <common/env.h>\r
+#include <common/memory/safe_ptr.h>\r
+#include <common/except.h>\r
+\r
+#include <core/video_format.h>\r
+#include <core/frame/data_frame.h>\r
+\r
+namespace caspar { namespace core {\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
+}}
\ No newline at end of file
--- /dev/null
+#pragma once\r
+\r
+#include <common/memory/safe_ptr.h>\r
+\r
+namespace caspar { namespace core {\r
+ \r
+safe_ptr<struct frame_consumer> create_consumer_cadence_guard(const safe_ptr<struct frame_consumer>& consumer);\r
+\r
+}}
\ No newline at end of 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
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
static const safe_ptr<frame_consumer>& empty();\r
};\r
\r
-safe_ptr<frame_consumer> create_consumer_cadence_guard(const safe_ptr<frame_consumer>& consumer);\r
-\r
typedef std::function<safe_ptr<frame_consumer>(const std::vector<std::wstring>&)> consumer_factory_t;\r
\r
void register_consumer_factory(const consumer_factory_t& factory);\r
\r
#include "frame_consumer.h"\r
\r
+#include "cadence/cadence_guard_consumer.h"\r
+\r
#include "../video_format.h"\r
#include "../frame/data_frame.h"\r
\r
</Lib>\r
</ItemDefinitionGroup>\r
<ItemGroup>\r
+ <ClInclude Include="consumer\cadence\cadence_guard_consumer.h" />\r
<ClInclude Include="frame\draw_frame.h" />\r
<ClInclude Include="frame\data_frame.h" />\r
<ClInclude Include="frame\frame_factory.h" />\r
<ClInclude Include="StdAfx.h" />\r
</ItemGroup>\r
<ItemGroup>\r
+ <ClCompile Include="consumer\cadence\cadence_guard_consumer.cpp">\r
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
+ </ClCompile>\r
<ClCompile Include="frame\data_frame.cpp">\r
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../StdAfx.h</PrecompiledHeaderFile>\r
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../StdAfx.h</PrecompiledHeaderFile>\r
<Filter Include="source\frame">\r
<UniqueIdentifier>{b19721c1-8dd1-45fb-b9e3-212b548ebbb6}</UniqueIdentifier>\r
</Filter>\r
+ <Filter Include="source\consumer\cadence">\r
+ <UniqueIdentifier>{32043b44-b1bc-4098-8401-4b1467a96a01}</UniqueIdentifier>\r
+ </Filter>\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="producer\transition\transition_producer.h">\r
<ClInclude Include="mixer\gpu\write_frame.h">\r
<Filter>source\mixer\gpu</Filter>\r
</ClInclude>\r
+ <ClInclude Include="consumer\cadence\cadence_guard_consumer.h">\r
+ <Filter>source\consumer\cadence</Filter>\r
+ </ClInclude>\r
</ItemGroup>\r
<ItemGroup>\r
<ClCompile Include="producer\transition\transition_producer.cpp">\r
<ClCompile Include="mixer\gpu\write_frame.cpp">\r
<Filter>source\mixer\gpu</Filter>\r
</ClCompile>\r
+ <ClCompile Include="consumer\cadence\cadence_guard_consumer.cpp">\r
+ <Filter>source\consumer\cadence</Filter>\r
+ </ClCompile>\r
</ItemGroup>\r
</Project>
\ No newline at end of file
\r
typedef std::function<safe_ptr<core::frame_producer>(const safe_ptr<struct frame_factory>&, const std::vector<std::wstring>&)> producer_factory_t;\r
void register_producer_factory(const producer_factory_t& factory); // Not thread-safe.\r
+\r
safe_ptr<core::frame_producer> create_producer(const safe_ptr<frame_factory>&, const std::vector<std::wstring>& params);\r
safe_ptr<core::frame_producer> create_producer(const safe_ptr<frame_factory>&, const std::wstring& params);\r
+\r
safe_ptr<core::frame_producer> create_producer_destroy_proxy(safe_ptr<core::frame_producer> producer);\r
safe_ptr<core::frame_producer> create_producer_print_proxy(safe_ptr<core::frame_producer> producer);\r
\r