X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bmusb.cpp;h=0c3fb551570188ba74e674d9e181f5ca3514b66b;hb=1833f747a9008f38e5597622f2e3dbce3340e2cb;hp=e9a912524b25a25e809e2f8b35c275b3f1227236;hpb=d53ab27c6945636a8031e1868c503adeb7dad557;p=bmusb diff --git a/bmusb.cpp b/bmusb.cpp index e9a9125..0c3fb55 100644 --- a/bmusb.cpp +++ b/bmusb.cpp @@ -1,4 +1,4 @@ -// Intensity Shuttle USB3 capture driver, v0.4 +// Intensity Shuttle USB3 capture driver, v0.5.4 // Can download 8-bit and 10-bit UYVY/v210 frames from HDMI, quite stable // (can do captures for hours at a time with no drops), except during startup // 576p60/720p60/1080i60 works, 1080p60 does not work (firmware limitation) @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -25,6 +26,7 @@ #include #include +#include #include #include #include @@ -37,6 +39,7 @@ #include using namespace std; +using namespace std::chrono; using namespace std::placeholders; #define USB_VENDOR_BLACKMAGIC 0x1edb @@ -172,14 +175,14 @@ bool decode_video_format(uint16_t video_format, VideoFormat *decoded_video_forma { 0x0103, 1280, 720, 0, 25, 5, 60, 1, false }, // 720p60. { 0x0125, 1280, 720, 0, 25, 5, 60, 1, false }, // 720p60. { 0x0121, 1280, 720, 0, 25, 5, 60000, 1001, false }, // 720p59.94. - { 0x01c3, 1920, 1080, 0, 0, 0, 30, 1, false }, // 1080p30. + { 0x01c3, 1920, 1080, 0, 20, 25, 30, 1, false }, // 1080p30. { 0x0003, 1920, 1080, 583, 20, 25, 30, 1, true }, // 1080i60. - { 0x01e1, 1920, 1080, 0, 0, 0, 30000, 1001, false }, // 1080p29.97. + { 0x01e1, 1920, 1080, 0, 20, 25, 30000, 1001, false }, // 1080p29.97. { 0x0021, 1920, 1080, 583, 20, 25, 30000, 1001, true }, // 1080i59.94. - { 0x0063, 1920, 1080, 0, 0, 0, 25, 1, false }, // 1080p25. - { 0x0043, 1920, 1080, 0, 0, 0, 25, 1, true }, // 1080p50. - { 0x008e, 1920, 1080, 0, 0, 0, 24, 1, false }, // 1080p24. - { 0x00a1, 1920, 1080, 0, 0, 0, 24000, 1001, false }, // 1080p23.98. + { 0x0063, 1920, 1080, 0, 20, 25, 25, 1, false }, // 1080p25. + { 0x0043, 1920, 1080, 583, 20, 25, 25, 1, true }, // 1080i50. + { 0x0083, 1920, 1080, 0, 20, 25, 24, 1, false }, // 1080p24. + { 0x00a1, 1920, 1080, 0, 20, 25, 24000, 1001, false }, // 1080p23.98. }; for (const VideoFormatEntry &entry : entries) { if (normalized_video_format == entry.normalized_video_format) { @@ -287,6 +290,10 @@ void dump_audio_block(uint8_t *audio_start, size_t audio_len) void BMUSBCapture::dequeue_thread_func() { + char thread_name[16]; + snprintf(thread_name, sizeof(thread_name), "bmusb_dequeue_%d", card_index); + pthread_setname_np(pthread_self(), thread_name); + if (has_dequeue_callbacks) { dequeue_init_callback(); } @@ -362,6 +369,8 @@ void BMUSBCapture::start_new_frame(const uint8_t *start) uint16_t timecode = (start[1] << 8) | start[0]; if (current_video_frame.len > 0) { + current_video_frame.received_timestamp = steady_clock::now(); + // If format is 0x0800 (no signal), add a fake (empty) audio // frame to get it out of the queue. // TODO: Figure out if there are other formats that come with @@ -405,6 +414,7 @@ void BMUSBCapture::start_new_audio_block(const uint8_t *start) uint16_t format = (start[3] << 8) | start[2]; uint16_t timecode = (start[1] << 8) | start[0]; if (current_audio_frame.len > 0) { + current_audio_frame.received_timestamp = steady_clock::now(); //dump_audio_block(); queue_frame(format, timecode, current_audio_frame, &pending_audio_frames); } @@ -536,6 +546,10 @@ const uint8_t *add_to_frame_fastpath(FrameAllocator::Frame *current_frame, const #else // defined(HAS_MULTIVERSIONING) +__attribute__((target("sse4.1"))) +const uint8_t *add_to_frame_fastpath_core(FrameAllocator::Frame *current_frame, const uint8_t *aligned_start, const uint8_t *limit, const char sync_char); + +__attribute__((target("avx2"))) const uint8_t *add_to_frame_fastpath_core(FrameAllocator::Frame *current_frame, const uint8_t *aligned_start, const uint8_t *limit, const char sync_char); // Does a memcpy and memchr in one to reduce processing time. @@ -877,8 +891,10 @@ void BMUSBCapture::usb_thread_func() if (sched_setscheduler(0, SCHED_RR, ¶m) == -1) { printf("couldn't set realtime priority for USB thread: %s\n", strerror(errno)); } + pthread_setname_np(pthread_self(), "bmusb_usb_drv"); while (!should_quit) { - int rc = libusb_handle_events(nullptr); + timeval sec { 1, 0 }; + int rc = libusb_handle_events_timeout(nullptr, &sec); if (rc != LIBUSB_SUCCESS) break; } @@ -1104,6 +1120,11 @@ void BMUSBCapture::configure_card() rc = libusb_set_interface_alt_setting(devh, /*interface=*/0, /*alternate_setting=*/1); if (rc < 0) { fprintf(stderr, "Error setting alternate 1: %s\n", libusb_error_name(rc)); + if (rc == LIBUSB_ERROR_NOT_FOUND) { + fprintf(stderr, "This is usually because the card came up in USB2 mode.\n"); + fprintf(stderr, "In particular, this tends to happen if you boot up with the\n"); + fprintf(stderr, "card plugged in; just unplug and replug it, and it usually works.\n"); + } exit(1); } rc = libusb_set_interface_alt_setting(devh, /*interface=*/0, /*alternate_setting=*/2);