X-Git-Url: https://git.sesse.net/?p=nageru;a=blobdiff_plain;f=decklink_capture.h;h=f940241a854f7acc941b1af56d2a35567389458e;hp=695f9d376325c9729f64956109d784072f52dea8;hb=refs%2Fheads%2Fcef;hpb=4a0a27cb0512737b3025804d52237fadc6afcc26 diff --git a/decklink_capture.h b/decklink_capture.h index 695f9d3..f940241 100644 --- a/decklink_capture.h +++ b/decklink_capture.h @@ -5,19 +5,25 @@ #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); + DeckLinkCapture(IDeckLink *card, int card_index); // Takes ownership of . ~DeckLinkCapture(); // IDeckLinkInputCallback. @@ -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,23 +87,67 @@ public: void start_bm_capture() override; void stop_dequeue_thread() override; + // 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; } + + std::map get_available_audio_inputs() const override { return audio_inputs; } + void set_audio_input(uint32_t audio_input_id) override; + uint32_t get_current_audio_input() const override { return current_audio_input; } + private: + void set_video_mode_no_restart(uint32_t video_mode_id); + std::atomic refcount{1}; bool done_init = false; std::string description; uint16_t timecode = 0; + int card_index; bool has_dequeue_callbacks = false; 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; + BMDFieldDominance field_dominance; + bool running = false; + bool supports_autodetect = false; + + std::map video_modes; + BMDDisplayMode current_video_mode; + bmusb::PixelFormat current_pixel_format = bmusb::PixelFormat_8BitYCbCr; + + std::map video_inputs; + BMDVideoConnection current_video_input; + + std::map audio_inputs; + BMDAudioConnection current_audio_input; }; #endif // !defined(_DECKLINK_CAPTURE_H)