, producer_(new frame_producer_device(format_desc_)) \r
, mixer_connection_(mixer_->connect([=](const safe_ptr<const read_frame>& frame){consumer_->send(frame);}))\r
, producer_connection_(producer_->connect([=](const std::map<int, safe_ptr<basic_frame>>& frames){mixer_->send(frames);}))\r
- {}\r
+ {\r
+ CASPAR_LOG(info) << print() << " Successfully Initialized.";\r
+ }\r
\r
std::wstring print() const\r
{\r
\r
const video_format_desc format_descs[video_format::count] = \r
{ \r
- DEFINE_VIDEOFORMATDESC(video_format::pal ,720, 576, video_mode::upper, 25, 1, TEXT("pal") ), \r
- DEFINE_VIDEOFORMATDESC(video_format::ntsc ,720, 486, video_mode::lower, 30000, 1001, TEXT("ntsc") ), \r
+ DEFINE_VIDEOFORMATDESC(video_format::pal ,720, 576, video_mode::upper, 25, 1, TEXT("PAL") ), \r
+ DEFINE_VIDEOFORMATDESC(video_format::ntsc ,720, 486, video_mode::lower, 30000, 1001, TEXT("NTSC") ), \r
DEFINE_VIDEOFORMATDESC(video_format::x576p2500 ,720, 576, video_mode::progressive, 25, 1, TEXT("576p2500")),\r
DEFINE_VIDEOFORMATDESC(video_format::x720p2500 ,1280, 720, video_mode::progressive, 25, 1, TEXT("720p2500")), \r
DEFINE_VIDEOFORMATDESC(video_format::x720p5000 ,1280, 720, video_mode::progressive, 50, 1, TEXT("720p5000")), \r
\r
active_ = executor_.begin_invoke([]{});\r
\r
- CASPAR_LOG(info) << print() << TEXT(" Successfully initialized for ") << format_desc_ << TEXT(".");\r
+ CASPAR_LOG(info) << print() << L" Successfully Initialized.";\r
}\r
\r
~bluefish_consumer()\r
\r
std::wstring print() const\r
{\r
- return model_name_ + L" [" + boost::lexical_cast<std::wstring>(device_index_) + L"]";\r
+ return model_name_ + L" [" + boost::lexical_cast<std::wstring>(device_index_) + L"|" + format_desc_.name + L"]";\r
}\r
};\r
\r
\r
for(int n = 1; BLUE_PASS(blue->device_attach(n, FALSE)); ++n)\r
{ \r
- devices.push_back(L"[" + boost::lexical_cast<std::wstring>(n) + L"] " + get_card_desc(blue->has_video_cardtype()));\r
+ devices.push_back(std::wstring(get_card_desc(blue->has_video_cardtype())) + L" [" + boost::lexical_cast<std::wstring>(n) + L"]");\r
blue->device_detach(); \r
}\r
}\r
start_playback();\r
\r
CASPAR_LOG(info) << print() << L" Buffer depth: " << buffer_size_; \r
- CASPAR_LOG(info) << print() << L" Successfully initialized for " << format_desc_.name; \r
+ CASPAR_LOG(info) << print() << L" Successfully Initialized."; \r
}\r
\r
~decklink_consumer()\r
\r
std::wstring print() const\r
{\r
- return model_name_ + L" [" + boost::lexical_cast<std::wstring>(config_.device_index) + L"]";\r
+ return model_name_ + L" [" + boost::lexical_cast<std::wstring>(config_.device_index) + L"|" + format_desc_.name + L"]";\r
}\r
};\r
\r
{\r
BSTR model_name = L"Unknown";\r
decklink->GetModelName(&model_name);\r
- devices.push_back(L"[" + boost::lexical_cast<std::wstring>(n) + L"] " + model_name); \r
+ devices.push_back(std::wstring(model_name) + L" [" + boost::lexical_cast<std::wstring>(n) + L"]"); \r
}\r
}\r
}\r
CASPAR_LOG(warning) << print() << " Flash function call failed. Param: " << param << ".";\r
graph_->add_tag("param");\r
\r
- if(abs(ax_->GetFPS() - format_desc_.fps) > 0.001 && abs(ax_->GetFPS()/2.0 - format_desc_.fps) > 0.001)\r
+ if(abs(ax_->GetFPS() - format_desc_.fps) > 0.01 && abs(ax_->GetFPS()/2.0 - format_desc_.fps) > 0.01)\r
CASPAR_LOG(warning) << print() << " Invalid frame-rate: " << ax_->GetFPS() << L". Should be either " << format_desc_.fps << L" or " << format_desc_.fps*2.0 << L".";\r
}\r
\r
\r
std::wstring print() const\r
{\r
- return L"oal[default]";\r
+ return L"oal[" + format_desc_.name + L"]";\r
}\r
};\r
\r
\r
namespace caspar {\r
\r
-struct ogl_consumer::implementation : boost::noncopyable\r
+struct ogl_consumer : boost::noncopyable\r
{ \r
boost::unique_future<void> active_;\r
\r
\r
executor executor_;\r
public:\r
- implementation(unsigned int screen_index, stretch stretch, bool windowed) \r
+ ogl_consumer(unsigned int screen_index, stretch stretch, bool windowed, const core::video_format_desc& format_desc) \r
: stretch_(stretch)\r
, windowed_(windowed)\r
, texture_(0)\r
, screen_index_(screen_index)\r
+ , format_desc_(format_desc_)\r
, graph_(diagnostics::create_graph(narrow(print())))\r
, executor_(print())\r
{ \r
executor_.set_capacity(3);\r
graph_->add_guide("frame-time", 0.5);\r
graph_->set_color("frame-time", diagnostics::color(1.0f, 0.0f, 0.0f));\r
- }\r
-\r
- ~implementation()\r
- {\r
- CASPAR_LOG(info) << print() << L" Shutting down."; \r
- }\r
-\r
- void initialize(const core::video_format_desc& format_desc)\r
- {\r
if(!GLEE_VERSION_2_1)\r
BOOST_THROW_EXCEPTION(not_supported() << msg_info("Missing OpenGL 2.1 support."));\r
\r
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, format_desc_.size, 0, GL_STREAM_DRAW_ARB);\r
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);\r
});\r
- CASPAR_LOG(info) << print() << " Sucessfully initialized.";\r
+ CASPAR_LOG(info) << print() << " Sucessfully Initialized.";\r
}\r
-\r
+ \r
void calculate_aspect()\r
{\r
if(windowed_)\r
}\r
\r
std::wstring print() const\r
- {\r
- return L"ogl[" + boost::lexical_cast<std::wstring>(screen_index_) + L"]";\r
+ { \r
+ return L"ogl[" + boost::lexical_cast<std::wstring>(screen_index_) + L"|" + format_desc_.name + L"]";\r
}\r
\r
size_t buffer_depth() const{return 2;}\r
};\r
\r
-ogl_consumer::ogl_consumer(ogl_consumer&& other) : impl_(std::move(other.impl_)){}\r
-ogl_consumer::ogl_consumer(unsigned int screen_index, stretch stretch, bool windowed) : impl_(new implementation(screen_index, stretch, windowed)){}\r
-void ogl_consumer::send(const safe_ptr<const core::read_frame>& frame){impl_->send(frame);}\r
-size_t ogl_consumer::buffer_depth() const{return impl_->buffer_depth();}\r
-void ogl_consumer::initialize(const core::video_format_desc& format_desc)\r
+\r
+struct ogl_consumer_proxy : public core::frame_consumer\r
{\r
- // TODO: Ugly\r
- if(impl_->executor_.is_running())\r
- impl_.reset(new implementation(impl_->screen_index_, impl_->stretch_, impl_->windowed_));\r
- impl_->initialize(format_desc);\r
-}\r
-std::wstring ogl_consumer::print() const {return impl_->print();}\r
+ size_t screen_index_;\r
+ caspar::stretch stretch_;\r
+ bool windowed_;\r
+\r
+ std::unique_ptr<ogl_consumer> consumer_;\r
+\r
+public:\r
+\r
+ ogl_consumer_proxy(size_t screen_index, stretch stretch, bool windowed)\r
+ : screen_index_(screen_index)\r
+ , stretch_(stretch)\r
+ , windowed_(windowed){}\r
+ \r
+ virtual void initialize(const core::video_format_desc& format_desc)\r
+ {\r
+ consumer_.reset(new ogl_consumer(screen_index_, stretch_, windowed_, format_desc));\r
+ }\r
+ \r
+ virtual void send(const safe_ptr<const core::read_frame>& frame)\r
+ {\r
+ consumer_->send(frame);\r
+ }\r
+ \r
+ virtual std::wstring print() const\r
+ {\r
+ return consumer_->print();\r
+ }\r
+}; \r
\r
safe_ptr<core::frame_consumer> create_ogl_consumer(const std::vector<std::wstring>& params)\r
{\r
if(params.size() < 1 || params[0] != L"OGL")\r
return core::frame_consumer::empty();\r
\r
- unsigned int screen_index = 0;\r
+ size_t screen_index = 0;\r
stretch stretch = stretch::fill;\r
bool windowed = true;\r
\r
if(params.size() > 2) \r
windowed = lexical_cast_or_default<bool>(params[3], windowed);\r
\r
- return make_safe<ogl_consumer>(screen_index, stretch, windowed);\r
+ return make_safe<ogl_consumer_proxy>(screen_index, stretch, windowed);\r
+}\r
+\r
+safe_ptr<core::frame_consumer> create_ogl_consumer(const boost::property_tree::ptree& ptree) \r
+{\r
+ size_t screen_index = ptree.get("device", 0);\r
+ bool windowed =ptree.get("windowed", true);\r
+ \r
+ stretch stretch = stretch::fill;\r
+ auto key_str = ptree.get("stretch", "default");\r
+ if(key_str == "uniform")\r
+ stretch = stretch::uniform;\r
+ else if(key_str == "uniform_to_fill")\r
+ stretch = stretch::uniform_to_fill;\r
+\r
+ return make_safe<ogl_consumer_proxy>(screen_index, stretch, windowed);\r
}\r
\r
}
\ No newline at end of file
#include <core/video_format.h>\r
\r
#include <vector>\r
+#include <boost/property_tree/ptree.hpp>\r
\r
namespace caspar {\r
\r
uniform_to_fill\r
};\r
\r
-class ogl_consumer : public core::frame_consumer\r
-{\r
-public: \r
- explicit ogl_consumer(unsigned int screen_index = 0, stretch stretch = stretch::fill, bool windowed = false);\r
- ogl_consumer(ogl_consumer&& other);\r
- \r
- virtual void initialize(const core::video_format_desc& format_desc);\r
- virtual void send(const safe_ptr<const core::read_frame>&);\r
- virtual size_t buffer_depth() const;\r
- virtual std::wstring print() const;\r
-private:\r
- struct implementation;\r
- std::shared_ptr<implementation> impl_;\r
-};\r
-\r
safe_ptr<core::frame_consumer> create_ogl_consumer(const std::vector<std::wstring>& params);\r
+safe_ptr<core::frame_consumer> create_ogl_consumer(const boost::property_tree::ptree& ptree);\r
\r
}
\ No newline at end of file
\r
void init_ogl()\r
{\r
- core::register_consumer_factory(create_ogl_consumer);\r
+ core::register_consumer_factory([](const std::vector<std::wstring>& params){return create_ogl_consumer(params);});\r
}\r
\r
}
\ No newline at end of file
<log-path>L:\\Casparcg\\_log\\</log-path>\r
<data-path>L:\\Casparcg\\_data\\</data-path>\r
<template-path>L:\\Casparcg\\_templates\\</template-path>\r
- <template-host>cg.fth.1920x1080i59.94</template-host>\r
+ <template-host>1080 59i.fth</template-host>\r
</paths>\r
<diagnostics>\r
<graphs>true</graphs>\r
</diagnostics>\r
<channels>\r
<channel>\r
- <videomode>1080i5000</videomode>\r
+ <videomode>NTSC</videomode>\r
<consumers>\r
<decklink>\r
<device>1</device>\r
CASPAR_LOG(info) << L"Flash-Template-Host " << caspar::get_cg_version();\r
CASPAR_LOG(info) << L"FreeImage " << caspar::get_image_version();\r
\r
- std::wstring decklink_devices;\r
+ CASPAR_LOG(info) << L"Decklink " << caspar::get_decklink_version();\r
BOOST_FOREACH(auto& device, caspar::get_decklink_device_list())\r
- decklink_devices += L"\t" + device;\r
- CASPAR_LOG(info) << L"Decklink " << caspar::get_decklink_version() << (decklink_devices.empty() ? L"" : L"\n\tDevices:\n" + decklink_devices);\r
- \r
- std::wstring bluefish_devices;\r
+ CASPAR_LOG(info) << device;\r
+ \r
+ CASPAR_LOG(info) << L"Bluefish " << caspar::get_bluefish_version();\r
BOOST_FOREACH(auto& device, caspar::get_bluefish_device_list())\r
- bluefish_devices += L"\t" + device;\r
- CASPAR_LOG(info) << L"Bluefish " << caspar::get_bluefish_version() << (bluefish_devices.empty() ? L"" : L"\n\tDevices:\n" + bluefish_devices);\r
+ CASPAR_LOG(info) << device;\r
\r
CASPAR_LOG(info) << L"FFMPEG-avcodec " << caspar::get_avcodec_version();\r
CASPAR_LOG(info) << L"FFMPEG-swscale " << caspar::get_avformat_version();\r
{\r
try\r
{\r
- std::string name = xml_consumer.first;\r
+ const std::string name = xml_consumer.first;\r
if(name == "ogl")\r
- { \r
- int device = xml_consumer.second.get("device", 0);\r
- \r
- stretch stretch = stretch::fill;\r
- std::string stretchStr = xml_consumer.second.get("stretch", "");\r
- if(stretchStr == "none")\r
- stretch = stretch::none;\r
- else if(stretchStr == "uniform")\r
- stretch = stretch::uniform;\r
- else if(stretchStr == "uniformtofill")\r
- stretch = stretch::uniform_to_fill;\r
-\r
- bool windowed = xml_consumer.second.get("windowed", false);\r
- channels_.back()->consumer()->add(index++, ogl_consumer(device, stretch, windowed));\r
- }\r
+ channels_.back()->consumer()->add(index++, create_ogl_consumer(xml_consumer.second)); \r
else if(name == "bluefish") \r
channels_.back()->consumer()->add(index++, create_bluefish_consumer(xml_consumer.second)); \r
else if(name == "decklink") \r