FFmpeg
hwcontext_d3d11va.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "config.h"
20 
21 #include <windows.h>
22 
23 #define COBJMACROS
24 
25 #include <initguid.h>
26 #include <d3d11.h>
27 #include <dxgi1_2.h>
28 
29 #if HAVE_DXGIDEBUG_H
30 #include <dxgidebug.h>
31 #endif
32 
33 #include "avassert.h"
34 #include "common.h"
35 #include "hwcontext.h"
36 #include "hwcontext_d3d11va.h"
37 #include "hwcontext_internal.h"
38 #include "imgutils.h"
39 #include "mem.h"
40 #include "pixdesc.h"
41 #include "pixfmt.h"
42 #include "thread.h"
43 #include "compat/w32dlfcn.h"
44 
45 #define MAX_ARRAY_SIZE 64 // Driver specification limits ArraySize to 64 for decoder-bound resources
46 
47 typedef HRESULT(WINAPI *PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory);
48 
50 
52 static PFN_D3D11_CREATE_DEVICE mD3D11CreateDevice;
53 
54 static av_cold void load_functions(void)
55 {
56 #if !HAVE_UWP
57  // We let these "leak" - this is fine, as unloading has no great benefit, and
58  // Windows will mark a DLL as loaded forever if its internal refcount overflows
59  // from too many LoadLibrary calls.
60  HANDLE d3dlib, dxgilib;
61 
62  d3dlib = dlopen("d3d11.dll", 0);
63  dxgilib = dlopen("dxgi.dll", 0);
64  if (!d3dlib || !dxgilib)
65  return;
66 
67  mD3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE) GetProcAddress(d3dlib, "D3D11CreateDevice");
68  mCreateDXGIFactory = (PFN_CREATE_DXGI_FACTORY) GetProcAddress(dxgilib, "CreateDXGIFactory1");
69  if (!mCreateDXGIFactory)
70  mCreateDXGIFactory = (PFN_CREATE_DXGI_FACTORY) GetProcAddress(dxgilib, "CreateDXGIFactory");
71 #else
72  // In UWP (which lacks LoadLibrary), CreateDXGIFactory isn't available,
73  // only CreateDXGIFactory1
74  mD3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE) D3D11CreateDevice;
75  mCreateDXGIFactory = (PFN_CREATE_DXGI_FACTORY) CreateDXGIFactory1;
76 #endif
77 }
78 
79 typedef struct D3D11VAFramesContext {
80  /**
81  * The public AVD3D11VAFramesContext. See hwcontext_d3d11va.h for it.
82  */
84 
87 
88  DXGI_FORMAT format;
89 
90  ID3D11Texture2D *staging_texture;
92 
93 static const struct {
94  DXGI_FORMAT d3d_format;
96 } supported_formats[] = {
97  { DXGI_FORMAT_NV12, AV_PIX_FMT_NV12 },
98  { DXGI_FORMAT_P010, AV_PIX_FMT_P010 },
100  { DXGI_FORMAT_R10G10B10A2_UNORM, AV_PIX_FMT_X2BGR10 },
102  { DXGI_FORMAT_AYUV, AV_PIX_FMT_VUYX },
103  { DXGI_FORMAT_YUY2, AV_PIX_FMT_YUYV422 },
104  { DXGI_FORMAT_Y210, AV_PIX_FMT_Y210 },
105  { DXGI_FORMAT_Y410, AV_PIX_FMT_XV30 },
106  { DXGI_FORMAT_P016, AV_PIX_FMT_P016 },
107  { DXGI_FORMAT_Y216, AV_PIX_FMT_Y216 },
108  { DXGI_FORMAT_Y416, AV_PIX_FMT_XV48 },
109  // There is no 12bit pixel format defined in DXGI_FORMAT*, use 16bit to compatible
110  // with 12 bit AV_PIX_FMT* formats.
111  { DXGI_FORMAT_P016, AV_PIX_FMT_P012 },
112  { DXGI_FORMAT_Y216, AV_PIX_FMT_Y212 },
113  { DXGI_FORMAT_Y416, AV_PIX_FMT_XV36 },
114  // Special opaque formats. The pix_fmt is merely a place holder, as the
115  // opaque format cannot be accessed directly.
116  { DXGI_FORMAT_420_OPAQUE, AV_PIX_FMT_YUV420P },
117 };
118 
119 static void d3d11va_default_lock(void *ctx)
120 {
121  WaitForSingleObjectEx(ctx, INFINITE, FALSE);
122 }
123 
124 static void d3d11va_default_unlock(void *ctx)
125 {
126  ReleaseMutex(ctx);
127 }
128 
130 {
131  D3D11VAFramesContext *s = ctx->hwctx;
132  AVD3D11VAFramesContext *frames_hwctx = &s->p;
133 
134  if (frames_hwctx->texture)
135  ID3D11Texture2D_Release(frames_hwctx->texture);
136  frames_hwctx->texture = NULL;
137 
138  if (s->staging_texture)
139  ID3D11Texture2D_Release(s->staging_texture);
140  s->staging_texture = NULL;
141 
142  av_freep(&frames_hwctx->texture_infos);
143 }
144 
146  const void *hwconfig,
147  AVHWFramesConstraints *constraints)
148 {
149  AVD3D11VADeviceContext *device_hwctx = ctx->hwctx;
150  int nb_sw_formats = 0;
151  HRESULT hr;
152  int i;
153 
155  sizeof(*constraints->valid_sw_formats));
156  if (!constraints->valid_sw_formats)
157  return AVERROR(ENOMEM);
158 
159  for (i = 0; i < FF_ARRAY_ELEMS(supported_formats); i++) {
160  UINT format_support = 0;
161  hr = ID3D11Device_CheckFormatSupport(device_hwctx->device, supported_formats[i].d3d_format, &format_support);
162  if (SUCCEEDED(hr) && (format_support & D3D11_FORMAT_SUPPORT_TEXTURE2D))
163  constraints->valid_sw_formats[nb_sw_formats++] = supported_formats[i].pix_fmt;
164  }
165  constraints->valid_sw_formats[nb_sw_formats] = AV_PIX_FMT_NONE;
166 
167  constraints->valid_hw_formats = av_malloc_array(2, sizeof(*constraints->valid_hw_formats));
168  if (!constraints->valid_hw_formats)
169  return AVERROR(ENOMEM);
170 
171  constraints->valid_hw_formats[0] = AV_PIX_FMT_D3D11;
172  constraints->valid_hw_formats[1] = AV_PIX_FMT_NONE;
173 
174  return 0;
175 }
176 
177 static void free_texture(void *opaque, uint8_t *data)
178 {
179  ID3D11Texture2D_Release((ID3D11Texture2D *)opaque);
180  av_free(data);
181 }
182 
183 static AVBufferRef *wrap_texture_buf(AVHWFramesContext *ctx, ID3D11Texture2D *tex, int index)
184 {
185  AVBufferRef *buf;
187  D3D11VAFramesContext *s = ctx->hwctx;
188  AVD3D11VAFramesContext *frames_hwctx = &s->p;
189  if (!desc) {
190  ID3D11Texture2D_Release(tex);
191  return NULL;
192  }
193 
194  if (s->nb_surfaces <= s->nb_surfaces_used) {
195  frames_hwctx->texture_infos = av_realloc_f(frames_hwctx->texture_infos,
196  s->nb_surfaces_used + 1,
197  sizeof(*frames_hwctx->texture_infos));
198  if (!frames_hwctx->texture_infos) {
199  ID3D11Texture2D_Release(tex);
200  av_free(desc);
201  return NULL;
202  }
203  s->nb_surfaces = s->nb_surfaces_used + 1;
204  }
205 
206  frames_hwctx->texture_infos[s->nb_surfaces_used].texture = tex;
207  frames_hwctx->texture_infos[s->nb_surfaces_used].index = index;
208  s->nb_surfaces_used++;
209 
210  desc->texture = tex;
211  desc->index = index;
212 
213  buf = av_buffer_create((uint8_t *)desc, sizeof(*desc), free_texture, tex, 0);
214  if (!buf) {
215  ID3D11Texture2D_Release(tex);
216  av_free(desc);
217  return NULL;
218  }
219 
220  return buf;
221 }
222 
224 {
225  D3D11VAFramesContext *s = ctx->hwctx;
226  AVD3D11VAFramesContext *hwctx = &s->p;
227  AVD3D11VADeviceContext *device_hwctx = ctx->device_ctx->hwctx;
228  HRESULT hr;
229  ID3D11Texture2D *tex;
230  D3D11_TEXTURE2D_DESC texDesc = {
231  .Width = ctx->width,
232  .Height = ctx->height,
233  .MipLevels = 1,
234  .Format = s->format,
235  .SampleDesc = { .Count = 1 },
236  .ArraySize = 1,
237  .Usage = D3D11_USAGE_DEFAULT,
238  .BindFlags = hwctx->BindFlags,
239  .MiscFlags = hwctx->MiscFlags,
240  };
241 
242  hr = ID3D11Device_CreateTexture2D(device_hwctx->device, &texDesc, NULL, &tex);
243  if (FAILED(hr)) {
244  av_log(ctx, AV_LOG_ERROR, "Could not create the texture (%lx)\n", (long)hr);
245  return NULL;
246  }
247 
248  return wrap_texture_buf(ctx, tex, 0);
249 }
250 
251 static AVBufferRef *d3d11va_pool_alloc(void *opaque, size_t size)
252 {
254  D3D11VAFramesContext *s = ctx->hwctx;
255  AVD3D11VAFramesContext *hwctx = &s->p;
256  D3D11_TEXTURE2D_DESC texDesc;
257 
258  if (!hwctx->texture)
259  return d3d11va_alloc_single(ctx);
260 
261  ID3D11Texture2D_GetDesc(hwctx->texture, &texDesc);
262 
263  if (s->nb_surfaces_used >= texDesc.ArraySize) {
264  av_log(ctx, AV_LOG_ERROR, "Static surface pool size exceeded.\n");
265  return NULL;
266  }
267 
268  ID3D11Texture2D_AddRef(hwctx->texture);
269  return wrap_texture_buf(ctx, hwctx->texture, s->nb_surfaces_used);
270 }
271 
273 {
274  AVD3D11VADeviceContext *device_hwctx = ctx->device_ctx->hwctx;
275  D3D11VAFramesContext *s = ctx->hwctx;
276  AVD3D11VAFramesContext *hwctx = &s->p;
277 
278  int i;
279  HRESULT hr;
280  D3D11_TEXTURE2D_DESC texDesc;
281 
282  for (i = 0; i < FF_ARRAY_ELEMS(supported_formats); i++) {
283  if (ctx->sw_format == supported_formats[i].pix_fmt) {
284  s->format = supported_formats[i].d3d_format;
285  break;
286  }
287  }
289  av_log(ctx, AV_LOG_ERROR, "Unsupported pixel format: %s\n",
290  av_get_pix_fmt_name(ctx->sw_format));
291  return AVERROR(EINVAL);
292  }
293 
294  hwctx->BindFlags |= device_hwctx->BindFlags;
295  hwctx->MiscFlags |= device_hwctx->MiscFlags;
296 
297  ctx->initial_pool_size = FFMIN(ctx->initial_pool_size, MAX_ARRAY_SIZE);
298 
299  texDesc = (D3D11_TEXTURE2D_DESC){
300  .Width = ctx->width,
301  .Height = ctx->height,
302  .MipLevels = 1,
303  .Format = s->format,
304  .SampleDesc = { .Count = 1 },
305  .ArraySize = ctx->initial_pool_size,
306  .Usage = D3D11_USAGE_DEFAULT,
307  .BindFlags = hwctx->BindFlags,
308  .MiscFlags = hwctx->MiscFlags,
309  };
310 
311  if (hwctx->texture) {
312  D3D11_TEXTURE2D_DESC texDesc2;
313  ID3D11Texture2D_GetDesc(hwctx->texture, &texDesc2);
314 
315  if (texDesc.Width != texDesc2.Width ||
316  texDesc.Height != texDesc2.Height ||
317  texDesc.Format != texDesc2.Format) {
318  av_log(ctx, AV_LOG_ERROR, "User-provided texture has mismatching parameters\n");
319  return AVERROR(EINVAL);
320  }
321 
322  ctx->initial_pool_size = texDesc2.ArraySize;
323  hwctx->BindFlags = texDesc2.BindFlags;
324  hwctx->MiscFlags = texDesc2.MiscFlags;
325  } else if (texDesc.ArraySize > 0) {
326  hr = ID3D11Device_CreateTexture2D(device_hwctx->device, &texDesc, NULL, &hwctx->texture);
327  if (FAILED(hr)) {
328  av_log(ctx, AV_LOG_ERROR, "Could not create the texture (%lx)\n", (long)hr);
329  return AVERROR_UNKNOWN;
330  }
331  }
332 
333  hwctx->texture_infos = av_realloc_f(NULL, ctx->initial_pool_size, sizeof(*hwctx->texture_infos));
334  if (!hwctx->texture_infos)
335  return AVERROR(ENOMEM);
336  s->nb_surfaces = ctx->initial_pool_size;
337 
341  if (!ffhwframesctx(ctx)->pool_internal)
342  return AVERROR(ENOMEM);
343 
344  return 0;
345 }
346 
348 {
350 
351  frame->buf[0] = av_buffer_pool_get(ctx->pool);
352  if (!frame->buf[0])
353  return AVERROR(ENOMEM);
354 
355  desc = (AVD3D11FrameDescriptor *)frame->buf[0]->data;
356 
357  frame->data[0] = (uint8_t *)desc->texture;
358  frame->data[1] = (uint8_t *)desc->index;
359  frame->format = AV_PIX_FMT_D3D11;
360  frame->width = ctx->width;
361  frame->height = ctx->height;
362 
363  return 0;
364 }
365 
368  enum AVPixelFormat **formats)
369 {
370  D3D11VAFramesContext *s = ctx->hwctx;
371  enum AVPixelFormat *fmts;
372 
373  fmts = av_malloc_array(2, sizeof(*fmts));
374  if (!fmts)
375  return AVERROR(ENOMEM);
376 
377  fmts[0] = ctx->sw_format;
378  fmts[1] = AV_PIX_FMT_NONE;
379 
380  // Don't signal support for opaque formats. Actual access would fail.
381  if (s->format == DXGI_FORMAT_420_OPAQUE)
382  fmts[0] = AV_PIX_FMT_NONE;
383 
384  *formats = fmts;
385 
386  return 0;
387 }
388 
390 {
391  AVD3D11VADeviceContext *device_hwctx = ctx->device_ctx->hwctx;
392  D3D11VAFramesContext *s = ctx->hwctx;
393  HRESULT hr;
394  D3D11_TEXTURE2D_DESC texDesc = {
395  .Width = ctx->width,
396  .Height = ctx->height,
397  .MipLevels = 1,
398  .Format = format,
399  .SampleDesc = { .Count = 1 },
400  .ArraySize = 1,
401  .Usage = D3D11_USAGE_STAGING,
402  .CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE,
403  };
404 
405  hr = ID3D11Device_CreateTexture2D(device_hwctx->device, &texDesc, NULL, &s->staging_texture);
406  if (FAILED(hr)) {
407  av_log(ctx, AV_LOG_ERROR, "Could not create the staging texture (%lx)\n", (long)hr);
408  return AVERROR_UNKNOWN;
409  }
410 
411  return 0;
412 }
413 
414 static void fill_texture_ptrs(uint8_t *data[4], int linesize[4],
416  D3D11_TEXTURE2D_DESC *desc,
417  D3D11_MAPPED_SUBRESOURCE *map)
418 {
419  int i;
420 
421  for (i = 0; i < 4; i++)
422  linesize[i] = map->RowPitch;
423 
424  av_image_fill_pointers(data, ctx->sw_format, desc->Height,
425  (uint8_t*)map->pData, linesize);
426 }
427 
429  const AVFrame *src)
430 {
431  AVD3D11VADeviceContext *device_hwctx = ctx->device_ctx->hwctx;
432  D3D11VAFramesContext *s = ctx->hwctx;
433  int download = src->format == AV_PIX_FMT_D3D11;
434  const AVFrame *frame = download ? src : dst;
435  const AVFrame *other = download ? dst : src;
436  // (The interface types are compatible.)
437  ID3D11Resource *texture = (ID3D11Resource *)(ID3D11Texture2D *)frame->data[0];
438  int index = (intptr_t)frame->data[1];
439  ID3D11Resource *staging;
440  int w = FFMIN(dst->width, src->width);
441  int h = FFMIN(dst->height, src->height);
442  uint8_t *map_data[4];
443  int map_linesize[4];
444  D3D11_TEXTURE2D_DESC desc;
445  D3D11_MAPPED_SUBRESOURCE map;
446  HRESULT hr;
447  int res;
448 
449  if (frame->hw_frames_ctx->data != (uint8_t *)ctx || other->format != ctx->sw_format)
450  return AVERROR(EINVAL);
451 
452  device_hwctx->lock(device_hwctx->lock_ctx);
453 
454  if (!s->staging_texture) {
455  ID3D11Texture2D_GetDesc((ID3D11Texture2D *)texture, &desc);
456  res = d3d11va_create_staging_texture(ctx, desc.Format);
457  if (res < 0)
458  return res;
459  }
460 
461  staging = (ID3D11Resource *)s->staging_texture;
462 
463  ID3D11Texture2D_GetDesc(s->staging_texture, &desc);
464 
465  if (download) {
466  ID3D11DeviceContext_CopySubresourceRegion(device_hwctx->device_context,
467  staging, 0, 0, 0, 0,
468  texture, index, NULL);
469 
470  hr = ID3D11DeviceContext_Map(device_hwctx->device_context,
471  staging, 0, D3D11_MAP_READ, 0, &map);
472  if (FAILED(hr))
473  goto map_failed;
474 
475  fill_texture_ptrs(map_data, map_linesize, ctx, &desc, &map);
476 
477  av_image_copy2(dst->data, dst->linesize, map_data, map_linesize,
478  ctx->sw_format, w, h);
479 
480  ID3D11DeviceContext_Unmap(device_hwctx->device_context, staging, 0);
481  } else {
482  hr = ID3D11DeviceContext_Map(device_hwctx->device_context,
483  staging, 0, D3D11_MAP_WRITE, 0, &map);
484  if (FAILED(hr))
485  goto map_failed;
486 
487  fill_texture_ptrs(map_data, map_linesize, ctx, &desc, &map);
488 
489  av_image_copy2(map_data, map_linesize, src->data, src->linesize,
490  ctx->sw_format, w, h);
491 
492  ID3D11DeviceContext_Unmap(device_hwctx->device_context, staging, 0);
493 
494  ID3D11DeviceContext_CopySubresourceRegion(device_hwctx->device_context,
495  texture, index, 0, 0, 0,
496  staging, 0, NULL);
497  }
498 
499  device_hwctx->unlock(device_hwctx->lock_ctx);
500  return 0;
501 
502 map_failed:
503  av_log(ctx, AV_LOG_ERROR, "Unable to lock D3D11VA surface (%lx)\n", (long)hr);
504  device_hwctx->unlock(device_hwctx->lock_ctx);
505  return AVERROR_UNKNOWN;
506 }
507 
509 {
510  AVD3D11VADeviceContext *device_hwctx = hwdev->hwctx;
511  HRESULT hr;
512 
513  if (!device_hwctx->lock) {
514  device_hwctx->lock_ctx = CreateMutex(NULL, 0, NULL);
515  if (device_hwctx->lock_ctx == INVALID_HANDLE_VALUE) {
516  av_log(NULL, AV_LOG_ERROR, "Failed to create a mutex\n");
517  return AVERROR(EINVAL);
518  }
519  device_hwctx->lock = d3d11va_default_lock;
520  device_hwctx->unlock = d3d11va_default_unlock;
521  }
522 
523  if (!device_hwctx->device_context) {
524  ID3D11Device_GetImmediateContext(device_hwctx->device, &device_hwctx->device_context);
525  if (!device_hwctx->device_context)
526  return AVERROR_UNKNOWN;
527  }
528 
529  if (!device_hwctx->video_device) {
530  hr = ID3D11DeviceContext_QueryInterface(device_hwctx->device, &IID_ID3D11VideoDevice,
531  (void **)&device_hwctx->video_device);
532  if (FAILED(hr))
533  return AVERROR_UNKNOWN;
534  }
535 
536  if (!device_hwctx->video_context) {
537  hr = ID3D11DeviceContext_QueryInterface(device_hwctx->device_context, &IID_ID3D11VideoContext,
538  (void **)&device_hwctx->video_context);
539  if (FAILED(hr))
540  return AVERROR_UNKNOWN;
541  }
542 
543  return 0;
544 }
545 
547 {
548  AVD3D11VADeviceContext *device_hwctx = hwdev->hwctx;
549 
550  if (device_hwctx->device) {
551  ID3D11Device_Release(device_hwctx->device);
552  device_hwctx->device = NULL;
553  }
554 
555  if (device_hwctx->device_context) {
556  ID3D11DeviceContext_Release(device_hwctx->device_context);
557  device_hwctx->device_context = NULL;
558  }
559 
560  if (device_hwctx->video_device) {
561  ID3D11VideoDevice_Release(device_hwctx->video_device);
562  device_hwctx->video_device = NULL;
563  }
564 
565  if (device_hwctx->video_context) {
566  ID3D11VideoContext_Release(device_hwctx->video_context);
567  device_hwctx->video_context = NULL;
568  }
569 
570  if (device_hwctx->lock == d3d11va_default_lock) {
571  CloseHandle(device_hwctx->lock_ctx);
572  device_hwctx->lock_ctx = INVALID_HANDLE_VALUE;
573  device_hwctx->lock = NULL;
574  }
575 }
576 
577 static int d3d11va_device_find_adapter_by_vendor_id(AVHWDeviceContext *ctx, uint32_t flags, const char *vendor_id)
578 {
579  HRESULT hr;
580  IDXGIAdapter *adapter = NULL;
581  IDXGIFactory2 *factory;
582  int adapter_id = 0;
583  long int id = strtol(vendor_id, NULL, 0);
584 
585  hr = mCreateDXGIFactory(&IID_IDXGIFactory2, (void **)&factory);
586  if (FAILED(hr)) {
587  av_log(ctx, AV_LOG_ERROR, "CreateDXGIFactory returned error\n");
588  return -1;
589  }
590 
591  while (IDXGIFactory2_EnumAdapters(factory, adapter_id++, &adapter) != DXGI_ERROR_NOT_FOUND) {
592  ID3D11Device* device = NULL;
593  DXGI_ADAPTER_DESC adapter_desc;
594 
595  hr = mD3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, flags, NULL, 0, D3D11_SDK_VERSION, &device, NULL, NULL);
596  if (FAILED(hr)) {
597  av_log(ctx, AV_LOG_DEBUG, "D3D11CreateDevice returned error, try next adapter\n");
598  IDXGIAdapter_Release(adapter);
599  continue;
600  }
601 
602  hr = IDXGIAdapter2_GetDesc(adapter, &adapter_desc);
603  ID3D11Device_Release(device);
604  IDXGIAdapter_Release(adapter);
605  if (FAILED(hr)) {
606  av_log(ctx, AV_LOG_DEBUG, "IDXGIAdapter2_GetDesc returned error, try next adapter\n");
607  continue;
608  } else if (adapter_desc.VendorId == id) {
609  IDXGIFactory2_Release(factory);
610  return adapter_id - 1;
611  }
612  }
613 
614  IDXGIFactory2_Release(factory);
615  return -1;
616 }
617 
618 static int d3d11va_device_create(AVHWDeviceContext *ctx, const char *device,
619  AVDictionary *opts, int flags)
620 {
621  AVD3D11VADeviceContext *device_hwctx = ctx->hwctx;
622 
623  HRESULT hr;
624  IDXGIAdapter *pAdapter = NULL;
625  ID3D10Multithread *pMultithread;
626  UINT creationFlags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT;
627  int is_debug = !!av_dict_get(opts, "debug", NULL, 0);
628  int ret;
629  int adapter = -1;
630 
631  if (is_debug) {
632  creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
633  av_log(ctx, AV_LOG_INFO, "Enabling d3d11 debugging.\n");
634  }
635 
637  return AVERROR_UNKNOWN;
639  av_log(ctx, AV_LOG_ERROR, "Failed to load D3D11 library or its functions\n");
640  return AVERROR_UNKNOWN;
641  }
642 
643  if (device) {
644  adapter = atoi(device);
645  } else {
646  AVDictionaryEntry *e = av_dict_get(opts, "vendor_id", NULL, 0);
647  if (e && e->value) {
648  adapter = d3d11va_device_find_adapter_by_vendor_id(ctx, creationFlags, e->value);
649  if (adapter < 0) {
650  av_log(ctx, AV_LOG_ERROR, "Failed to find d3d11va adapter by "
651  "vendor id %s\n", e->value);
652  return AVERROR_UNKNOWN;
653  }
654  }
655  }
656 
657  if (adapter >= 0) {
658  IDXGIFactory2 *pDXGIFactory;
659 
660  av_log(ctx, AV_LOG_VERBOSE, "Selecting d3d11va adapter %d\n", adapter);
661  hr = mCreateDXGIFactory(&IID_IDXGIFactory2, (void **)&pDXGIFactory);
662  if (SUCCEEDED(hr)) {
663  if (FAILED(IDXGIFactory2_EnumAdapters(pDXGIFactory, adapter, &pAdapter)))
664  pAdapter = NULL;
665  IDXGIFactory2_Release(pDXGIFactory);
666  }
667  }
668 
669  if (pAdapter) {
670  DXGI_ADAPTER_DESC desc;
671  hr = IDXGIAdapter2_GetDesc(pAdapter, &desc);
672  if (!FAILED(hr)) {
673  av_log(ctx, AV_LOG_INFO, "Using device %04x:%04x (%ls).\n",
674  desc.VendorId, desc.DeviceId, desc.Description);
675  }
676  }
677 
678  hr = mD3D11CreateDevice(pAdapter, pAdapter ? D3D_DRIVER_TYPE_UNKNOWN : D3D_DRIVER_TYPE_HARDWARE, NULL, creationFlags, NULL, 0,
679  D3D11_SDK_VERSION, &device_hwctx->device, NULL, NULL);
680  if (pAdapter)
681  IDXGIAdapter_Release(pAdapter);
682  if (FAILED(hr)) {
683  av_log(ctx, AV_LOG_ERROR, "Failed to create Direct3D device (%lx)\n", (long)hr);
684  return AVERROR_UNKNOWN;
685  }
686 
687  hr = ID3D11Device_QueryInterface(device_hwctx->device, &IID_ID3D10Multithread, (void **)&pMultithread);
688  if (SUCCEEDED(hr)) {
689  ID3D10Multithread_SetMultithreadProtected(pMultithread, TRUE);
690  ID3D10Multithread_Release(pMultithread);
691  }
692 
693 #if !HAVE_UWP && HAVE_DXGIDEBUG_H
694  if (is_debug) {
695  HANDLE dxgidebug_dll = LoadLibrary("dxgidebug.dll");
696  if (dxgidebug_dll) {
697  HRESULT (WINAPI * pf_DXGIGetDebugInterface)(const GUID *riid, void **ppDebug)
698  = (void *)GetProcAddress(dxgidebug_dll, "DXGIGetDebugInterface");
699  if (pf_DXGIGetDebugInterface) {
700  IDXGIDebug *dxgi_debug = NULL;
701  hr = pf_DXGIGetDebugInterface(&IID_IDXGIDebug, (void**)&dxgi_debug);
702  if (SUCCEEDED(hr) && dxgi_debug) {
703  IDXGIDebug_ReportLiveObjects(dxgi_debug, DXGI_DEBUG_ALL, DXGI_DEBUG_RLO_ALL);
704  av_log(ctx, AV_LOG_INFO, "Enabled dxgi debugging.\n");
705  } else {
706  av_log(ctx, AV_LOG_WARNING, "Failed enabling dxgi debugging.\n");
707  }
708  } else {
709  av_log(ctx, AV_LOG_WARNING, "Failed getting dxgi debug interface.\n");
710  }
711  } else {
712  av_log(ctx, AV_LOG_WARNING, "Failed loading dxgi debug library.\n");
713  }
714  }
715 #endif
716 
717  if (av_dict_get(opts, "SHADER", NULL, 0))
718  device_hwctx->BindFlags |= D3D11_BIND_SHADER_RESOURCE;
719 
720  if (av_dict_get(opts, "UAV", NULL, 0))
721  device_hwctx->BindFlags |= D3D11_BIND_UNORDERED_ACCESS;
722 
723  if (av_dict_get(opts, "RTV", NULL, 0))
724  device_hwctx->BindFlags |= D3D11_BIND_RENDER_TARGET;
725 
726  if (av_dict_get(opts, "SHARED", NULL, 0))
727  device_hwctx->MiscFlags |= D3D11_RESOURCE_MISC_SHARED;
728 
729  return 0;
730 }
731 
734  .name = "D3D11VA",
735 
736  .device_hwctx_size = sizeof(AVD3D11VADeviceContext),
737  .frames_hwctx_size = sizeof(D3D11VAFramesContext),
738 
739  .device_create = d3d11va_device_create,
740  .device_init = d3d11va_device_init,
741  .device_uninit = d3d11va_device_uninit,
742  .frames_get_constraints = d3d11va_frames_get_constraints,
743  .frames_init = d3d11va_frames_init,
744  .frames_uninit = d3d11va_frames_uninit,
745  .frames_get_buffer = d3d11va_get_buffer,
746  .transfer_get_formats = d3d11va_transfer_get_formats,
747  .transfer_data_to = d3d11va_transfer_data,
748  .transfer_data_from = d3d11va_transfer_data,
749 
750  .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_D3D11, AV_PIX_FMT_NONE },
751 };
d3d11va_alloc_single
static AVBufferRef * d3d11va_alloc_single(AVHWFramesContext *ctx)
Definition: hwcontext_d3d11va.c:223
flags
const SwsFlags flags[]
Definition: swscale.c:85
formats
formats
Definition: signature.h:47
AVHWDeviceContext::hwctx
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
Definition: hwcontext.h:88
FFHWFramesContext::pool_internal
AVBufferPool * pool_internal
Definition: hwcontext_internal.h:101
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
DXGI_FORMAT_B8G8R8A8_UNORM
@ DXGI_FORMAT_B8G8R8A8_UNORM
Definition: dds.c:92
thread.h
d3d11va_transfer_get_formats
static int d3d11va_transfer_get_formats(AVHWFramesContext *ctx, enum AVHWFrameTransferDirection dir, enum AVPixelFormat **formats)
Definition: hwcontext_d3d11va.c:366
av_cold
#define av_cold
Definition: attributes.h:119
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:466
pixdesc.h
AVD3D11VAFramesContext::MiscFlags
UINT MiscFlags
D3D11_TEXTURE2D_DESC.MiscFlags used for texture creation.
Definition: hwcontext_d3d11va.h:180
AV_PIX_FMT_Y216
#define AV_PIX_FMT_Y216
Definition: pixfmt.h:608
data
const char data[16]
Definition: mxf.c:149
d3d11va_transfer_data
static int d3d11va_transfer_data(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src)
Definition: hwcontext_d3d11va.c:428
AV_PIX_FMT_XV30
#define AV_PIX_FMT_XV30
Definition: pixfmt.h:609
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
AV_PIX_FMT_BGRA
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
Definition: pixfmt.h:102
AVDictionary
Definition: dict.c:32
AVHWFramesConstraints::valid_hw_formats
enum AVPixelFormat * valid_hw_formats
A list of possible values for format in the hw_frames_ctx, terminated by AV_PIX_FMT_NONE.
Definition: hwcontext.h:449
AVERROR_UNKNOWN
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition: error.h:73
fill_texture_ptrs
static void fill_texture_ptrs(uint8_t *data[4], int linesize[4], AVHWFramesContext *ctx, D3D11_TEXTURE2D_DESC *desc, D3D11_MAPPED_SUBRESOURCE *map)
Definition: hwcontext_d3d11va.c:414
PFN_CREATE_DXGI_FACTORY
HRESULT(WINAPI * PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory)
Definition: hwcontext_d3d11va.c:47
AVHWFramesConstraints
This struct describes the constraints on hardware frames attached to a given device with a hardware-s...
Definition: hwcontext.h:444
AVD3D11VAFramesContext::BindFlags
UINT BindFlags
D3D11_TEXTURE2D_DESC.BindFlags used for texture creation.
Definition: hwcontext_d3d11va.h:174
ff_hwcontext_type_d3d11va
const HWContextType ff_hwcontext_type_d3d11va
Definition: hwcontext_d3d11va.c:732
d3d11va_get_buffer
static int d3d11va_get_buffer(AVHWFramesContext *ctx, AVFrame *frame)
Definition: hwcontext_d3d11va.c:347
d3d_format
DXGI_FORMAT d3d_format
Definition: hwcontext_d3d11va.c:94
AVD3D11FrameDescriptor::texture
ID3D11Texture2D * texture
The texture in which the frame is located.
Definition: hwcontext_d3d11va.h:131
d3d11va_create_staging_texture
static int d3d11va_create_staging_texture(AVHWFramesContext *ctx, DXGI_FORMAT format)
Definition: hwcontext_d3d11va.c:389
D3D11VAFramesContext::format
DXGI_FORMAT format
Definition: hwcontext_d3d11va.c:88
AV_HWDEVICE_TYPE_D3D11VA
@ AV_HWDEVICE_TYPE_D3D11VA
Definition: hwcontext.h:35
av_buffer_pool_init2
AVBufferPool * av_buffer_pool_init2(size_t size, void *opaque, AVBufferRef *(*alloc)(void *opaque, size_t size), void(*pool_free)(void *opaque))
Allocate and initialize a buffer pool with a more complex allocator.
Definition: buffer.c:259
d3d11va_frames_uninit
static void d3d11va_frames_uninit(AVHWFramesContext *ctx)
Definition: hwcontext_d3d11va.c:129
d3d11va_default_unlock
static void d3d11va_default_unlock(void *ctx)
Definition: hwcontext_d3d11va.c:124
D3D11VAFramesContext::nb_surfaces_used
int nb_surfaces_used
Definition: hwcontext_d3d11va.c:86
AV_PIX_FMT_XV48
#define AV_PIX_FMT_XV48
Definition: pixfmt.h:611
av_image_fill_pointers
int av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height, uint8_t *ptr, const int linesizes[4])
Fill plane data pointers for an image with pixel format pix_fmt and height height.
Definition: imgutils.c:145
d3d11va_frames_get_constraints
static int d3d11va_frames_get_constraints(AVHWDeviceContext *ctx, const void *hwconfig, AVHWFramesConstraints *constraints)
Definition: hwcontext_d3d11va.c:145
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:63
AV_PIX_FMT_Y210
#define AV_PIX_FMT_Y210
Definition: pixfmt.h:606
avassert.h
HWContextType::type
enum AVHWDeviceType type
Definition: hwcontext_internal.h:30
ffhwframesctx
static FFHWFramesContext * ffhwframesctx(AVHWFramesContext *ctx)
Definition: hwcontext_internal.h:115
ff_thread_once
static int ff_thread_once(char *control, void(*routine)(void))
Definition: thread.h:205
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
load_functions
static av_cold void load_functions(void)
Definition: hwcontext_d3d11va.c:54
AVHWFramesConstraints::valid_sw_formats
enum AVPixelFormat * valid_sw_formats
A list of possible values for sw_format in the hw_frames_ctx, terminated by AV_PIX_FMT_NONE.
Definition: hwcontext.h:456
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:60
av_buffer_pool_get
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
Definition: buffer.c:390
AVD3D11VADeviceContext::video_context
ID3D11VideoContext * video_context
If unset, this will be set from the device_context field on init.
Definition: hwcontext_d3d11va.h:80
s
#define s(width, name)
Definition: cbs_vp9.c:198
AVD3D11VADeviceContext::device
ID3D11Device * device
Device used for texture creation and access.
Definition: hwcontext_d3d11va.h:56
d3d11va_device_create
static int d3d11va_device_create(AVHWDeviceContext *ctx, const char *device, AVDictionary *opts, int flags)
Definition: hwcontext_d3d11va.c:618
functions_loaded
static AVOnce functions_loaded
Definition: hwcontext_d3d11va.c:49
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
av_realloc_f
#define av_realloc_f(p, o, n)
Definition: tableprint_vlc.h:33
opts
static AVDictionary * opts
Definition: movenc.c:51
D3D11VAFramesContext::nb_surfaces
int nb_surfaces
Definition: hwcontext_d3d11va.c:85
AV_ONCE_INIT
#define AV_ONCE_INIT
Definition: thread.h:203
AVD3D11VAFramesContext::texture_infos
AVD3D11FrameDescriptor * texture_infos
In case if texture structure member above is not NULL contains the same texture pointer for all eleme...
Definition: hwcontext_d3d11va.h:189
AVD3D11VADeviceContext::lock_ctx
void * lock_ctx
Definition: hwcontext_d3d11va.h:96
NULL
#define NULL
Definition: coverity.c:32
format
New swscale design to change SwsGraph is what coordinates multiple passes These can include cascaded scaling error diffusion and so on Or we could have separate passes for the vertical and horizontal scaling In between each SwsPass lies a fully allocated image buffer Graph passes may have different levels of e g we can have a single threaded error diffusion pass following a multi threaded scaling pass SwsGraph is internally recreated whenever the image format
Definition: swscale-v2.txt:14
d3d11va_default_lock
static void d3d11va_default_lock(void *ctx)
Definition: hwcontext_d3d11va.c:119
AVD3D11VADeviceContext::video_device
ID3D11VideoDevice * video_device
If unset, this will be set from the device field on init.
Definition: hwcontext_d3d11va.h:72
AV_PIX_FMT_YUYV422
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
Definition: pixfmt.h:74
wrap_texture_buf
static AVBufferRef * wrap_texture_buf(AVHWFramesContext *ctx, ID3D11Texture2D *tex, int index)
Definition: hwcontext_d3d11va.c:183
AVOnce
#define AVOnce
Definition: thread.h:202
index
int index
Definition: gxfenc.c:90
AVD3D11VADeviceContext::unlock
void(* unlock)(void *lock_ctx)
Definition: hwcontext_d3d11va.h:95
AVD3D11VAFramesContext
This struct is allocated as AVHWFramesContext.hwctx.
Definition: hwcontext_d3d11va.h:145
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
d3d11va_device_find_adapter_by_vendor_id
static int d3d11va_device_find_adapter_by_vendor_id(AVHWDeviceContext *ctx, uint32_t flags, const char *vendor_id)
Definition: hwcontext_d3d11va.c:577
AV_PIX_FMT_X2BGR10
#define AV_PIX_FMT_X2BGR10
Definition: pixfmt.h:614
AV_PIX_FMT_P012
#define AV_PIX_FMT_P012
Definition: pixfmt.h:603
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
AVD3D11VADeviceContext::BindFlags
UINT BindFlags
D3D11_TEXTURE2D_DESC.BindFlags to be applied to D3D11 resources allocated for frames using this devic...
Definition: hwcontext_d3d11va.h:103
size
int size
Definition: twinvq_data.h:10344
MAX_ARRAY_SIZE
#define MAX_ARRAY_SIZE
Definition: hwcontext_d3d11va.c:45
d3d11va_frames_init
static int d3d11va_frames_init(AVHWFramesContext *ctx)
Definition: hwcontext_d3d11va.c:272
mCreateDXGIFactory
static PFN_CREATE_DXGI_FACTORY mCreateDXGIFactory
Definition: hwcontext_d3d11va.c:51
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:553
free_texture
static void free_texture(void *opaque, uint8_t *data)
Definition: hwcontext_d3d11va.c:177
AVD3D11VADeviceContext::MiscFlags
UINT MiscFlags
D3D11_TEXTURE2D_DESC.MiscFlags to be applied to D3D11 resources allocated for frames using this devic...
Definition: hwcontext_d3d11va.h:110
AV_PIX_FMT_Y212
#define AV_PIX_FMT_Y212
Definition: pixfmt.h:607
AVD3D11VAFramesContext::texture
ID3D11Texture2D * texture
The canonical texture used for pool allocation.
Definition: hwcontext_d3d11va.h:166
AV_PIX_FMT_D3D11
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
Definition: pixfmt.h:336
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
DXGI_FORMAT_R16G16B16A16_FLOAT
@ DXGI_FORMAT_R16G16B16A16_FLOAT
Definition: dds.c:63
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
common.h
AVD3D11VADeviceContext
This struct is allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_d3d11va.h:45
AVD3D11FrameDescriptor::index
intptr_t index
The index into the array texture element representing the frame, or 0 if the texture is not an array ...
Definition: hwcontext_d3d11va.h:139
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AVD3D11VADeviceContext::lock
void(* lock)(void *lock_ctx)
Callbacks for locking.
Definition: hwcontext_d3d11va.h:94
AV_PIX_FMT_P016
#define AV_PIX_FMT_P016
Definition: pixfmt.h:604
AVHWFrameTransferDirection
AVHWFrameTransferDirection
Definition: hwcontext.h:406
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:118
ret
ret
Definition: filter_design.txt:187
pixfmt.h
AV_PIX_FMT_NV12
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition: pixfmt.h:96
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
mD3D11CreateDevice
static PFN_D3D11_CREATE_DEVICE mD3D11CreateDevice
Definition: hwcontext_d3d11va.c:52
d3d11va_pool_alloc
static AVBufferRef * d3d11va_pool_alloc(void *opaque, size_t size)
Definition: hwcontext_d3d11va.c:251
pix_fmt
enum AVPixelFormat pix_fmt
Definition: hwcontext_d3d11va.c:95
av_image_copy2
static void av_image_copy2(uint8_t *const dst_data[4], const int dst_linesizes[4], uint8_t *const src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height)
Wrapper around av_image_copy() to workaround the limitation that the conversion from uint8_t * const ...
Definition: imgutils.h:184
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
D3D11VAFramesContext
Definition: hwcontext_d3d11va.c:79
d3d11va_device_uninit
static void d3d11va_device_uninit(AVHWDeviceContext *hwdev)
Definition: hwcontext_d3d11va.c:546
D3D11VAFramesContext::staging_texture
ID3D11Texture2D * staging_texture
Definition: hwcontext_d3d11va.c:90
AV_PIX_FMT_P010
#define AV_PIX_FMT_P010
Definition: pixfmt.h:602
desc
const char * desc
Definition: libsvtav1.c:83
supported_formats
static const struct @537 supported_formats[]
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
d3d11va_device_init
static int d3d11va_device_init(AVHWDeviceContext *hwdev)
Definition: hwcontext_d3d11va.c:508
D3D11VAFramesContext::p
AVD3D11VAFramesContext p
The public AVD3D11VAFramesContext.
Definition: hwcontext_d3d11va.c:83
w
uint8_t w
Definition: llvidencdsp.c:39
hwcontext_internal.h
map
const VDPAUPixFmtMap * map
Definition: hwcontext_vdpau.c:71
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:90
AV_PIX_FMT_RGBAF16
#define AV_PIX_FMT_RGBAF16
Definition: pixfmt.h:624
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AVD3D11FrameDescriptor
D3D11 frame descriptor for pool allocation.
Definition: hwcontext_d3d11va.h:123
imgutils.h
AV_PIX_FMT_XV36
#define AV_PIX_FMT_XV36
Definition: pixfmt.h:610
hwcontext.h
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
HWContextType
Definition: hwcontext_internal.h:29
AVD3D11VADeviceContext::device_context
ID3D11DeviceContext * device_context
If unset, this will be set from the device field on init.
Definition: hwcontext_d3d11va.h:64
ID3D11Device
void ID3D11Device
Definition: nvenc.h:28
h
h
Definition: vp9dsp_template.c:2070
AVDictionaryEntry::value
char * value
Definition: dict.h:92
AV_PIX_FMT_VUYX
@ AV_PIX_FMT_VUYX
packed VUYX 4:4:4:4, 32bpp, Variant of VUYA where alpha channel is left undefined
Definition: pixfmt.h:406
hwcontext_d3d11va.h
src
#define src
Definition: vp8dsp.c:248
w32dlfcn.h
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:3376