#include <memory>
#include <mutex>
#include <stack>
+#include <string>
#include <thread>
using namespace std;
libusb_device *device;
};
-libusb_device_handle *open_card(int card_index)
+libusb_device_handle *open_card(int card_index, string *description)
{
libusb_device **devices;
ssize_t num_devices = libusb_get_device_list(nullptr, &devices);
});
for (size_t i = 0; i < found_cards.size(); ++i) {
- fprintf(stderr, "Card %d: Bus %03u Device %03u ", int(i), found_cards[i].bus, found_cards[i].port);
+ const char *product_name = nullptr;
if (found_cards[i].product == 0xbd3b) {
- fprintf(stderr, "Intensity Shuttle\n");
+ product_name = "Intensity Shuttle";
} else if (found_cards[i].product == 0xbd4f) {
- fprintf(stderr, "UltraStudio SDI\n");
+ product_name = "UltraStudio SDI";
} else {
assert(false);
}
+
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Card %d: Bus %03u Device %03u %s",
+ int(i), found_cards[i].bus, found_cards[i].port, product_name);
+ if (i == size_t(card_index)) {
+ *description = buf;
+ }
+ fprintf(stderr, "%s\n", buf);
}
if (size_t(card_index) >= found_cards.size()) {
exit(1);
}
- libusb_device_handle *devh = open_card(card_index);
+ libusb_device_handle *devh = open_card(card_index, &description);
if (!devh) {
fprintf(stderr, "Error finding USB device\n");
exit(1);
// NTSC (480i59.94, I suppose). A special case, see below.
if (video_format == 0xe901 || video_format == 0xe9c1 || video_format == 0xe801) {
- *width = 640;
+ *width = 720;
*height = 480;
+ *extra_lines_top = 17;
+ *extra_lines_bottom = 28;
*frame_rate_nom = 30000;
*frame_rate_den = 1001;
- *second_field_start = *height / 2; // TODO
+ *second_field_start = 280;
*interlaced = true;
return true;
}
// PAL (576i50, I suppose). A special case, see below.
- if (video_format == 0xe909 || video_format == 0xe9c9) {
+ if (video_format == 0xe909 || video_format == 0xe9c9 || video_format == 0xe809 || video_format == 0xebe9) {
*width = 720;
*height = 576;
*extra_lines_top = 22;
// except when it's not (e.g. it's the only difference between NTSC
// and PAL). Rather confusing. But we clear it here nevertheless, because
// usually it doesn't mean anything.
- uint16_t normalized_video_format = video_format & ~0xe808;
+ //
+ // 0x4 is a flag I've only seen from the D4. I don't know what it is.
+ uint16_t normalized_video_format = video_format & ~0xe80c;
constexpr VideoFormatEntry entries[] = {
+ { 0x01f1, 720, 480, 0, 40, 5, 60000, 1001, false }, // 480p59.94 (believed).
+ { 0x0131, 720, 576, 0, 44, 5, 50, 1, false }, // 576p50.
+ { 0x0011, 720, 576, 0, 44, 5, 50, 1, false }, // 576p50 (5:4).
{ 0x0143, 1280, 720, 0, 25, 5, 50, 1, false }, // 720p50.
{ 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.
- { 0x0003, 1920, 1080, 582, 20, 25, 30, 1, true }, // 1080i60.
+ { 0x0003, 1920, 1080, 583, 20, 25, 30, 1, true }, // 1080i60.
{ 0x01e1, 1920, 1080, 0, 0, 0, 30000, 1001, false }, // 1080p29.97.
- { 0x0021, 1920, 1080, 582, 20, 25, 30000, 1001, true }, // 1080i59.94.
+ { 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.
}
}
- printf("Unknown video format 0x%04x. Assuming 720p60.\n", video_format);
+ printf("Unknown video format 0x%04x (normalized 0x%04x). Assuming 720p60.\n", video_format, normalized_video_format);
*width = 1280;
*height = 720;
*frame_rate_nom = 60;