X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdecklink%2Fconsumer%2Fdecklink_consumer.cpp;h=37dfeea1b7d057c30e42b0aecd33a9ec237709ff;hb=f529ebe9cc9c0a58a6ba4a1ebcd377b4dabf830a;hp=ca44c82c956d9c499f2022c40f79461874a0a1d7;hpb=850c2bc019012444a7081e0347da9d7d24b213b4;p=casparcg diff --git a/modules/decklink/consumer/decklink_consumer.cpp b/modules/decklink/consumer/decklink_consumer.cpp index ca44c82c9..37dfeea1b 100644 --- a/modules/decklink/consumer/decklink_consumer.cpp +++ b/modules/decklink/consumer/decklink_consumer.cpp @@ -57,6 +57,8 @@ #include #include +#include + namespace caspar { namespace decklink { struct configuration @@ -390,7 +392,7 @@ struct decklink_consumer : public IDeckLinkVideoOutputCallback, boost::noncopyab spl::shared_ptr graph_; caspar::timer tick_timer_; - retry_task send_completion_; + std::packaged_task send_completion_; reference_signal_detector reference_signal_detector_ { output_ }; tbb::atomic current_presentation_delay_; tbb::atomic scheduled_frames_completed_; @@ -566,7 +568,8 @@ public: frame_buffer_.pop(frame); - send_completion_.try_completion(); + if (send_completion_.valid()) + send_completion_(); if (config_.embedded_audio) schedule_next_audio(channel_remapper_.mix_and_rearrange(frame.audio_data())); @@ -627,21 +630,15 @@ public: if(!is_running_) CASPAR_THROW_EXCEPTION(caspar_exception() << msg_info(print() + L" Is not running.")); - bool ready = false; + if (frame_buffer_.try_push(frame)) + return make_ready_future(true); - auto enqueue_task = [ready, frame, this]() mutable -> boost::optional + send_completion_ = std::packaged_task([frame, this] () mutable -> bool { - if (!ready) - ready = frame_buffer_.try_push(frame); - - if (ready) - return true; - else - return boost::optional(); - }; + frame_buffer_.push(frame); - send_completion_.set_task(enqueue_task); - send_completion_.try_completion(); + return true; + }); return send_completion_.get_future(); }