/* GStreamer * Copyright (C) 2020 Igalia, S.L. * Author: Víctor Jáquez * Copyright (C) 2023 Seungha Yang * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstvadevice.h" #include #include #include /* *INDENT-OFF* */ using namespace Microsoft::WRL; extern "C" { GST_DEBUG_CATEGORY_EXTERN (gstva_debug); #define GST_CAT_DEFAULT gstva_debug } /* *INDENT-ON* */ GST_DEFINE_MINI_OBJECT_TYPE (GstVaDevice, gst_va_device); static void gst_va_device_free (GstVaDevice * device) { gst_clear_object (&device->display); g_free (device->render_device_path); g_free (device); } static GstVaDevice * gst_va_device_new (GstVaDisplay * display, const gchar * render_device_path, gint index) { GstVaDevice *device = g_new0 (GstVaDevice, 1); gst_mini_object_init (GST_MINI_OBJECT_CAST (device), 0, GST_TYPE_VA_DEVICE, NULL, NULL, (GstMiniObjectFreeFunction) gst_va_device_free); /* take ownership */ device->display = display; device->render_device_path = g_strdup (render_device_path); device->index = index; return device; } GList * gst_va_device_find_devices (void) { HRESULT hr; ComPtr < IDXGIFactory1 > factory; GList *ret = nullptr; guint idx = 0; hr = CreateDXGIFactory1 (IID_PPV_ARGS (&factory)); if (FAILED (hr)) return nullptr; for (guint i = 0;; i++) { ComPtr < IDXGIAdapter > adapter; LARGE_INTEGER val; DXGI_ADAPTER_DESC desc; std::string luid_str; GstVaDisplay *dpy; GstVaDevice *dev; hr = factory->EnumAdapters (i, &adapter); if (FAILED (hr)) break; hr = adapter->GetDesc (&desc); if (FAILED (hr)) continue; val.LowPart = desc.AdapterLuid.LowPart; val.HighPart = desc.AdapterLuid.HighPart; luid_str = std::to_string (val.QuadPart); dpy = gst_va_display_win32_new (luid_str.c_str ()); if (!dpy) continue; dev = gst_va_device_new (dpy, luid_str.c_str (), idx); ret = g_list_append (ret, dev); idx++; } return ret; } void gst_va_device_list_free (GList * devices) { g_list_free_full (devices, (GDestroyNotify) gst_mini_object_unref); }