diff mbox series

[FFmpeg-devel,08/23] avutil/hwcontext_d3d12va: Allocate pub and priv device hwctx together

Message ID DU0P250MB0747F6B309400307D3F6595F8F482@DU0P250MB0747.EURP250.PROD.OUTLOOK.COM
State Accepted
Commit 51f04054506fa1b9baaf79a6b37aac34d988b944
Headers show
Series [FFmpeg-devel,01/23] avutil/hwcontext_opencl: Use proper OpenCLFramesContext | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 fail Make fate failed
andriy/make_x86 success Make finished
andriy/make_fate_x86 fail Make fate failed

Commit Message

Andreas Rheinhardt Feb. 12, 2024, 12:03 a.m. UTC
This is possible because the lifetime of both coincide.
Besides reducing the number of allocations this also simplifies
access to D3D12VADevicePriv as one no longer has to
go through AVHWDeviceInternal.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavutil/hwcontext_d3d12va.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/libavutil/hwcontext_d3d12va.c b/libavutil/hwcontext_d3d12va.c
index 3acd5ac43a..6b4cd22899 100644
--- a/libavutil/hwcontext_d3d12va.c
+++ b/libavutil/hwcontext_d3d12va.c
@@ -46,6 +46,10 @@  typedef struct D3D12VAFramesContext {
 } D3D12VAFramesContext;
 
 typedef struct D3D12VADevicePriv {
+    /**
+     * The public AVD3D12VADeviceContext. See hwcontext_d3d12va.h for it.
+     */
+    AVD3D12VADeviceContext p;
     HANDLE                        d3d12lib;
     HANDLE                        dxgilib;
     PFN_CREATE_DXGI_FACTORY2      create_dxgi_factory2;
@@ -526,7 +530,7 @@  fail:
 
 static int d3d12va_load_functions(AVHWDeviceContext *hwdev)
 {
-    D3D12VADevicePriv *priv = hwdev->internal->priv;
+    D3D12VADevicePriv *priv = hwdev->hwctx;
 
 #if !HAVE_UWP
     priv->d3d12lib = dlopen("d3d12.dll", 0);
@@ -558,8 +562,8 @@  fail:
 
 static void d3d12va_device_free(AVHWDeviceContext *hwdev)
 {
-    AVD3D12VADeviceContext *ctx  = hwdev->hwctx;
-    D3D12VADevicePriv      *priv = hwdev->internal->priv;
+    D3D12VADevicePriv      *priv = hwdev->hwctx;
+    AVD3D12VADeviceContext *ctx  = &priv->p;
 
     D3D12_OBJECT_RELEASE(ctx->device);
 
@@ -609,8 +613,8 @@  static void d3d12va_device_uninit(AVHWDeviceContext *hwdev)
 static int d3d12va_device_create(AVHWDeviceContext *hwdev, const char *device,
                                  AVDictionary *opts, int flags)
 {
-    AVD3D12VADeviceContext *ctx  = hwdev->hwctx;
-    D3D12VADevicePriv      *priv = hwdev->internal->priv;
+    D3D12VADevicePriv      *priv = hwdev->hwctx;
+    AVD3D12VADeviceContext *ctx  = &priv->p;
 
     HRESULT hr;
     UINT create_flags = 0;
@@ -670,8 +674,7 @@  const HWContextType ff_hwcontext_type_d3d12va = {
     .type                   = AV_HWDEVICE_TYPE_D3D12VA,
     .name                   = "D3D12VA",
 
-    .device_hwctx_size      = sizeof(AVD3D12VADeviceContext),
-    .device_priv_size       = sizeof(D3D12VADevicePriv),
+    .device_hwctx_size      = sizeof(D3D12VADevicePriv),
     .frames_hwctx_size      = sizeof(AVD3D12VAFramesContext),
     .frames_priv_size       = sizeof(D3D12VAFramesContext),