X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bmusb.h;h=9eb3ff4f716a4ede88c997f65131c6fe69232179;hb=89136643760d7da0c94c4d4fb1ec778f9cefb97f;hp=301350f53be858fac1885f0821920bdbac600e2c;hpb=30929c8ebab480afe338104cbc490016d8dcc932;p=bmusb diff --git a/bmusb.h b/bmusb.h index 301350f..9eb3ff4 100644 --- a/bmusb.h +++ b/bmusb.h @@ -25,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; @@ -63,8 +64,8 @@ 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_dequeue_thread(); static void start_bm_thread(); static void stop_bm_thread(); @@ -112,7 +122,7 @@ 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(); static void usb_thread_func(); static void cb_xfr(struct libusb_transfer *xfr); @@ -129,13 +139,23 @@ class BMUSBCapture { 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 vid, pid; + 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