X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bmusb.h;h=9eb3ff4f716a4ede88c997f65131c6fe69232179;hb=89136643760d7da0c94c4d4fb1ec778f9cefb97f;hp=e0531c2c3f552543b81b48a225b396e4b7974c67;hpb=91ded9e745544b6a6aa813f289113305674cdbd9;p=bmusb diff --git a/bmusb.h b/bmusb.h index e0531c2..9eb3ff4 100644 --- a/bmusb.h +++ b/bmusb.h @@ -8,6 +8,9 @@ #include #include #include +#include + +struct libusb_transfer; // An interface for frame allocators; if you do not specify one // (using set_video_frame_allocator), a default one that pre-allocates @@ -22,6 +25,7 @@ class FrameAllocator { uint8_t *data2 = nullptr; // Only if interleaved == true. size_t len = 0; // Number of bytes we actually have. size_t size = 0; // Number of bytes we have room for. + size_t overflow = 0; void *userdata = nullptr; FrameAllocator *owner = nullptr; @@ -60,6 +64,11 @@ typedef std::function init, std::function cleanup) + { + dequeue_init_callback = init; + dequeue_cleanup_callback = cleanup; + has_dequeue_callbacks = true; + } + + void configure_card(); void start_bm_capture(); - void stop_bm_capture(); + void stop_dequeue_thread(); + + static void start_bm_thread(); + static void stop_bm_thread(); private: struct QueuedFrame { @@ -101,9 +122,9 @@ class BMUSBCapture { void start_new_frame(const uint8_t *start); void queue_frame(uint16_t format, uint16_t timecode, FrameAllocator::Frame frame, std::deque *q); - void dequeue_thread(); + void dequeue_thread_func(); - void usb_thread_func(); + static void usb_thread_func(); static void cb_xfr(struct libusb_transfer *xfr); FrameAllocator::Frame current_video_frame; @@ -114,17 +135,27 @@ class BMUSBCapture { std::deque pending_video_frames; std::deque pending_audio_frames; - std::thread usb_thread; - std::atomic should_quit; - FrameAllocator *video_frame_allocator = nullptr; FrameAllocator *audio_frame_allocator = nullptr; frame_callback_t frame_callback = nullptr; + std::thread dequeue_thread; + std::atomic dequeue_thread_should_quit; + bool has_dequeue_callbacks = false; + std::function dequeue_init_callback = nullptr; + std::function dequeue_cleanup_callback = nullptr; + int current_register = 0; static constexpr int NUM_BMUSB_REGISTERS = 60; uint8_t register_file[NUM_BMUSB_REGISTERS]; + + int card_index; + std::vector iso_xfrs; }; +// Get details for the given video format; returns false if detection was incomplete. +// Note: Frame rate is _frame_ rate, not field rate. So 1080i60 gets 30/1, _not_ 60/1. +bool decode_video_format(uint16_t video_format, int *width, int *height, int *frame_rate_nom, int *frame_rate_den, bool *interlaced); + #endif