#include <common/lock.h>
#include <common/executor.h>
#include <common/timer.h>
+#include <common/future.h>
#include <core/mixer/image/image_mixer.h>
#include <core/diagnostics/call_context.h>
mutable tbb::spin_mutex channel_layout_mutex_;
core::audio_channel_layout channel_layout_;
- const spl::shared_ptr<caspar::diagnostics::graph> graph_ = [](int index)
- {
- core::diagnostics::scoped_call_context save;
- core::diagnostics::call_context::for_thread().video_channel = index;
- return spl::make_shared<caspar::diagnostics::graph>();
- }(index_);
+ const spl::shared_ptr<caspar::diagnostics::graph> graph_ = [](int index)
+ {
+ core::diagnostics::scoped_call_context save;
+ core::diagnostics::call_context::for_thread().video_channel = index;
+ return spl::make_shared<caspar::diagnostics::graph>();
+ }(index_);
caspar::core::output output_;
+ std::future<void> output_ready_for_frame_ = make_ready_future();
spl::shared_ptr<image_mixer> image_mixer_;
caspar::core::mixer mixer_;
- caspar::core::stage stage_;
+ caspar::core::stage stage_;
- executor executor_ { L"video_channel " + boost::lexical_cast<std::wstring>(index_) };
+ executor executor_ { L"video_channel " + boost::lexical_cast<std::wstring>(index_) };
public:
impl(
int index,
auto format_desc = video_format_desc();
auto channel_layout = audio_channel_layout();
-
+
caspar::timer frame_timer;
// Produce
-
+
auto stage_frames = stage_(format_desc);
-
+
// Mix
-
+
auto mixed_frame = mixer_(std::move(stage_frames), format_desc, channel_layout);
-
+
// Consume
-
- output_(std::move(mixed_frame), format_desc, channel_layout);
-
+
+ output_ready_for_frame_ = output_(std::move(mixed_frame), format_desc, channel_layout);
+ output_ready_for_frame_.get();
+
auto frame_time = frame_timer.elapsed()*format_desc.fps*0.5;
graph_->set_value("tick-time", frame_time);
if (executor_.is_running())
executor_.begin_invoke([=]{tick();});
}
-
+
std::wstring print() const
{
return L"video_channel[" + boost::lexical_cast<std::wstring>(index_) + L"|" + video_format_desc().name + L"]";
info.add_child(L"stage", stage_info.get());
info.add_child(L"mixer", mixer_info.get());
info.add_child(L"output", output_info.get());
-
- return info;
+
+ return info;
}
boost::property_tree::wptree delay_info() const