#include <functional>
#include <mutex>
#include <thread>
+#include <vector>
// An interface for frame allocators; if you do not specify one
// (using set_video_frame_allocator), a default one that pre-allocates
// The actual capturing class, representing capture from a single card.
class BMUSBCapture {
public:
+ BMUSBCapture(int vid = 0x1edb, int pid = 0xbd3b)
+ : vid(vid), pid(pid)
+ {
+ }
+
// Does not take ownership.
void set_video_frame_allocator(FrameAllocator *allocator)
{
frame_callback = callback;
}
+ void configure_card();
void start_bm_capture();
- void stop_bm_capture();
+
+ static void start_bm_thread();
+ static void stop_bm_thread();
private:
struct QueuedFrame {
void queue_frame(uint16_t format, uint16_t timecode, FrameAllocator::Frame frame, std::deque<QueuedFrame> *q);
void dequeue_thread();
- void usb_thread_func();
+ static void usb_thread_func();
static void cb_xfr(struct libusb_transfer *xfr);
FrameAllocator::Frame current_video_frame;
std::deque<QueuedFrame> pending_video_frames;
std::deque<QueuedFrame> pending_audio_frames;
- std::thread usb_thread;
- std::atomic<bool> should_quit;
-
FrameAllocator *video_frame_allocator = nullptr;
FrameAllocator *audio_frame_allocator = nullptr;
frame_callback_t frame_callback = nullptr;
static constexpr int NUM_BMUSB_REGISTERS = 60;
uint8_t register_file[NUM_BMUSB_REGISTERS];
+
+ int vid, pid;
+ std::vector<libusb_transfer *> iso_xfrs;
};
#endif