From 8d0745b431be441b73f5bd3d19775eea49c760dd Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sun, 22 Jan 2017 12:51:12 +0100 Subject: [PATCH] Make for clean shutdown of the output cards. --- decklink_output.cpp | 7 +++++++ decklink_output.h | 2 +- mixer.cpp | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/decklink_output.cpp b/decklink_output.cpp index 7fa689e..c5bf96b 100644 --- a/decklink_output.cpp +++ b/decklink_output.cpp @@ -63,8 +63,10 @@ void DeckLinkOutput::set_device(IDeckLink *decklink) void DeckLinkOutput::start_output(uint32_t mode, int64_t base_pts) { assert(output); + assert(!playback_initiated); should_quit = false; + playback_initiated = true; playback_started = false; this->base_pts = base_pts; @@ -153,9 +155,14 @@ void DeckLinkOutput::start_output(uint32_t mode, int64_t base_pts) void DeckLinkOutput::end_output() { + if (!playback_initiated) { + return; + } + should_quit = true; frame_queues_changed.notify_all(); present_thread.join(); + playback_initiated = false; output->StopScheduledPlayback(0, nullptr, 0); output->DisableVideoOutput(); diff --git a/decklink_output.h b/decklink_output.h index 0545bb7..122c8fe 100644 --- a/decklink_output.h +++ b/decklink_output.h @@ -117,7 +117,7 @@ private: std::queue> frame_freelist; // Under . int num_frames_in_flight = 0; // Number of frames allocated but not on the freelist. Under . std::condition_variable frame_queues_changed; - bool playback_started = false; + bool playback_initiated = false, playback_started = false; int64_t base_pts, frame_duration; movit::ResourcePool *resource_pool; diff --git a/mixer.cpp b/mixer.cpp index d55363f..0d32612 100644 --- a/mixer.cpp +++ b/mixer.cpp @@ -217,6 +217,10 @@ Mixer::~Mixer() cards[card_index].new_frames_changed.notify_all(); } cards[card_index].capture->stop_dequeue_thread(); + if (cards[card_index].output) { + cards[card_index].output->end_output(); + delete cards[card_index].output; + } } video_encoder.reset(nullptr); -- 2.39.2