X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fdecklink_output.h;h=4aa76beca45df780d86d758401319cdeb7063005;hb=685a74b4a2e928670eb5fb53919bbcffca45c8e3;hp=8213f498a9d0677df7fe77b928acc7dce8951825;hpb=ccc2b89c9cf879ccbd948e169a029917cc16f0ee;p=nageru diff --git a/nageru/decklink_output.h b/nageru/decklink_output.h index 8213f49..4aa76be 100644 --- a/nageru/decklink_output.h +++ b/nageru/decklink_output.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include "DeckLinkAPI.h" @@ -38,13 +39,14 @@ class QSurface; class DeckLinkOutput : public IDeckLinkVideoOutputCallback { public: DeckLinkOutput(movit::ResourcePool *resource_pool, QSurface *surface, unsigned width, unsigned height, unsigned card_index); + ~DeckLinkOutput(); // The IDecklinkInput argument is to work around a bug // in the 11.7 and newer drivers against older SDKs, // where you get a freeze if querying an IDeckLinkInput interface // on an already-started card. bool set_device(IDeckLink *decklink, IDeckLinkInput *input_arg); - void start_output(uint32_t mode, int64_t base_pts); // Mode comes from get_available_video_modes(). + void start_output(uint32_t mode, int64_t base_pts, bool is_master_card); // Mode comes from get_available_video_modes(). void end_output(); void send_frame(GLuint y_tex, GLuint cbcr_tex, movit::YCbCrLumaCoefficients ycbcr_coefficients, const std::vector &input_frames, int64_t pts, int64_t duration); @@ -138,10 +140,10 @@ private: std::mutex frame_queue_mutex; std::queue> pending_video_frames; // Under . std::queue> frame_freelist; // Under . - std::deque scheduled_frames; // Owned by the driver, so no unique_ptr. Under . + std::unordered_set scheduled_frames; // Owned by the driver, so no unique_ptr. Under . std::condition_variable frame_queues_changed; - bool playback_initiated = false, playback_started = false; + bool playback_initiated = false, playback_started = false, is_master_card = false; int64_t base_pts, frame_duration; BMDDisplayModeFlags current_mode_flags = 0; bool last_frame_had_mode_mismatch = false;