return safe_ptr<graph>(new graph(parent_printer));\r
}\r
\r
+\r
+//namespace v2\r
+//{ \r
+// \r
+//struct line::implementation\r
+//{\r
+// std::wstring name_;\r
+// boost::circular_buffer<data> ticks_;\r
+//\r
+// implementation(const std::wstring& name) \r
+// : name_(name)\r
+// , ticks_(1024){}\r
+// \r
+// void update_value(float value)\r
+// {\r
+// ticks_.push_back();\r
+// ticks_.back().value = value;\r
+// }\r
+//\r
+// void set_value(float value)\r
+// {\r
+// ticks_.clear();\r
+// update_value(value);\r
+// }\r
+//};\r
+//\r
+//line::line(){}\r
+//line::line(const std::wstring& name) : impl_(new implementation(name)){}\r
+//std::wstring line::print() const {return impl_->name_;}\r
+//void line::update_value(float value){impl_->update_value(value);}\r
+//void line::set_value(float value){impl_->set_value(value);}\r
+//boost::circular_buffer<data>& line::ticks() { return impl_->ticks_;}\r
+//\r
+//struct graph::implementation\r
+//{\r
+// std::map<std::wstring, line> lines_;\r
+// color color_;\r
+// printer printer_;\r
+//\r
+// implementation(const std::wstring& name) \r
+// : printer_([=]{return name;}){}\r
+//\r
+// implementation(const printer& parent_printer) \r
+// : printer_(parent_printer){}\r
+// \r
+// void update_value(const std::wstring& name, float value)\r
+// {\r
+// auto it = lines_.find(name);\r
+// if(it == lines_.end())\r
+// it = lines_.insert(std::make_pair(name, line(name))).first;\r
+//\r
+// it->second.update_value(value);\r
+// }\r
+//\r
+// void set_value(const std::wstring& name, float value)\r
+// {\r
+// auto it = lines_.find(name);\r
+// if(it == lines_.end())\r
+// it = lines_.insert(std::make_pair(name, line(name))).first;\r
+//\r
+// it->second.set_value(value);\r
+// }\r
+// \r
+// void set_color(const std::wstring& name, color color)\r
+// {\r
+// color_ = color;\r
+// }\r
+//\r
+// std::map<std::wstring, line>& get_lines()\r
+// {\r
+// return lines_;\r
+// }\r
+// \r
+// color get_color() const\r
+// {\r
+// return color_;\r
+// }\r
+//\r
+// std::wstring print() const\r
+// {\r
+// return printer_ ? printer_() : L"graph";\r
+// }\r
+//};\r
+// \r
+//graph::graph(const std::wstring& name) : impl_(new implementation(name)){}\r
+//graph::graph(const printer& parent_printer) : impl_(new implementation(parent_printer)){}\r
+//void graph::update_value(const std::wstring& name, float value){impl_->update_value(name, value);}\r
+//void graph::set_value(const std::wstring& name, float value){impl_->set_value(name, value);}\r
+//void graph::set_color(const std::wstring& name, color c){impl_->set_color(name, c);}\r
+//color graph::get_color() const {return impl_->get_color();}\r
+//std::wstring graph::print() const {return impl_->print();}\r
+//\r
+//safe_ptr<graph> graph::clone() const \r
+//{\r
+// safe_ptr<graph> clone(new graph(std::wstring(L"")));\r
+// clone->impl_->printer_ = impl_->printer_;\r
+// clone->impl_->lines_ = impl_->lines_;\r
+// clone->impl_->color_ = impl_->color_; \r
+//}\r
+//\r
+//std::map<std::wstring, line>& graph::get_lines() {impl_->get_lines();}\r
+//\r
+//std::vector<safe_ptr<graph>> g_graphs;\r
+//\r
+//safe_ptr<graph> create_graph(const std::string& name)\r
+//{\r
+// g_graphs.push_back(make_safe<graph>(name));\r
+// return g_graphs.back();\r
+//}\r
+//\r
+//safe_ptr<graph> create_graph(const printer& parent_printer)\r
+//{\r
+// g_graphs.push_back(make_safe<graph>(parent_printer));\r
+// return g_graphs.back();\r
+//}\r
+//\r
+//static std::vector<safe_ptr<graph>> get_all_graphs()\r
+//{\r
+// std::vector<safe_ptr<graph>> graphs;\r
+// BOOST_FOREACH(auto& graph, g_graphs)\r
+// graphs.push_back(graph->clone());\r
+//\r
+// return graphs;\r
+//}\r
+//\r
+//}\r
+\r
}}
\ No newline at end of file
#include "../utility/printer.h"\r
\r
#include <string>\r
+#include <vector>\r
+#include <map>\r
+\r
+#include <boost/range/iterator_range.hpp>\r
+#include <boost/circular_buffer.hpp>\r
\r
namespace caspar { namespace diagnostics {\r
\r
safe_ptr<graph> create_graph(const std::string& name);\r
safe_ptr<graph> create_graph(const printer& parent_printer);\r
\r
+//namespace v2\r
+//{\r
+// \r
+// struct data\r
+// {\r
+// float value;\r
+// };\r
+//\r
+// class line\r
+// {\r
+// public:\r
+// line();\r
+// line(const std::wstring& name);\r
+// std::wstring print() const;\r
+// void update_value(float value);\r
+// void set_value(float value);\r
+// void set_tag(const std::wstring& tag);\r
+//\r
+// boost::circular_buffer<data>& ticks();\r
+// private:\r
+// struct implementation;\r
+// std::shared_ptr<implementation> impl_;\r
+// };\r
+// \r
+// class graph;\r
+//\r
+//\r
+// class graph\r
+// {\r
+// public:\r
+// graph(const std::wstring& name);\r
+// graph(const printer& parent_printer);\r
+//\r
+// void update_value(const std::wstring& name, float value);\r
+// void set_value(const std::wstring& name, float value);\r
+//\r
+// void set_guide(const std::wstring& name, float value);\r
+// void set_color(const std::wstring& name, color c);\r
+//\r
+// color get_color() const;\r
+// std::map<std::wstring, line>& get_lines();\r
+//\r
+// std::wstring print() const;\r
+//\r
+// safe_ptr<graph> clone() const;\r
+// private:\r
+// struct implementation;\r
+// std::shared_ptr<implementation> impl_;\r
+// };\r
+// \r
+// static safe_ptr<graph> create_graph(const std::wstring& name);\r
+// static safe_ptr<graph> create_graph(const printer& parent_printer);\r
+// static std::vector<safe_ptr<graph>> get_all_graphs();\r
+//}\r
+\r
}}
\ No newline at end of file
<Filter Include="Source\producer\silverlight\interop">\r
<UniqueIdentifier>{865b1b03-83c0-4c59-b896-f98cd3323c00}</UniqueIdentifier>\r
</Filter>\r
+ <Filter Include="Source\producer\diagnostics">\r
+ <UniqueIdentifier>{fb911bef-1f24-492e-9806-827d8609b866}</UniqueIdentifier>\r
+ </Filter>\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="consumer\decklink\DeckLinkAPI_h.h">\r
std::shared_ptr<frame_factory> frame_factory_;\r
std::wstring filename_;\r
safe_ptr<draw_frame> frame_;\r
-\r
- image_producer(image_producer&& other) \r
- : frame_factory_(std::move(other.frame_factory_))\r
- , filename_(std::move(other.filename_))\r
- , frame_(draw_frame::empty()){}\r
-\r
+ \r
image_producer(const std::wstring& filename) \r
: filename_(filename), frame_(draw_frame::empty()) {}\r
\r
return make_safe<image_producer>(filename + L"." + *ext);\r
}\r
\r
-std::wstring get_fill_version()\r
+std::wstring get_image_version()\r
{\r
return widen(std::string(FreeImage_GetVersion()));\r
}\r
\r
safe_ptr<frame_producer> create_image_producer(const std::vector<std::wstring>& params);\r
\r
-std::wstring get_fill_version();\r
+std::wstring get_image_version();\r
\r
}}}
\ No newline at end of file
graph_->update("frame-time", static_cast<float>(perf_timer_.elapsed()/format_desc_.interval*0.5));\r
\r
output_(make_safe<const read_frame>(std::move(image.get()), std::move(audio)));\r
+\r
graph_->update("tick-time", static_cast<float>(wait_perf_timer_.elapsed()/format_desc_.interval*0.5));\r
wait_perf_timer_.reset();\r
\r
return make_safe<write_frame>(desc, image_mixer_.create_buffers(desc));\r
}\r
\r
- void set_image_transform(const image_transform& transform, int)\r
+ void set_image_transform(const image_transform& transform, int mix_duration)\r
{\r
executor_.invoke([&]\r
{\r
- root_image_transform_ = transform;\r
+ auto src = root_image_transform_.fetch();\r
+ auto dst = transform;\r
+ root_image_transform_ = basic_animated_value<image_transform>(src, dst, mix_duration);\r
});\r
}\r
\r
- void set_audio_transform(const audio_transform& transform, int)\r
+ void set_audio_transform(const audio_transform& transform, int mix_duration)\r
{\r
executor_.invoke([&]\r
{\r
- root_audio_transform_ = transform;\r
+ auto src = root_audio_transform_.fetch();\r
+ auto dst = transform;\r
+ root_audio_transform_ = basic_animated_value<audio_transform>(src, dst, mix_duration);\r
});\r
}\r
\r
- void set_image_transform(int index, const image_transform& transform, int)\r
+ void set_image_transform(int index, const image_transform& transform, int mix_duration)\r
{\r
executor_.invoke([&]\r
{\r
- image_transforms_[index] = transform;\r
+ auto src = image_transforms_[index].fetch();\r
+ auto dst = transform;\r
+ image_transforms_[index] = basic_animated_value<image_transform>(src, dst, mix_duration);\r
});\r
}\r
\r
- void set_audio_transform(int index, const audio_transform& transform, int)\r
+ void set_audio_transform(int index, const audio_transform& transform, int mix_duration)\r
{\r
executor_.invoke([&]\r
{\r
- audio_transforms_[index] = transform;\r
+ auto src = audio_transforms_[index].fetch();\r
+ auto dst = transform;\r
+ audio_transforms_[index] = basic_animated_value<audio_transform>(src, dst, mix_duration);\r
});\r
}\r
\r
CASPAR_LOG(info) << L"Starting CasparCG Video and Graphics Playout Server " << env::version();\r
CASPAR_LOG(info) << L"Flash " << flash::get_flash_version();\r
CASPAR_LOG(info) << L"Flash-Template-Host " << flash::get_cg_version();\r
- CASPAR_LOG(info) << L"FreeImage " << image::get_fill_version();\r
+ CASPAR_LOG(info) << L"FreeImage " << image::get_image_version();\r
\r
std::wstring decklink_devices;\r
BOOST_FOREACH(auto& device, get_decklink_device_list())\r