X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=decklink_capture.h;h=0a9c37b0494539c3cc5c3bc3f8964793cefa6a77;hb=c3a08ff6100840205d295a58d6bf340aa20afde0;hp=69ab08e3cd48285e399c4a57d0bf5af932060003;hpb=9b641abb4dfc4494d02fdcb6d2c867148ab8f08f;p=nageru diff --git a/decklink_capture.h b/decklink_capture.h index 69ab08e..0a9c37b 100644 --- a/decklink_capture.h +++ b/decklink_capture.h @@ -14,10 +14,10 @@ class IDeckLinkDisplayMode; // TODO: Adjust CaptureInterface to be a little less bmusb-centric. // There are too many member functions here that don't really do anything. -class DeckLinkCapture : public CaptureInterface, IDeckLinkInputCallback +class DeckLinkCapture : public bmusb::CaptureInterface, IDeckLinkInputCallback { public: - DeckLinkCapture(IDeckLink *card, int card_index); + DeckLinkCapture(IDeckLink *card, int card_index); // Takes ownership of . ~DeckLinkCapture(); // IDeckLinkInputCallback. @@ -33,28 +33,34 @@ public: IDeckLinkAudioInputPacket *audio_frame) override; // CaptureInterface. - void set_video_frame_allocator(FrameAllocator *allocator) override + void set_video_frame_allocator(bmusb::FrameAllocator *allocator) override { video_frame_allocator = allocator; + if (owned_video_frame_allocator.get() != allocator) { + owned_video_frame_allocator.reset(); + } } - FrameAllocator *get_video_frame_allocator() override + bmusb::FrameAllocator *get_video_frame_allocator() override { return video_frame_allocator; } // Does not take ownership. - void set_audio_frame_allocator(FrameAllocator *allocator) override + void set_audio_frame_allocator(bmusb::FrameAllocator *allocator) override { audio_frame_allocator = allocator; + if (owned_audio_frame_allocator.get() != allocator) { + owned_audio_frame_allocator.reset(); + } } - FrameAllocator *get_audio_frame_allocator() override + bmusb::FrameAllocator *get_audio_frame_allocator() override { return audio_frame_allocator; } - void set_frame_callback(frame_callback_t callback) override + void set_frame_callback(bmusb::frame_callback_t callback) override { frame_callback = callback; } @@ -75,7 +81,10 @@ public: void start_bm_capture() override; void stop_dequeue_thread() override; - std::map get_available_video_modes() const override { return video_modes; } + // TODO: Can the API communicate this to us somehow, for e.g. Thunderbolt cards? + bool get_disconnected() const override { return false; } + + std::map get_available_video_modes() const override { return video_modes; } void set_video_mode(uint32_t video_mode_id) override; uint32_t get_current_video_mode() const override { return current_video_mode; } @@ -100,17 +109,20 @@ private: std::function dequeue_init_callback = nullptr; std::function dequeue_cleanup_callback = nullptr; - FrameAllocator *video_frame_allocator = nullptr; - FrameAllocator *audio_frame_allocator = nullptr; - frame_callback_t frame_callback = nullptr; + bmusb::FrameAllocator *video_frame_allocator = nullptr; + bmusb::FrameAllocator *audio_frame_allocator = nullptr; + std::unique_ptr owned_video_frame_allocator; + std::unique_ptr owned_audio_frame_allocator; + bmusb::frame_callback_t frame_callback = nullptr; IDeckLinkConfiguration *config = nullptr; + IDeckLink *card = nullptr; IDeckLinkInput *input = nullptr; BMDTimeValue frame_duration; BMDTimeScale time_scale; - std::map video_modes; + std::map video_modes; BMDDisplayMode current_video_mode; std::map video_inputs;