priority_count\r
};\r
\r
+enum priority_class\r
+{\r
+ high_priority_class,\r
+ above_normal_priority_class,\r
+ normal_priority_class,\r
+ below_normal_priority_clas\r
+};\r
+\r
namespace internal\r
{\r
template<typename T>\r
{\r
execution_queue_[normal_priority].set_capacity(capacity);\r
}\r
+\r
+ void set_priority_class(priority_class p)\r
+ {\r
+ begin_invoke([=]\r
+ {\r
+ if(p == high_priority_class)\r
+ SetThreadPriority(GetCurrentThread(), HIGH_PRIORITY_CLASS);\r
+ if(p == above_normal_priority_class)\r
+ SetThreadPriority(GetCurrentThread(), ABOVE_NORMAL_PRIORITY_CLASS);\r
+ else if(p == normal_priority_class)\r
+ SetThreadPriority(GetCurrentThread(), NORMAL_PRIORITY_CLASS);\r
+ else if(p == below_normal_priority_clas)\r
+ SetThreadPriority(GetCurrentThread(), BELOW_NORMAL_PRIORITY_CLASS);\r
+ });\r
+ }\r
\r
void stop() // noexcept\r
{\r
diag_->set_color("tick-time", diagnostics::color(0.1f, 0.7f, 0.8f));\r
\r
executor_.set_capacity(1);\r
- executor_.begin_invoke([]\r
- {\r
- SetThreadPriority(GetCurrentThread(), ABOVE_NORMAL_PRIORITY_CLASS);\r
- });\r
+ executor_.set_priority_class(above_normal_priority_class);\r
}\r
\r
void add(int index, safe_ptr<frame_consumer>&& consumer)\r
diag_->set_color("tick-time", diagnostics::color(0.1f, 0.7f, 0.8f));\r
diag_->set_color("input-buffer", diagnostics::color(1.0f, 1.0f, 0.0f)); \r
executor_.set_capacity(1); \r
- executor_.begin_invoke([]\r
- {\r
- SetThreadPriority(GetCurrentThread(), ABOVE_NORMAL_PRIORITY_CLASS);\r
- });\r
+ executor_.set_priority_class(above_normal_priority_class);\r
\r
CASPAR_LOG(info) << print() << L" Successfully initialized."; \r
}\r
\r
struct read_frame::implementation : boost::noncopyable\r
{\r
- boost::unique_future<safe_ptr<host_buffer>> image_data_;\r
+ boost::unique_future<safe_ptr<host_buffer>> future_image_data_;\r
+ std::shared_ptr<host_buffer> image_data_;\r
std::vector<int16_t> audio_data_;\r
\r
public:\r
- implementation(boost::unique_future<safe_ptr<host_buffer>>&& image_data, std::vector<int16_t>&& audio_data) \r
- : image_data_(std::move(image_data))\r
+ implementation(boost::unique_future<safe_ptr<host_buffer>>&& future_image_data, std::vector<int16_t>&& audio_data) \r
+ : future_image_data_(std::move(future_image_data))\r
, audio_data_(std::move(audio_data)){} \r
\r
const boost::iterator_range<const uint8_t*> image_data()\r
{\r
try\r
{\r
- if(!image_data_.get()->data())\r
- return boost::iterator_range<const uint8_t*>();\r
- auto ptr = static_cast<const uint8_t*>(image_data_.get()->data());\r
- return boost::iterator_range<const uint8_t*>(ptr, ptr + image_data_.get()->size());\r
+ if(!image_data_)\r
+ image_data_ = future_image_data_.get();\r
}\r
catch(...) // image_data_ future might store exception.\r
{\r
CASPAR_LOG_CURRENT_EXCEPTION();\r
return boost::iterator_range<const uint8_t*>();\r
}\r
+\r
+ auto ptr = static_cast<const uint8_t*>(image_data_->data());\r
+ return boost::iterator_range<const uint8_t*>(ptr, ptr + image_data_->size());\r
}\r
const boost::iterator_range<const int16_t*> audio_data() const\r
{\r
\r
#include <memory>\r
#include <vector>\r
+#include <cstdint>\r
\r
namespace caspar { namespace core {\r
\r
\r
#include "frame_producer.h"\r
#include "frame/basic_frame.h"\r
+#include "frame/audio_transform.h"\r
\r
#include "color/color_producer.h"\r
#include "separated/separated_producer.h"\r
\r
std::vector<const producer_factory_t> g_factories;\r
\r
+frame_producer::frame_producer() : last_frame_(core::basic_frame::empty()){}\r
+\r
const safe_ptr<frame_producer>& frame_producer::empty() // nothrow\r
{\r
struct empty_frame_producer : public frame_producer\r
*/\r
#pragma once\r
\r
-#include "frame/basic_frame.h"\r
-#include "frame/audio_transform.h"\r
+#include "frame/frame_factory.h"\r
\r
#include <common/memory/safe_ptr.h>\r
\r
-#include "frame/frame_factory.h"\r
-\r
#include <boost/noncopyable.hpp>\r
\r
#include <functional>\r
class frame_producer : boost::noncopyable\r
{\r
public:\r
- frame_producer() : last_frame_(core::basic_frame::empty()){}\r
+ frame_producer();\r
virtual ~frame_producer(){} \r
\r
virtual std::wstring print() const = 0; // nothrow\r
#include "../StdAfx.h"\r
\r
#include "frame_producer_device.h"\r
+\r
+#include "layer.h"\r
#include "destroy_producer_proxy.h"\r
\r
#include <core/producer/frame/basic_frame.h>\r
#include <core/producer/frame/frame_factory.h>\r
\r
#include <common/diagnostics/graph.h>\r
-\r
-#include "layer.h"\r
-\r
#include <common/concurrency/executor.h>\r
\r
-#include <boost/range/algorithm_ext/erase.hpp>\r
-#include <boost/lexical_cast.hpp>\r
#include <boost/timer.hpp>\r
\r
#include <tbb/parallel_for.h>\r
\r
-#include <array>\r
-#include <memory>\r
#include <map>\r
\r
namespace caspar { namespace core {\r
{ \r
std::map<int, layer> layers_; \r
const video_format_desc format_desc_; \r
- safe_ptr<diagnostics::graph> diag_;\r
const output_t output_;\r
-\r
+ \r
+ safe_ptr<diagnostics::graph> diag_;\r
boost::timer frame_timer_;\r
boost::timer tick_timer_;\r
boost::timer output_timer_;\r
\r
- mutable executor executor_;\r
+ executor executor_;\r
public:\r
implementation(const video_format_desc& format_desc, const output_t& output) \r
: format_desc_(format_desc)\r
diag_->set_color("frame-time", diagnostics::color(1.0f, 0.0f, 0.0f));\r
diag_->set_color("tick-time", diagnostics::color(0.1f, 0.7f, 0.8f));\r
diag_->set_color("output-time", diagnostics::color(0.5f, 1.0f, 0.2f));\r
- executor_.begin_invoke([]\r
- {\r
- SetThreadPriority(GetCurrentThread(), ABOVE_NORMAL_PRIORITY_CLASS);\r
- });\r
+\r
+ executor_.set_priority_class(above_normal_priority_class);\r
executor_.begin_invoke([=]{tick();}); \r
}\r
\r
frames[pair.first] = pair.second.receive();\r
});\r
\r
- diag_->update_value("frame-time", static_cast<float>(frame_timer_.elapsed()*format_desc_.fps*0.5));\r
+ diag_->update_value("frame-time", frame_timer_.elapsed()*format_desc_.fps*0.5);\r
\r
- diag_->update_value("tick-time", static_cast<float>(tick_timer_.elapsed()*format_desc_.fps*0.5));\r
+ diag_->update_value("tick-time", tick_timer_.elapsed()*format_desc_.fps*0.5);\r
tick_timer_.restart();\r
\r
return frames;\r
#include <boost/noncopyable.hpp>\r
#include <boost/thread/future.hpp>\r
\r
+#include <functional>\r
+\r
namespace caspar { namespace core {\r
\r
struct video_format_desc;\r