]> git.sesse.net Git - nageru/blobdiff - nageru/decklink_output.cpp
Newer drivers can seemingly send completions out-of-order on shutdown, so adjust...
[nageru] / nageru / decklink_output.cpp
index da172af686acbc3ff7acf489a7befd01a2efb2f7..5cf3abf5f391f6c301e51f6378256aad87cae8a4 100644 (file)
@@ -82,11 +82,9 @@ DeckLinkOutput::DeckLinkOutput(ResourcePool *resource_pool, QSurface *surface, u
        });
 }
 
-bool DeckLinkOutput::set_device(IDeckLink *decklink)
+bool DeckLinkOutput::set_device(IDeckLink *decklink, IDeckLinkInput *input_arg)
 {
-       if (decklink->QueryInterface(IID_IDeckLinkInput, (void**)&input) != S_OK) {
-               input = nullptr;
-       }
+       input = input_arg;
        if (decklink->QueryInterface(IID_IDeckLinkOutput, (void**)&output) != S_OK) {
                fprintf(stderr, "Warning: Card %u has no outputs\n", card_index);
                return false;
@@ -503,8 +501,8 @@ HRESULT DeckLinkOutput::ScheduledFrameCompleted(/* in */ IDeckLinkVideoFrame *co
        {
                lock_guard<mutex> lock(frame_queue_mutex);
                frame_freelist.push(unique_ptr<Frame>(frame));
-               assert(scheduled_frames.front() == frame);
-               scheduled_frames.pop_front();
+               assert(scheduled_frames.count(frame));
+               scheduled_frames.erase(frame);
                --metric_decklink_output_inflight_frames;
        }
 
@@ -602,7 +600,7 @@ void DeckLinkOutput::present_thread_func()
                HRESULT res = output->ScheduleVideoFrame(frame.get(), pts, duration, TIMEBASE);
                lock_guard<mutex> lock(frame_queue_mutex);
                if (res == S_OK) {
-                       scheduled_frames.push_back(frame.release());  // Owned by the driver now.
+                       scheduled_frames.insert(frame.release());  // Owned by the driver now.
                        ++metric_decklink_output_inflight_frames;
                } else {
                        fprintf(stderr, "Could not schedule video frame! (error=0x%08x)\n", res);