-namespace {
-
-string get_pci_device_name(const char *node_name)
-{
- char vendor_path[256];
- snprintf(vendor_path, sizeof(vendor_path), "/sys/class/drm/%s/device/vendor", node_name);
- FILE *vendor_file = fopen(vendor_path, "r");
- if (vendor_file == nullptr) {
- return "could not look up vendor ID";
- }
- int vendor;
- if (fscanf(vendor_file, "%i", &vendor) != 1) {
- fclose(vendor_file);
- return "could not parse vendor ID";
- }
- fclose(vendor_file);
-
- char device_path[256];
- snprintf(device_path, sizeof(device_path), "/sys/class/drm/%s/device/device", node_name);
- FILE *device_file = fopen(device_path, "r");
- if (device_file == nullptr) {
- return "could not look up device ID";
- }
- int device;
- if (fscanf(device_file, "%i", &device) != 1) {
- fclose(device_file);
- return "could not parse device ID";
- }
- fclose(device_file);
-
- pci_access *pci = pci_alloc();
- if (pci == nullptr) {
- return "could not init libpci";
- }
- pci_init(pci);
-
- char buf[256];
- const char *name = pci_lookup_name(pci, buf, sizeof(buf), PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE, vendor, device);
- pci_cleanup(pci);
-
- if (name == nullptr) {
- snprintf(buf, sizeof(buf), "%04x:%04x", vendor, device);
- }
- return buf;
-}
-
-void print_available_drm_nodes()
-{
- glob_t g;
- int err = glob("/dev/dri/renderD*", 0, nullptr, &g); // TODO: Accept /dev/dri/card*, too?
- if (err != 0) {
- fprintf(stderr, "Couldn't list render nodes (%s).\n", strerror(errno));
- return;
- }
-
- if (g.gl_pathc == 0) {
- fprintf(stderr, "\n");
- fprintf(stderr, "No render nodes found in /dev/dri.\n");
- } else {
- fprintf(stderr, "Available devices (these may or may not support VA-API encoding):\n\n");
- for (size_t i = 0; i < g.gl_pathc; ++i) {
- const char *node_name = basename(g.gl_pathv[i]);
- fprintf(stderr, " %s (%s)\n", g.gl_pathv[i], get_pci_device_name(node_name).c_str());
- }
- }
-
- globfree(&g);
-}
-
-} // namespace
-