X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=decklink_capture.h;h=f940241a854f7acc941b1af56d2a35567389458e;hb=d3e48df512d9476d3849227067792a3537bb094e;hp=f54711674b73757851f14c20c3e5f00fcff8f057;hpb=6ac03a94da0872c424caab1de79a9a0c1822305a;p=nageru diff --git a/decklink_capture.h b/decklink_capture.h index f547116..f940241 100644 --- a/decklink_capture.h +++ b/decklink_capture.h @@ -5,16 +5,22 @@ #include #include #include +#include +#include +#include #include +#include "DeckLinkAPIModes.h" +#include "DeckLinkAPITypes.h" +#include "LinuxCOM.h" #include "bmusb/bmusb.h" class IDeckLink; -class IDeckLinkDisplayMode; +class IDeckLinkConfiguration; // 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); // Takes ownership of . @@ -33,28 +39,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,10 +87,21 @@ 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; } + std::set get_available_pixel_formats() const override { + return std::set{ bmusb::PixelFormat_8BitYCbCr, bmusb::PixelFormat_10BitYCbCr }; + } + void set_pixel_format(bmusb::PixelFormat pixel_format) override; + bmusb::PixelFormat get_current_pixel_format() const override { + return current_pixel_format; + } + std::map get_available_video_inputs() const override { return video_inputs; } void set_video_input(uint32_t video_input_id) override; uint32_t get_current_video_input() const override { return current_video_input; } @@ -100,9 +123,11 @@ 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; @@ -110,9 +135,13 @@ private: IDeckLinkInput *input = nullptr; BMDTimeValue frame_duration; BMDTimeScale time_scale; + BMDFieldDominance field_dominance; + bool running = false; + bool supports_autodetect = false; - std::map video_modes; + std::map video_modes; BMDDisplayMode current_video_mode; + bmusb::PixelFormat current_pixel_format = bmusb::PixelFormat_8BitYCbCr; std::map video_inputs; BMDVideoConnection current_video_input;