}\r
}\r
\r
-#ifdef _DEBUG\r
+//#ifdef _DEBUG\r
\r
#define CASPAR_GL_EXPR_STR(expr) #expr\r
\r
(expr); \\r
caspar::gl::SMFL_GLCheckError(CASPAR_GL_EXPR_STR(expr), __FILE__, __LINE__);\\r
}while(0);\r
-#else\r
-#define GL(expr) expr\r
-#endif\r
+//#else\r
+//#define GL(expr) expr\r
+//#endif\r
\r
}}
\ No newline at end of file
const int index_;\r
video_format_desc format_desc_;\r
\r
- safe_ptr<mixer::frame_mixer_device> mixer_;\r
+ safe_ptr<mixer::frame_mixer_device> mixer_;\r
safe_ptr<frame_consumer_device> consumer_;\r
safe_ptr<frame_producer_device> producer_;\r
\r
class color_producer : public frame_producer\r
{\r
safe_ptr<basic_frame> frame_;\r
- std::wstring color_str_;\r
+ const std::wstring color_str_;\r
\r
public:\r
explicit color_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::wstring& color) \r
executor_.start();\r
}\r
\r
- ~implementation()\r
- {\r
- CASPAR_LOG(info) << "Shutting down producer-device.";\r
- }\r
-\r
boost::signals2::connection connect(const output_t::slot_type& subscriber)\r
{\r
return executor_.invoke([&]() -> boost::signals2::connection\r
\r
void swap_layer(int index, size_t other_index)\r
{\r
- executor_.invoke([&]\r
- {\r
- layers_[index].swap(layers_[other_index]);\r
- });\r
+ executor_.invoke([&]{layers_[index].swap(layers_[other_index]);});\r
}\r
\r
void swap_layer(int index, size_t other_index, frame_producer_device& other)\r
if(format_desc_ != other.impl_->format_desc_)\r
BOOST_THROW_EXCEPTION(invalid_operation() << msg_info("Cannot swap between channels with different formats."));\r
\r
- auto func = [&]\r
- {\r
- layers_[index].swap(other.impl_->layers_[other_index]); \r
-\r
- CASPAR_LOG(info) << print() << L" Swapped layer " << index << L" with " << other.impl_->print() << L" layer " << other_index << L"."; \r
- };\r
+ auto func = [&]{layers_[index].swap(other.impl_->layers_[other_index]);};\r
\r
executor_.invoke([&]{other.impl_->executor_.invoke(func);});\r
}\r
auto sel_first = [](const std::pair<int, layer>& pair){return pair.first;};\r
\r
std::set<int> indices;\r
- std::transform(layers_.begin(), layers_.end(), std::inserter(indices, indices.begin()), sel_first);\r
- std::transform(other.impl_->layers_.begin(), other.impl_->layers_.end(), std::inserter(indices, indices.begin()), sel_first);\r
+ auto inserter = std::inserter(indices, indices.begin());\r
+\r
+ std::transform(layers_.begin(), layers_.end(), inserter, sel_first);\r
+ std::transform(other.impl_->layers_.begin(), other.impl_->layers_.end(), inserter, sel_first);\r
std::for_each(indices.begin(), indices.end(), [&](int index)\r
{\r
layers_[index].swap(other.impl_->layers_[index]);\r
}); \r
-\r
- CASPAR_LOG(info) << print() << L" Swapped layers with " << other.impl_->print() << L".";\r
};\r
\r
executor_.invoke([&]{other.impl_->executor_.invoke(func);});\r
\r
boost::unique_future<safe_ptr<frame_producer>> foreground(int index)\r
{\r
- return executor_.begin_invoke([=]\r
- { \r
- return layers_[index].foreground();\r
- });\r
- }\r
-\r
- std::wstring print() const\r
- {\r
- return L"frame_producer_device";\r
+ return executor_.begin_invoke([=]{return layers_[index].foreground();});\r
}\r
};\r
\r
\r
aligned_buffer audio_packet;\r
if(audio_chunk_channel_.size() < 3 && audio_decoder_) \r
- audio_packet = input_->get_audio_packet(); \r
+ audio_packet = input_->get_audio_packet(); \r
+\r
+ if(video_packet.empty() && audio_packet.empty()) // Skip frame if lagging. \r
+ break;\r
\r
tbb::parallel_invoke(\r
[&]\r
- { // Video Decoding and Scaling\r
- if(!video_packet.empty() && video_decoder_)\r
+ {\r
+ if(!video_packet.empty() && video_decoder_) // Video Decoding.\r
{\r
try\r
{\r
}\r
}, \r
[&] \r
- { // Audio Decoding\r
- if(!audio_packet.empty() && audio_decoder_)\r
+ { \r
+ if(!audio_packet.empty() && audio_decoder_) // Audio Decoding.\r
{\r
try\r
{\r
result = get_frame(); // TODO: Support 50p \r
else if(input_->is_eof())\r
result = core::basic_frame::eof();\r
+ else\r
+ graph_->add_tag("lag");\r
\r
return result;\r
}\r
else if(read_packet->stream_index == audio_s_index_) \r
audio_packet_buffer_.try_push(std::move(packet)); \r
}\r
- else if(!loop_ || !seek_frame(0, AVSEEK_FLAG_BACKWARD)) // TODO: av_seek_frame does not work for all formats\r
+ else if(!loop_ || av_seek_frame(format_context_.get(), -1, 0, AVSEEK_FLAG_BACKWARD) < 0) // TODO: av_seek_frame does not work for all formats\r
executor_.stop();\r
else\r
graph_->add_tag("seek"); \r
while(executor_.is_running() && audio_packet_buffer_.size() > PACKET_BUFFER_COUNT && video_packet_buffer_.size() > PACKET_BUFFER_COUNT)\r
cond_.wait(lock); \r
}\r
- \r
- bool seek_frame(int64_t seek_target, int flags = 0)\r
- { \r
- static const AVRational TIME_BASE_Q = {1, AV_TIME_BASE};\r
- \r
- int stream_index = std::max(video_s_index_, audio_s_index_);\r
- seek_target *= AV_TIME_BASE;\r
-\r
- if(stream_index >= 0) \r
- seek_target = av_rescale_q(seek_target, TIME_BASE_Q, format_context_->streams[stream_index]->time_base);\r
- \r
- bool result = av_seek_frame(format_context_.get(), stream_index, seek_target, flags) >= 0;\r
- if(!result)\r
- CASPAR_LOG(warning) << print() << " Failed to seek frame.";\r
- return result;\r
- }\r
\r
aligned_buffer get_video_packet()\r
{\r
<channel>\r
<videomode>1080i5000</videomode>\r
<consumers>\r
- <decklink>\r
+ <!--<decklink>\r
<device>1</device>\r
<embedded-audio>true</embedded-audio>\r
<internal-key>false</internal-key>\r
- </decklink>\r
+ </decklink>-->\r
<ogl>\r
<device>0</device>\r
<stretch>uniform</stretch>\r
else if(wcmd.substr(0, 1) == L"5")\r
wcmd = L"LOADBG 1-2 " + wcmd.substr(1, wcmd.length()-1) + L" LOOP \r\nPLAY 1-2";\r
else if(wcmd.substr(0, 1) == L"6")\r
- wcmd = L"CG 1-2 ADD 1 BBTELEFONARE 1";\r
+ wcmd = L"CG 1-2 ADD 1 THING 1";\r
else if(wcmd.substr(0, 1) == L"7")\r
wcmd = L"LOAD 1-1 720p2500";\r
else if(wcmd.substr(0, 1) == L"8")\r