117 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* GStreamer
 | |
|  * Copyright (C) 2020 Igalia, S.L.
 | |
|  *     Author: Víctor Jáquez <vjaquez@igalia.com>
 | |
|  * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
 | |
|  *
 | |
|  * 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 <wrl.h>
 | |
| #include <dxgi.h>
 | |
| #include <string>
 | |
| 
 | |
| /* *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);
 | |
| }
 |