{
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;
}
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);
#include <mutex>
#include <queue>
#include <thread>
+#include <unordered_set>
#include <vector>
#include "DeckLinkAPI.h"
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,
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;