]> git.sesse.net Git - bmusb/blob - fake_capture.h
Build and install a static library.
[bmusb] / fake_capture.h
1 #ifndef _FAKE_CAPTURE_H
2 #define _FAKE_CAPTURE_H 1
3
4 #include <stdint.h>
5 #include <functional>
6 #include <string>
7
8 #include "bmusb.h"
9
10 namespace bmusb {
11
12 class FakeCapture : public CaptureInterface
13 {
14 public:
15         FakeCapture(unsigned width, unsigned height, unsigned fps, unsigned audio_frequency, int card_index);
16         ~FakeCapture();
17
18         // CaptureInterface.
19         void set_video_frame_allocator(FrameAllocator *allocator) override
20         {
21                 video_frame_allocator = allocator;
22                 if (owned_video_frame_allocator.get() != allocator) {
23                         owned_video_frame_allocator.reset();
24                 }
25         }
26
27         FrameAllocator *get_video_frame_allocator() override
28         {
29                 return video_frame_allocator;
30         }
31
32         // Does not take ownership.
33         void set_audio_frame_allocator(FrameAllocator *allocator) override
34         {
35                 audio_frame_allocator = allocator;
36                 if (owned_audio_frame_allocator.get() != allocator) {
37                         owned_audio_frame_allocator.reset();
38                 }
39         }
40
41         FrameAllocator *get_audio_frame_allocator() override
42         {
43                 return audio_frame_allocator;
44         }
45
46         void set_frame_callback(frame_callback_t callback) override
47         {
48                 frame_callback = callback;
49         }
50
51         void set_dequeue_thread_callbacks(std::function<void()> init, std::function<void()> cleanup) override
52         {
53                 dequeue_init_callback = init;
54                 dequeue_cleanup_callback = cleanup;
55                 has_dequeue_callbacks = true;
56         }
57
58         std::string get_description() const override
59         {
60                 return description;
61         }
62
63         void configure_card() override;
64         void start_bm_capture() override;
65         void stop_dequeue_thread() override;
66         bool get_disconnected() const override { return false; }
67
68         std::map<uint32_t, VideoMode> get_available_video_modes() const override;
69         void set_video_mode(uint32_t video_mode_id) override;
70         uint32_t get_current_video_mode() const override { return 0; }
71
72         std::map<uint32_t, std::string> get_available_video_inputs() const override;
73         void set_video_input(uint32_t video_input_id) override;
74         uint32_t get_current_video_input() const override { return 0; }
75
76         std::map<uint32_t, std::string> get_available_audio_inputs() const override;
77         void set_audio_input(uint32_t audio_input_id) override;
78         uint32_t get_current_audio_input() const override { return 0; }
79
80 private:
81         void producer_thread_func();
82
83         unsigned width, height, fps, audio_frequency;
84         uint8_t y, cb, cr;
85
86         bool has_dequeue_callbacks = false;
87         std::function<void()> dequeue_init_callback = nullptr;
88         std::function<void()> dequeue_cleanup_callback = nullptr;
89
90         FrameAllocator *video_frame_allocator = nullptr;
91         FrameAllocator *audio_frame_allocator = nullptr;
92         std::unique_ptr<FrameAllocator> owned_video_frame_allocator;
93         std::unique_ptr<FrameAllocator> owned_audio_frame_allocator;
94         frame_callback_t frame_callback = nullptr;
95
96         std::string description;
97
98         std::atomic<bool> producer_thread_should_quit{false};
99         std::thread producer_thread;
100 };
101
102 }  // namespace bmusb
103
104 #endif  // !defined(_FAKE_CAPTURE_H)