]> git.sesse.net Git - nageru/blobdiff - nageru/decklink_output.h
Newer drivers can seemingly send completions out-of-order on shutdown, so adjust...
[nageru] / nageru / decklink_output.h
index f1b40f468abdd703eb8df9c1e0410d3a78696d29..f008dc3b32bec8f0c1aba542c4d3de3a8167b047 100644 (file)
@@ -12,6 +12,7 @@
 #include <mutex>
 #include <queue>
 #include <thread>
+#include <unordered_set>
 #include <vector>
 
 #include "DeckLinkAPI.h"
@@ -38,8 +39,13 @@ class QSurface;
 class DeckLinkOutput : public IDeckLinkVideoOutputCallback {
 public:
        DeckLinkOutput(movit::ResourcePool *resource_pool, QSurface *surface, unsigned width, unsigned height, unsigned card_index);
+       ~DeckLinkOutput();
 
-       bool set_device(IDeckLink *output);
+       // 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 end_output();
 
@@ -134,7 +140,7 @@ private:
        std::mutex frame_queue_mutex;
        std::queue<std::unique_ptr<Frame>> pending_video_frames;  // Under <frame_queue_mutex>.
        std::queue<std::unique_ptr<Frame>> frame_freelist;  // Under <frame_queue_mutex>.
-       std::deque<Frame *> scheduled_frames;  // Owned by the driver, so no unique_ptr. Under <frame_queue_mutex>.
+       std::unordered_set<Frame *> scheduled_frames;  // Owned by the driver, so no unique_ptr. Under <frame_queue_mutex>.
 
        std::condition_variable frame_queues_changed;
        bool playback_initiated = false, playback_started = false;