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;
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();
std::queue<std::unique_ptr<Frame>> frame_freelist; // Under <frame_queue_mutex>.
int num_frames_in_flight = 0; // Number of frames allocated but not on the freelist. Under <frame_queue_mutex>.
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;
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);