boost::property_tree::wptree info() const { boost::property_tree::wptree info; info.add(L"status", is_paused_ ? L"paused" : (foreground_ == frame_producer::empty() ? L"stopped" : L"playing")); info.add(L"auto_delta", auto_play_delta_); info.add(L"frame-number", frame_number_); auto nb_frames = foreground_->nb_frames(); info.add(L"nb_frames", nb_frames == std::numeric_limits<int64_t>::max() ? -1 : nb_frames); info.add(L"frames-left", nb_frames == std::numeric_limits<int64_t>::max() ? -1 : (foreground_->nb_frames() - frame_number_ - auto_play_delta_)); info.add_child(L"foreground.producer", foreground_->info()); info.add_child(L"background.producer", background_->info()); return info; }
safe_ptr<basic_frame> receive(int hints) { try { if(is_paused_) return disable_audio(foreground_->last_frame()); auto frame = receive_and_follow(foreground_, hints); if(frame == core::basic_frame::late()) return foreground_->last_frame(); auto frames_left = static_cast<int64_t>(foreground_->nb_frames()) - static_cast<int64_t>(++frame_number_) - static_cast<int64_t>(auto_play_delta_); if(auto_play_delta_ > -1 && frames_left < 1) { play(); return receive(hints); } return frame; } catch(...) { CASPAR_LOG_CURRENT_EXCEPTION(); stop(); return core::basic_frame::empty(); } }
safe_ptr<basic_frame> receive() { try { if(is_paused_) return disable_audio(foreground_->last_frame()); auto frame = receive_and_follow(foreground_, frame_producer::NO_HINT); if(frame == core::basic_frame::late()) return foreground_->last_frame(); auto frames_left = foreground_->nb_frames() - (++frame_number_) - auto_play_delta_; if(auto_play_delta_ > -1 && frames_left < 1) { play(); return receive(); } return frame; } catch(...) { CASPAR_LOG_CURRENT_EXCEPTION(); stop(); return core::basic_frame::empty(); } }
layer_status status() const { layer_status status; status.foreground = foreground_->print(); status.background = background_->print(); status.is_paused = is_paused_; status.total_frames = foreground_->nb_frames(); status.current_frame = frame_number_; return status; }
safe_ptr<basic_frame> receive(int hints) { try { monitor_subject_ << monitor::message("/paused") % is_paused_; if(is_paused_) { if(foreground_->last_frame() == basic_frame::empty()) foreground_->receive(frame_producer::NO_HINT); return disable_audio(foreground_->last_frame()); } auto foreground = foreground_; auto frame = receive_and_follow(foreground, hints); if(foreground != foreground_) set_foreground(foreground); if(frame == core::basic_frame::late()) return foreground_->last_frame(); auto frames_left = static_cast<int64_t>(foreground_->nb_frames()) - static_cast<int64_t>(++frame_number_) - static_cast<int64_t>(auto_play_delta_); if(auto_play_delta_ > -1 && frames_left < 1) { play(); return receive(hints); } return frame; } catch(...) { CASPAR_LOG_CURRENT_EXCEPTION(); stop(); return core::basic_frame::empty(); } }
virtual uint32_t nb_frames() const override { return std::min(fill_producer_->nb_frames(), key_producer_->nb_frames()); }
last_frame_producer(const safe_ptr<frame_producer>& producer) : print_(producer->print()) , frame_(producer->last_frame() != basic_frame::eof() ? producer->last_frame() : basic_frame::empty()) , nb_frames_(producer->nb_frames()) { }