gstreamer/subprojects/gst-plugins-bad/sys/va/gstvadevice_win32.cpp

116 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);
}