#include <queue>\r
\r
namespace caspar { namespace reroute {\r
- \r
-class reroute_producer : public reactive::observer<spl::shared_ptr<const core::data_frame>>\r
- , public core::frame_producer\r
+// \r
+//class reroute_producer : public reactive::observer<spl::shared_ptr<const core::data_frame>>\r
+// , public core::frame_producer\r
+//{\r
+// const spl::shared_ptr<diagnostics::graph> graph_;\r
+// const spl::shared_ptr<core::frame_factory> frame_factory_;\r
+// \r
+// tbb::concurrent_bounded_queue<std::shared_ptr<const core::data_frame>> input_buffer_;\r
+// std::queue<core::draw_frame> frame_buffer_;\r
+// uint64_t frame_number_;\r
+//\r
+// core::draw_frame last_frame_;\r
+//\r
+//public:\r
+// explicit reroute_producer(const spl::shared_ptr<core::frame_factory>& frame_factory) \r
+// : frame_factory_(frame_factory)\r
+// , frame_number_(0)\r
+// , last_frame_(core::draw_frame::empty())\r
+// {\r
+// graph_->set_color("late-frame", diagnostics::color(0.6f, 0.3f, 0.3f));\r
+// graph_->set_color("dropped-frame", diagnostics::color(0.3f, 0.6f, 0.3f));\r
+// graph_->set_text(print());\r
+// diagnostics::register_graph(graph_);\r
+//\r
+// input_buffer_.set_capacity(1);\r
+// }\r
+// \r
+// // observable\r
+//\r
+// void on_next(const spl::shared_ptr<const core::data_frame>& frame)\r
+// {\r
+// if(!input_buffer_.try_push(frame))\r
+// graph_->set_tag("dropped-frame");\r
+// }\r
+//\r
+// // frame_producer\r
+// \r
+// virtual core::draw_frame receive(int) override\r
+// {\r
+// if(!frame_buffer_.empty())\r
+// {\r
+// auto frame = std::move(frame_buffer_.front());\r
+// frame_buffer_.pop();\r
+// return last_frame_ = frame;\r
+// }\r
+// \r
+// std::shared_ptr<const core::data_frame> read_frame;\r
+// if(!input_buffer_.try_pop(read_frame))\r
+// {\r
+// graph_->set_tag("late-frame");\r
+// return core::draw_frame::late(); \r
+// }\r
+// \r
+// frame_number_++;\r
+// \r
+// bool double_speed = std::abs(frame_factory_->video_format_desc().fps / 2.0 - read_frame->frame_rate()) < 0.01; \r
+// bool half_speed = std::abs(read_frame->frame_rate() / 2.0 - frame_factory_->video_format_desc().fps) < 0.01;\r
+//\r
+// if(half_speed && frame_number_ % 2 == 0) // Skip frame\r
+// return receive(0);\r
+//\r
+// auto frame = frame_factory_->create_frame(this, read_frame->pixel_format_desc());\r
+//\r
+// A_memcpy(frame->image_data(0).begin(), read_frame->image_data().begin(), read_frame->image_data().size());\r
+// boost::push_back(frame->audio_data(), read_frame->audio_data());\r
+// \r
+// auto draw_frame = core::draw_frame(std::move(frame));\r
+//\r
+// frame_buffer_.push(draw_frame);\r
+// \r
+// if(double_speed) \r
+// frame_buffer_.push(draw_frame);\r
+//\r
+// return receive(0);\r
+// } \r
+//\r
+// virtual core::draw_frame last_frame() const override\r
+// {\r
+// return core::draw_frame::still(last_frame_);\r
+// }\r
+// \r
+// virtual std::wstring print() const override\r
+// {\r
+// return L"reroute[]";\r
+// }\r
+//\r
+// virtual std::wstring name() const override\r
+// {\r
+// return L"reroute";\r
+// }\r
+//\r
+// virtual boost::property_tree::wptree info() const override\r
+// {\r
+// boost::property_tree::wptree info;\r
+// info.add(L"type", L"rerotue-producer");\r
+// return info;\r
+// }\r
+//};\r
+\r
+spl::shared_ptr<core::frame_producer> create_producer(const spl::shared_ptr<core::frame_factory>& frame_factory, core::video_channel& channel)\r
{\r
- const spl::shared_ptr<diagnostics::graph> graph_;\r
- const spl::shared_ptr<core::frame_factory> frame_factory_;\r
- \r
- tbb::concurrent_bounded_queue<std::shared_ptr<const core::data_frame>> input_buffer_;\r
- std::queue<core::draw_frame> frame_buffer_;\r
- uint64_t frame_number_;\r
-\r
- core::draw_frame last_frame_;\r
-\r
-public:\r
- explicit reroute_producer(const spl::shared_ptr<core::frame_factory>& frame_factory) \r
- : frame_factory_(frame_factory)\r
- , frame_number_(0)\r
- , last_frame_(core::draw_frame::empty())\r
- {\r
- graph_->set_color("late-frame", diagnostics::color(0.6f, 0.3f, 0.3f));\r
- graph_->set_color("dropped-frame", diagnostics::color(0.3f, 0.6f, 0.3f));\r
- graph_->set_text(print());\r
- diagnostics::register_graph(graph_);\r
-\r
- input_buffer_.set_capacity(1);\r
- }\r
- \r
- // observable\r
-\r
- void on_next(const spl::shared_ptr<const core::data_frame>& frame)\r
- {\r
- if(!input_buffer_.try_push(frame))\r
- graph_->set_tag("dropped-frame");\r
- }\r
-\r
- // frame_producer\r
- \r
- virtual core::draw_frame receive(int) override\r
- {\r
- if(!frame_buffer_.empty())\r
- {\r
- auto frame = std::move(frame_buffer_.front());\r
- frame_buffer_.pop();\r
- return last_frame_ = frame;\r
- }\r
- \r
- std::shared_ptr<const core::data_frame> read_frame;\r
- if(input_buffer_.try_pop(read_frame) || read_frame->image_data().empty())\r
- {\r
- graph_->set_tag("late-frame");\r
- return core::draw_frame::late(); \r
- }\r
- \r
- frame_number_++;\r
- \r
- bool double_speed = std::abs(frame_factory_->video_format_desc().fps / 2.0 - read_frame->frame_rate()) < 0.01; \r
- bool half_speed = std::abs(read_frame->frame_rate() / 2.0 - frame_factory_->video_format_desc().fps) < 0.01;\r
-\r
- if(half_speed && frame_number_ % 2 == 0) // Skip frame\r
- return receive(0);\r
-\r
- auto frame = frame_factory_->create_frame(this, read_frame->pixel_format_desc());\r
-\r
- A_memcpy(frame->image_data(0).begin(), read_frame->image_data().begin(), read_frame->image_data().size());\r
- boost::push_back(frame->audio_data(), read_frame->audio_data());\r
- \r
- auto draw_frame = core::draw_frame(std::move(frame));\r
-\r
- frame_buffer_.push(draw_frame);\r
- \r
- if(double_speed) \r
- frame_buffer_.push(draw_frame);\r
-\r
- return receive(0);\r
- } \r
-\r
- virtual core::draw_frame last_frame() const override\r
- {\r
- return core::draw_frame::still(last_frame_);\r
- }\r
- \r
- virtual std::wstring print() const override\r
- {\r
- return L"reroute[]";\r
- }\r
-\r
- virtual std::wstring name() const override\r
- {\r
- return L"reroute";\r
- }\r
-\r
- virtual boost::property_tree::wptree info() const override\r
- {\r
- boost::property_tree::wptree info;\r
- info.add(L"type", L"rerotue-producer");\r
- return info;\r
- }\r
-};\r
-\r
-spl::shared_ptr<core::frame_producer> create_producer(const spl::shared_ptr<core::frame_factory>& frame_factory, reactive::observable<spl::shared_ptr<const core::data_frame>>& o)\r
-{\r
- auto producer = spl::make_shared<reroute_producer>(frame_factory);\r
- o.subscribe(producer);\r
- return core::wrap_producer(producer);\r
+ return core::frame_producer::empty();\r
+ //auto producer = spl::make_shared<reroute_producer>(frame_factory);\r
+ //o.subscribe(producer);\r
+ //return core::wrap_producer(producer);\r
}\r
\r
}}
\ No newline at end of file