+class CaptureInterface {
+ public:
+ virtual ~CaptureInterface() {}
+
+ virtual std::map<uint32_t, VideoMode> get_available_video_modes() const = 0;
+ virtual uint32_t get_current_video_mode() const = 0;
+ virtual void set_video_mode(uint32_t video_mode_id) = 0;
+
+ virtual std::map<uint32_t, std::string> get_available_video_inputs() const = 0;
+ virtual void set_video_input(uint32_t video_input_id) = 0;
+ virtual uint32_t get_current_video_input() const = 0;
+
+ virtual std::map<uint32_t, std::string> get_available_audio_inputs() const = 0;
+ virtual void set_audio_input(uint32_t audio_input_id) = 0;
+ virtual uint32_t get_current_audio_input() const = 0;
+
+ // Does not take ownership.
+ virtual void set_video_frame_allocator(FrameAllocator *allocator) = 0;
+
+ virtual FrameAllocator *get_video_frame_allocator() = 0;
+
+ // Does not take ownership.
+ virtual void set_audio_frame_allocator(FrameAllocator *allocator) = 0;
+
+ virtual FrameAllocator *get_audio_frame_allocator() = 0;
+
+ virtual void set_frame_callback(frame_callback_t callback) = 0;
+
+ // Needs to be run before configure_card().
+ virtual void set_dequeue_thread_callbacks(std::function<void()> init, std::function<void()> cleanup) = 0;
+
+ // Only valid after configure_card().
+ virtual std::string get_description() const = 0;
+
+ virtual void configure_card() = 0;
+
+ virtual void start_bm_capture() = 0;
+
+ virtual void stop_dequeue_thread() = 0;
+};
+
+// The actual capturing class, representing capture from a single card.
+class BMUSBCapture : public CaptureInterface {
+ public:
+ BMUSBCapture(int card_index)
+ : card_index(card_index)
+ {
+ }
+
+ ~BMUSBCapture() {}
+
+ std::map<uint32_t, VideoMode> get_available_video_modes() const override;
+ uint32_t get_current_video_mode() const override;
+ void set_video_mode(uint32_t video_mode_id) override;
+
+ virtual std::map<uint32_t, std::string> get_available_video_inputs() const override;
+ virtual void set_video_input(uint32_t video_input_id) override;
+ virtual uint32_t get_current_video_input() const override { return current_video_input; }
+
+ virtual std::map<uint32_t, std::string> get_available_audio_inputs() const override;
+ virtual void set_audio_input(uint32_t audio_input_id) override;
+ virtual uint32_t get_current_audio_input() const override { return current_audio_input; }
+
+ // Does not take ownership.
+ void set_video_frame_allocator(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
+ {
+ return video_frame_allocator;
+ }
+
+ // Does not take ownership.
+ void set_audio_frame_allocator(FrameAllocator *allocator) override
+ {
+ audio_frame_allocator = allocator;
+ if (owned_audio_frame_allocator.get() != allocator) {
+ owned_audio_frame_allocator.reset();
+ }
+ }