FFmpeg
hwcontext_cuda.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 "buffer.h"
20 #include "common.h"
21 #include "hwcontext.h"
22 #include "hwcontext_internal.h"
24 #if CONFIG_VULKAN
25 #include "hwcontext_vulkan.h"
26 #endif
27 #include "cuda_check.h"
28 #include "mem.h"
29 #include "pixdesc.h"
30 #include "pixfmt.h"
31 #include "imgutils.h"
32 
33 typedef struct CUDAFramesContext {
37 
38 typedef struct CUDADeviceContext {
42 
43 static const enum AVPixelFormat supported_formats[] = {
64 #if CONFIG_VULKAN
66 #endif
67 };
68 
69 #define CHECK_CU(x) FF_CUDA_CHECK_DL(device_ctx, cu, x)
70 
72  const void *hwconfig,
73  AVHWFramesConstraints *constraints)
74 {
75  int i;
76 
78  sizeof(*constraints->valid_sw_formats));
79  if (!constraints->valid_sw_formats)
80  return AVERROR(ENOMEM);
81 
82  for (i = 0; i < FF_ARRAY_ELEMS(supported_formats); i++)
83  constraints->valid_sw_formats[i] = supported_formats[i];
85 
86  constraints->valid_hw_formats = av_malloc_array(2, sizeof(*constraints->valid_hw_formats));
87  if (!constraints->valid_hw_formats)
88  return AVERROR(ENOMEM);
89 
90  constraints->valid_hw_formats[0] = AV_PIX_FMT_CUDA;
91  constraints->valid_hw_formats[1] = AV_PIX_FMT_NONE;
92 
93  return 0;
94 }
95 
96 static void cuda_buffer_free(void *opaque, uint8_t *data)
97 {
98  AVHWFramesContext *ctx = opaque;
99  AVHWDeviceContext *device_ctx = ctx->device_ctx;
100  AVCUDADeviceContext *hwctx = device_ctx->hwctx;
101  CudaFunctions *cu = hwctx->internal->cuda_dl;
102 
103  CUcontext dummy;
104 
105  CHECK_CU(cu->cuCtxPushCurrent(hwctx->cuda_ctx));
106 
107  CHECK_CU(cu->cuMemFree((CUdeviceptr)data));
108 
109  CHECK_CU(cu->cuCtxPopCurrent(&dummy));
110 }
111 
112 static AVBufferRef *cuda_pool_alloc(void *opaque, size_t size)
113 {
114  AVHWFramesContext *ctx = opaque;
115  AVHWDeviceContext *device_ctx = ctx->device_ctx;
116  AVCUDADeviceContext *hwctx = device_ctx->hwctx;
117  CudaFunctions *cu = hwctx->internal->cuda_dl;
118 
119  AVBufferRef *ret = NULL;
120  CUcontext dummy = NULL;
121  CUdeviceptr data;
122  int err;
123 
124  err = CHECK_CU(cu->cuCtxPushCurrent(hwctx->cuda_ctx));
125  if (err < 0)
126  return NULL;
127 
128  err = CHECK_CU(cu->cuMemAlloc(&data, size));
129  if (err < 0)
130  goto fail;
131 
132  ret = av_buffer_create((uint8_t*)data, size, cuda_buffer_free, ctx, 0);
133  if (!ret) {
134  CHECK_CU(cu->cuMemFree(data));
135  goto fail;
136  }
137 
138 fail:
139  CHECK_CU(cu->cuCtxPopCurrent(&dummy));
140  return ret;
141 }
142 
144 {
145  AVHWDeviceContext *device_ctx = ctx->device_ctx;
146  AVCUDADeviceContext *hwctx = device_ctx->hwctx;
147  CUDAFramesContext *priv = ctx->hwctx;
148  CudaFunctions *cu = hwctx->internal->cuda_dl;
149  int err, i;
150 
151  for (i = 0; i < FF_ARRAY_ELEMS(supported_formats); i++) {
152  if (ctx->sw_format == supported_formats[i])
153  break;
154  }
156  av_log(ctx, AV_LOG_ERROR, "Pixel format '%s' is not supported\n",
157  av_get_pix_fmt_name(ctx->sw_format));
158  return AVERROR(ENOSYS);
159  }
160 
161  err = CHECK_CU(cu->cuDeviceGetAttribute(&priv->tex_alignment,
162  14 /* CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT */,
163  hwctx->internal->cuda_device));
164  if (err < 0)
165  return err;
166 
167  av_log(ctx, AV_LOG_DEBUG, "CUDA texture alignment: %d\n", priv->tex_alignment);
168 
169  // YUV420P is a special case.
170  // Since nvenc expects the U/V planes to have half the linesize of the Y plane
171  // alignment has to be doubled to ensure the U/V planes still end up aligned.
172  if (ctx->sw_format == AV_PIX_FMT_YUV420P)
173  priv->tex_alignment *= 2;
174 
175  av_pix_fmt_get_chroma_sub_sample(ctx->sw_format, &priv->shift_width, &priv->shift_height);
176 
177  if (!ctx->pool) {
178  int size = av_image_get_buffer_size(ctx->sw_format, ctx->width, ctx->height, priv->tex_alignment);
179  if (size < 0)
180  return size;
181 
184  if (!ffhwframesctx(ctx)->pool_internal)
185  return AVERROR(ENOMEM);
186  }
187 
188  return 0;
189 }
190 
192 {
193  CUDAFramesContext *priv = ctx->hwctx;
194  int res;
195 
196  frame->buf[0] = av_buffer_pool_get(ctx->pool);
197  if (!frame->buf[0])
198  return AVERROR(ENOMEM);
199 
200  res = av_image_fill_arrays(frame->data, frame->linesize, frame->buf[0]->data,
201  ctx->sw_format, ctx->width, ctx->height, priv->tex_alignment);
202  if (res < 0)
203  return res;
204 
205  // YUV420P is a special case.
206  // Nvenc expects the U/V planes in swapped order from how ffmpeg expects them, also chroma is half-aligned
207  if (ctx->sw_format == AV_PIX_FMT_YUV420P) {
208  frame->linesize[1] = frame->linesize[2] = frame->linesize[0] / 2;
209  frame->data[2] = frame->data[1];
210  frame->data[1] = frame->data[2] + frame->linesize[2] * (ctx->height / 2);
211  }
212 
213  frame->format = AV_PIX_FMT_CUDA;
214  frame->width = ctx->width;
215  frame->height = ctx->height;
216 
217  return 0;
218 }
219 
222  enum AVPixelFormat **formats)
223 {
224  enum AVPixelFormat *fmts;
225 
226  fmts = av_malloc_array(2, sizeof(*fmts));
227  if (!fmts)
228  return AVERROR(ENOMEM);
229 
230  fmts[0] = ctx->sw_format;
231  fmts[1] = AV_PIX_FMT_NONE;
232 
233  *formats = fmts;
234 
235  return 0;
236 }
237 
239  const AVFrame *src)
240 {
241  CUDAFramesContext *priv = ctx->hwctx;
242  AVHWDeviceContext *device_ctx = ctx->device_ctx;
243  AVCUDADeviceContext *hwctx = device_ctx->hwctx;
244  CudaFunctions *cu = hwctx->internal->cuda_dl;
245 
246  CUcontext dummy;
247  int i, ret;
248 
249  if ((src->hw_frames_ctx && ((AVHWFramesContext*)src->hw_frames_ctx->data)->format != AV_PIX_FMT_CUDA) ||
250  (dst->hw_frames_ctx && ((AVHWFramesContext*)dst->hw_frames_ctx->data)->format != AV_PIX_FMT_CUDA))
251  return AVERROR(ENOSYS);
252 
253  ret = CHECK_CU(cu->cuCtxPushCurrent(hwctx->cuda_ctx));
254  if (ret < 0)
255  return ret;
256 
257  for (i = 0; i < FF_ARRAY_ELEMS(src->data) && src->data[i]; i++) {
258  CUDA_MEMCPY2D cpy = {
259  .srcPitch = src->linesize[i],
260  .dstPitch = dst->linesize[i],
261  .WidthInBytes = FFMIN(src->linesize[i], dst->linesize[i]),
262  .Height = src->height >> ((i == 0 || i == 3) ? 0 : priv->shift_height),
263  };
264 
265  if (src->hw_frames_ctx) {
266  cpy.srcMemoryType = CU_MEMORYTYPE_DEVICE;
267  cpy.srcDevice = (CUdeviceptr)src->data[i];
268  } else {
269  cpy.srcMemoryType = CU_MEMORYTYPE_HOST;
270  cpy.srcHost = src->data[i];
271  }
272 
273  if (dst->hw_frames_ctx) {
274  cpy.dstMemoryType = CU_MEMORYTYPE_DEVICE;
275  cpy.dstDevice = (CUdeviceptr)dst->data[i];
276  } else {
277  cpy.dstMemoryType = CU_MEMORYTYPE_HOST;
278  cpy.dstHost = dst->data[i];
279  }
280 
281  ret = CHECK_CU(cu->cuMemcpy2DAsync(&cpy, hwctx->stream));
282  if (ret < 0)
283  goto exit;
284  }
285 
286  if (!dst->hw_frames_ctx) {
287  ret = CHECK_CU(cu->cuStreamSynchronize(hwctx->stream));
288  if (ret < 0)
289  goto exit;
290  }
291 
292 exit:
293  CHECK_CU(cu->cuCtxPopCurrent(&dummy));
294 
295  return 0;
296 }
297 
298 static void cuda_device_uninit(AVHWDeviceContext *device_ctx)
299 {
300  CUDADeviceContext *hwctx = device_ctx->hwctx;
301 
302  if (hwctx->p.internal) {
303  CudaFunctions *cu = hwctx->internal.cuda_dl;
304 
305  if (hwctx->internal.is_allocated && hwctx->p.cuda_ctx) {
307  CHECK_CU(cu->cuDevicePrimaryCtxRelease(hwctx->internal.cuda_device));
308  else if (!(hwctx->internal.flags & AV_CUDA_USE_CURRENT_CONTEXT))
309  CHECK_CU(cu->cuCtxDestroy(hwctx->p.cuda_ctx));
310 
311  hwctx->p.cuda_ctx = NULL;
312  }
313 
314  cuda_free_functions(&hwctx->internal.cuda_dl);
315  memset(&hwctx->internal, 0, sizeof(hwctx->internal));
316  hwctx->p.internal = NULL;
317  }
318 }
319 
321 {
322  CUDADeviceContext *hwctx = ctx->hwctx;
323  int ret;
324 
325  hwctx->p.internal = &hwctx->internal;
326 
327  if (!hwctx->internal.cuda_dl) {
328  ret = cuda_load_functions(&hwctx->internal.cuda_dl, ctx);
329  if (ret < 0) {
330  av_log(ctx, AV_LOG_ERROR, "Could not dynamically load CUDA\n");
331  goto error;
332  }
333  }
334 
335  return 0;
336 
337 error:
339  return ret;
340 }
341 
342 static int cuda_context_init(AVHWDeviceContext *device_ctx, int flags) {
343  AVCUDADeviceContext *hwctx = device_ctx->hwctx;
344  CudaFunctions *cu;
345  CUcontext dummy;
346  int ret, dev_active = 0;
347  unsigned int dev_flags = 0;
348 
349  const unsigned int desired_flags = CU_CTX_SCHED_BLOCKING_SYNC;
350 
351  cu = hwctx->internal->cuda_dl;
352 
353  hwctx->internal->flags = flags;
354 
356  ret = CHECK_CU(cu->cuDevicePrimaryCtxGetState(hwctx->internal->cuda_device,
357  &dev_flags, &dev_active));
358  if (ret < 0)
359  return ret;
360 
361  if (dev_active && dev_flags != desired_flags) {
362  av_log(device_ctx, AV_LOG_ERROR, "Primary context already active with incompatible flags.\n");
363  return AVERROR(ENOTSUP);
364  } else if (dev_flags != desired_flags) {
365  ret = CHECK_CU(cu->cuDevicePrimaryCtxSetFlags(hwctx->internal->cuda_device,
366  desired_flags));
367  if (ret < 0)
368  return ret;
369  }
370 
371  ret = CHECK_CU(cu->cuDevicePrimaryCtxRetain(&hwctx->cuda_ctx,
372  hwctx->internal->cuda_device));
373  if (ret < 0)
374  return ret;
375  } else if (flags & AV_CUDA_USE_CURRENT_CONTEXT) {
376  ret = CHECK_CU(cu->cuCtxGetCurrent(&hwctx->cuda_ctx));
377  if (ret < 0)
378  return ret;
379  av_log(device_ctx, AV_LOG_INFO, "Using current CUDA context.\n");
380  } else {
381  ret = CHECK_CU(cu->cuCtxCreate(&hwctx->cuda_ctx, desired_flags,
382  hwctx->internal->cuda_device));
383  if (ret < 0)
384  return ret;
385 
386  CHECK_CU(cu->cuCtxPopCurrent(&dummy));
387  }
388 
389  hwctx->internal->is_allocated = 1;
390 
391  // Setting stream to NULL will make functions automatically use the default CUstream
392  hwctx->stream = NULL;
393 
394  return 0;
395 }
396 
398  AVDictionary *opts, int *flags)
399 {
400  AVDictionaryEntry *primary_ctx_opt = av_dict_get(opts, "primary_ctx", NULL, 0);
401  AVDictionaryEntry *current_ctx_opt = av_dict_get(opts, "current_ctx", NULL, 0);
402 
403  int use_primary_ctx = 0, use_current_ctx = 0;
404  if (primary_ctx_opt)
405  use_primary_ctx = strtol(primary_ctx_opt->value, NULL, 10);
406 
407  if (current_ctx_opt)
408  use_current_ctx = strtol(current_ctx_opt->value, NULL, 10);
409 
410  if (use_primary_ctx && use_current_ctx) {
411  av_log(device_ctx, AV_LOG_ERROR, "Requested both primary and current CUDA context simultaneously.\n");
412  return AVERROR(EINVAL);
413  }
414 
415  if (primary_ctx_opt && use_primary_ctx) {
416  av_log(device_ctx, AV_LOG_VERBOSE, "Using CUDA primary device context\n");
418  } else if (primary_ctx_opt) {
419  av_log(device_ctx, AV_LOG_VERBOSE, "Disabling use of CUDA primary device context\n");
421  }
422 
423  if (current_ctx_opt && use_current_ctx) {
424  av_log(device_ctx, AV_LOG_VERBOSE, "Using CUDA current device context\n");
426  } else if (current_ctx_opt) {
427  av_log(device_ctx, AV_LOG_VERBOSE, "Disabling use of CUDA current device context\n");
429  }
430 
431  return 0;
432 }
433 
434 static int cuda_device_create(AVHWDeviceContext *device_ctx,
435  const char *device,
436  AVDictionary *opts, int flags)
437 {
438  AVCUDADeviceContext *hwctx = device_ctx->hwctx;
439  CudaFunctions *cu;
440  int ret, device_idx = 0;
441 
442  ret = cuda_flags_from_opts(device_ctx, opts, &flags);
443  if (ret < 0)
444  goto error;
445 
446  if (device)
447  device_idx = strtol(device, NULL, 0);
448 
449  ret = cuda_device_init(device_ctx);
450  if (ret < 0)
451  goto error;
452 
453  cu = hwctx->internal->cuda_dl;
454 
455  ret = CHECK_CU(cu->cuInit(0));
456  if (ret < 0)
457  goto error;
458 
459  ret = CHECK_CU(cu->cuDeviceGet(&hwctx->internal->cuda_device, device_idx));
460  if (ret < 0)
461  goto error;
462 
463  ret = cuda_context_init(device_ctx, flags);
464  if (ret < 0)
465  goto error;
466 
467  return 0;
468 
469 error:
470  cuda_device_uninit(device_ctx);
471  return ret;
472 }
473 
474 static int cuda_device_derive(AVHWDeviceContext *device_ctx,
476  int flags) {
477  AVCUDADeviceContext *hwctx = device_ctx->hwctx;
478  CudaFunctions *cu;
479  const char *src_uuid = NULL;
480 #if CONFIG_VULKAN
481  VkPhysicalDeviceIDProperties vk_idp;
482 #endif
483  int ret, i, device_count;
484 
485  ret = cuda_flags_from_opts(device_ctx, opts, &flags);
486  if (ret < 0)
487  goto error;
488 
489 #if CONFIG_VULKAN
490  vk_idp = (VkPhysicalDeviceIDProperties) {
491  .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES,
492  };
493 #endif
494 
495  switch (src_ctx->type) {
496 #if CONFIG_VULKAN
497 #define TYPE PFN_vkGetPhysicalDeviceProperties2
499  AVVulkanDeviceContext *vkctx = src_ctx->hwctx;
500  TYPE prop_fn = (TYPE)vkctx->get_proc_addr(vkctx->inst, "vkGetPhysicalDeviceProperties2");
501  VkPhysicalDeviceProperties2 vk_dev_props = {
502  .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
503  .pNext = &vk_idp,
504  };
505  prop_fn(vkctx->phys_dev, &vk_dev_props);
506  src_uuid = vk_idp.deviceUUID;
507  break;
508  }
509 #undef TYPE
510 #endif
511  default:
512  ret = AVERROR(ENOSYS);
513  goto error;
514  }
515 
516  if (!src_uuid) {
517  av_log(device_ctx, AV_LOG_ERROR,
518  "Failed to get UUID of source device.\n");
519  ret = AVERROR(EINVAL);
520  goto error;
521  }
522 
523  ret = cuda_device_init(device_ctx);
524  if (ret < 0)
525  goto error;
526 
527  cu = hwctx->internal->cuda_dl;
528 
529  ret = CHECK_CU(cu->cuInit(0));
530  if (ret < 0)
531  goto error;
532 
533  ret = CHECK_CU(cu->cuDeviceGetCount(&device_count));
534  if (ret < 0)
535  goto error;
536 
537  hwctx->internal->cuda_device = -1;
538  for (i = 0; i < device_count; i++) {
539  CUdevice dev;
540  CUuuid uuid;
541 
542  ret = CHECK_CU(cu->cuDeviceGet(&dev, i));
543  if (ret < 0)
544  goto error;
545 
546  ret = CHECK_CU(cu->cuDeviceGetUuid(&uuid, dev));
547  if (ret < 0)
548  goto error;
549 
550  if (memcmp(src_uuid, uuid.bytes, sizeof (uuid.bytes)) == 0) {
551  hwctx->internal->cuda_device = dev;
552  break;
553  }
554  }
555 
556  if (hwctx->internal->cuda_device == -1) {
557  av_log(device_ctx, AV_LOG_ERROR, "Could not derive CUDA device.\n");
558  goto error;
559  }
560 
561  ret = cuda_context_init(device_ctx, flags);
562  if (ret < 0)
563  goto error;
564 
565  return 0;
566 
567 error:
568  cuda_device_uninit(device_ctx);
569  return ret;
570 }
571 
574  .name = "CUDA",
575 
576  .device_hwctx_size = sizeof(CUDADeviceContext),
577  .frames_hwctx_size = sizeof(CUDAFramesContext),
578 
579  .device_create = cuda_device_create,
580  .device_derive = cuda_device_derive,
581  .device_init = cuda_device_init,
582  .device_uninit = cuda_device_uninit,
583  .frames_get_constraints = cuda_frames_get_constraints,
584  .frames_init = cuda_frames_init,
585  .frames_get_buffer = cuda_get_buffer,
586  .transfer_get_formats = cuda_transfer_get_formats,
587  .transfer_data_to = cuda_transfer_data,
588  .transfer_data_from = cuda_transfer_data,
589 
590  .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_CUDA, AV_PIX_FMT_NONE },
591 };
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
flags
const SwsFlags flags[]
Definition: swscale.c:61
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
AVVulkanDeviceContext::phys_dev
VkPhysicalDevice phys_dev
Physical device.
Definition: hwcontext_vulkan.h:79
AV_PIX_FMT_CUDA
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition: pixfmt.h:260
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
AVCUDADeviceContextInternal
Definition: hwcontext_cuda_internal.h:31
cuda_context_init
static int cuda_context_init(AVHWDeviceContext *device_ctx, int flags)
Definition: hwcontext_cuda.c:342
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
cuda_device_derive
static int cuda_device_derive(AVHWDeviceContext *device_ctx, AVHWDeviceContext *src_ctx, AVDictionary *opts, int flags)
Definition: hwcontext_cuda.c:474
hwcontext_cuda_internal.h
cuda_transfer_get_formats
static int cuda_transfer_get_formats(AVHWFramesContext *ctx, enum AVHWFrameTransferDirection dir, enum AVPixelFormat **formats)
Definition: hwcontext_cuda.c:220
AV_PIX_FMT_BGR32
#define AV_PIX_FMT_BGR32
Definition: pixfmt.h:513
cuda_flags_from_opts
static int cuda_flags_from_opts(AVHWDeviceContext *device_ctx, AVDictionary *opts, int *flags)
Definition: hwcontext_cuda.c:397
CUDAFramesContext
Definition: hwcontext_cuda.c:33
AV_PIX_FMT_YUV444P10MSB
#define AV_PIX_FMT_YUV444P10MSB
Definition: pixfmt.h:554
CHECK_CU
#define CHECK_CU(x)
Definition: hwcontext_cuda.c:69
AVCUDADeviceContextInternal::is_allocated
int is_allocated
Definition: hwcontext_cuda_internal.h:33
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
pixdesc.h
CUDADeviceContext::internal
AVCUDADeviceContextInternal internal
Definition: hwcontext_cuda.c:40
AVVulkanDeviceContext::get_proc_addr
PFN_vkGetInstanceProcAddr get_proc_addr
Pointer to a vkGetInstanceProcAddr loading function.
Definition: hwcontext_vulkan.h:69
data
const char data[16]
Definition: mxf.c:149
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:539
AVVulkanDeviceContext::inst
VkInstance inst
Vulkan instance.
Definition: hwcontext_vulkan.h:74
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
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
AV_PIX_FMT_VULKAN
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition: pixfmt.h:379
AV_PIX_FMT_YUV444P12MSB
#define AV_PIX_FMT_YUV444P12MSB
Definition: pixfmt.h:555
AV_HWDEVICE_TYPE_VULKAN
@ AV_HWDEVICE_TYPE_VULKAN
Definition: hwcontext.h:39
AVHWFramesConstraints
This struct describes the constraints on hardware frames attached to a given device with a hardware-s...
Definition: hwcontext.h:444
CUDADeviceContext::p
AVCUDADeviceContext p
Definition: hwcontext_cuda.c:39
AV_HWDEVICE_TYPE_CUDA
@ AV_HWDEVICE_TYPE_CUDA
Definition: hwcontext.h:30
fail
#define fail()
Definition: checkasm.h:208
dummy
int dummy
Definition: motion.c:64
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
AVCUDADeviceContextInternal::cuda_device
CUdevice cuda_device
Definition: hwcontext_cuda_internal.h:34
av_pix_fmt_get_chroma_sub_sample
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
Definition: pixdesc.c:3484
AVCUDADeviceContext::cuda_ctx
CUcontext cuda_ctx
Definition: hwcontext_cuda.h:43
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:63
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:542
HWContextType::type
enum AVHWDeviceType type
Definition: hwcontext_internal.h:30
ffhwframesctx
static FFHWFramesContext * ffhwframesctx(AVHWFramesContext *ctx)
Definition: hwcontext_internal.h:115
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
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
AV_PIX_FMT_YUVA420P
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:108
AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:552
AV_PIX_FMT_0BGR32
#define AV_PIX_FMT_0BGR32
Definition: pixfmt.h:516
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
AVFormatContext * ctx
Definition: movenc.c:49
cuda_device_init
static int cuda_device_init(AVHWDeviceContext *ctx)
Definition: hwcontext_cuda.c:320
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
AVVulkanDeviceContext
Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_vulkan.h:59
opts
AVDictionary * opts
Definition: movenc.c:51
TYPE
#define TYPE
Definition: ffv1dec.c:96
AV_CUDA_USE_CURRENT_CONTEXT
#define AV_CUDA_USE_CURRENT_CONTEXT
Use current device context instead of creating a new one.
Definition: hwcontext_cuda.h:68
NULL
#define NULL
Definition: coverity.c:32
AVCUDADeviceContextInternal::flags
int flags
Definition: hwcontext_cuda_internal.h:35
hwcontext_vulkan.h
CUDAFramesContext::shift_width
int shift_width
Definition: hwcontext_cuda.c:34
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:540
cuda_transfer_data
static int cuda_transfer_data(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src)
Definition: hwcontext_cuda.c:238
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
AVCUDADeviceContext::stream
CUstream stream
Definition: hwcontext_cuda.h:44
AVCUDADeviceContext::internal
AVCUDADeviceContextInternal * internal
Definition: hwcontext_cuda.h:45
CUDAFramesContext::tex_alignment
int tex_alignment
Definition: hwcontext_cuda.c:35
av_image_fill_arrays
int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], const uint8_t *src, enum AVPixelFormat pix_fmt, int width, int height, int align)
Setup the data pointers and linesizes based on the specified image parameters and the provided array.
Definition: imgutils.c:446
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
CUDAFramesContext::shift_height
int shift_height
Definition: hwcontext_cuda.c:34
size
int size
Definition: twinvq_data.h:10344
ff_hwcontext_type_cuda
const HWContextType ff_hwcontext_type_cuda
Definition: hwcontext_cuda.c:572
AV_PIX_FMT_NV16
@ AV_PIX_FMT_NV16
interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:198
buffer.h
AV_PIX_FMT_RGB32
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:511
av_image_get_buffer_size
int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align)
Return the size in bytes of the amount of data required to store an image with the given parameters.
Definition: imgutils.c:466
AV_PIX_FMT_P216
#define AV_PIX_FMT_P216
Definition: pixfmt.h:620
AV_PIX_FMT_P210
#define AV_PIX_FMT_P210
Definition: pixfmt.h:616
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
AVCUDADeviceContextInternal::cuda_dl
CudaFunctions * cuda_dl
Definition: hwcontext_cuda_internal.h:32
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
common.h
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
cuda_device_uninit
static void cuda_device_uninit(AVHWDeviceContext *device_ctx)
Definition: hwcontext_cuda.c:298
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
AVCUDADeviceContext
This struct is allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_cuda.h:42
ret
ret
Definition: filter_design.txt:187
AVHWDeviceContext::type
enum AVHWDeviceType type
This field identifies the underlying API used for hardware access.
Definition: hwcontext.h:75
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
AV_PIX_FMT_0RGB32
#define AV_PIX_FMT_0RGB32
Definition: pixfmt.h:515
cuda_check.h
cuda_buffer_free
static void cuda_buffer_free(void *opaque, uint8_t *data)
Definition: hwcontext_cuda.c:96
AV_CUDA_USE_PRIMARY_CONTEXT
#define AV_CUDA_USE_PRIMARY_CONTEXT
Use primary device context instead of creating a new one.
Definition: hwcontext_cuda.h:63
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
cuda_device_create
static int cuda_device_create(AVHWDeviceContext *device_ctx, const char *device, AVDictionary *opts, int flags)
Definition: hwcontext_cuda.c:434
supported_formats
static enum AVPixelFormat supported_formats[]
Definition: hwcontext_cuda.c:43
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
cuda_get_buffer
static int cuda_get_buffer(AVHWFramesContext *ctx, AVFrame *frame)
Definition: hwcontext_cuda.c:191
AV_PIX_FMT_P010
#define AV_PIX_FMT_P010
Definition: pixfmt.h:602
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
cuda_pool_alloc
static AVBufferRef * cuda_pool_alloc(void *opaque, size_t size)
Definition: hwcontext_cuda.c:112
hwcontext_internal.h
AVDictionaryEntry
Definition: dict.h:90
imgutils.h
hwcontext.h
CUDADeviceContext
Definition: hwcontext_cuda.c:38
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
HWContextType
Definition: hwcontext_internal.h:29
cuda_frames_get_constraints
static int cuda_frames_get_constraints(AVHWDeviceContext *ctx, const void *hwconfig, AVHWFramesConstraints *constraints)
Definition: hwcontext_cuda.c:71
cuda_frames_init
static int cuda_frames_init(AVHWFramesContext *ctx)
Definition: hwcontext_cuda.c:143
AVDictionaryEntry::value
char * value
Definition: dict.h:92
src
#define src
Definition: vp8dsp.c:248
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