X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bmusb.h;h=d47ce8e85c4541be65dcd89c7b10ed727781b153;hb=4602e6f93d7e353f59ff6707a087067ed4e53b0f;hp=301350f53be858fac1885f0821920bdbac600e2c;hpb=30929c8ebab480afe338104cbc490016d8dcc932;p=bmusb diff --git a/bmusb.h b/bmusb.h index 301350f..d47ce8e 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,29 @@ 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; + int assumed_frame_width = 1280; }; +// 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. +// "second_field_start" is only valid for interlaced modes; it signifies +// how many lines from the very top of the frame there are before the second field +// starts (so it will always be >= height/2 + extra_lines_top). +bool decode_video_format(uint16_t video_format, unsigned *width, unsigned *height, unsigned *second_field_start, + unsigned *extra_lines_top, unsigned *extra_lines_bottom, + unsigned *frame_rate_nom, unsigned *frame_rate_den, bool *interlaced); + #endif