33 #define CUDA_FRAME_ALIGNMENT 256 54 #define CHECK_CU(x) FF_CUDA_CHECK_DL(device_ctx, cu, x) 92 CHECK_CU(cu->cuMemFree((CUdeviceptr)data));
94 CHECK_CU(cu->cuCtxPopCurrent(&dummy));
113 err =
CHECK_CU(cu->cuMemAlloc(&data, size));
124 CHECK_CU(cu->cuCtxPopCurrent(&dummy));
224 CUDA_MEMCPY2D cpy = {
232 cpy.srcMemoryType = CU_MEMORYTYPE_DEVICE;
233 cpy.srcDevice = (CUdeviceptr)src->
data[i];
235 cpy.srcMemoryType = CU_MEMORYTYPE_HOST;
236 cpy.srcHost = src->
data[
i];
240 cpy.dstMemoryType = CU_MEMORYTYPE_DEVICE;
241 cpy.dstDevice = (CUdeviceptr)dst->
data[i];
243 cpy.dstMemoryType = CU_MEMORYTYPE_HOST;
244 cpy.dstHost = dst->
data[
i];
259 CHECK_CU(cu->cuCtxPopCurrent(&dummy));
316 int ret, dev_active = 0;
317 unsigned int dev_flags = 0;
319 const unsigned int desired_flags = CU_CTX_SCHED_BLOCKING_SYNC;
327 &dev_flags, &dev_active));
331 if (dev_active && dev_flags != desired_flags) {
332 av_log(device_ctx,
AV_LOG_ERROR,
"Primary context already active with incompatible flags.\n");
334 }
else if (dev_flags != desired_flags) {
351 CHECK_CU(cu->cuCtxPopCurrent(&dummy));
368 int ret, device_idx = 0;
371 device_idx = strtol(device,
NULL, 0);
402 const char *src_uuid =
NULL;
403 int ret,
i, device_count;
406 VkPhysicalDeviceIDProperties vk_idp = {
407 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES,
411 switch (src_ctx->
type) {
415 VkPhysicalDeviceProperties2 vk_dev_props = {
416 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
419 vkGetPhysicalDeviceProperties2(vkctx->
phys_dev, &vk_dev_props);
420 src_uuid = vk_idp.deviceUUID;
430 "Failed to get UUID of source device.\n");
443 ret =
CHECK_CU(cu->cuDeviceGetCount(&device_count));
448 for (i = 0; i < device_count; i++) {
452 ret =
CHECK_CU(cu->cuDeviceGet(&dev, i));
456 ret =
CHECK_CU(cu->cuDeviceGetUuid(&uuid, dev));
460 if (memcmp(src_uuid, uuid.bytes, sizeof (uuid.bytes)) == 0) {
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
This structure describes decoded (raw) audio or video data.
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Memory handling functions.
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
AVCUDADeviceContextInternal * internal
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...
int width
The allocated dimensions of the frames in this pool.
static int cuda_frames_get_constraints(AVHWDeviceContext *ctx, const void *hwconfig, AVHWFramesConstraints *constraints)
static int cuda_frames_init(AVHWFramesContext *ctx)
static int cuda_device_derive(AVHWDeviceContext *device_ctx, AVHWDeviceContext *src_ctx, AVDictionary *opts, int flags)
static void error(const char *err)
AVBufferRef * hw_frames_ctx
For hwaccel-format frames, this should be a reference to the AVHWFramesContext describing the frame...
AVBufferPool * pool_internal
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
static enum AVPixelFormat supported_formats[]
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
#define AV_PIX_FMT_YUV444P16
static int cuda_device_create(AVHWDeviceContext *device_ctx, const char *device, AVDictionary *opts, int flags)
static void cuda_buffer_free(void *opaque, uint8_t *data)
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...
#define i(width, name, range_min, range_max)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
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.
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
#define AV_PIX_FMT_0BGR32
API-specific header for AV_HWDEVICE_TYPE_VULKAN.
AVBufferRef * av_buffer_create(uint8_t *data, int size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
enum AVHWDeviceType type
This field identifies the underlying API used for hardware access.
static int cuda_device_init(AVHWDeviceContext *ctx)
static int cuda_get_buffer(AVHWFramesContext *ctx, AVFrame *frame)
AVHWDeviceContext * device_ctx
The parent AVHWDeviceContext.
static int cuda_transfer_get_formats(AVHWFramesContext *ctx, enum AVHWFrameTransferDirection dir, enum AVPixelFormat **formats)
static AVBufferRef * cuda_pool_alloc(void *opaque, int size)
Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
FFmpeg internal API for CUDA.
HW acceleration through CUDA.
AVBufferPool * av_buffer_pool_init2(int size, void *opaque, AVBufferRef *(*alloc)(void *opaque, int size), void(*pool_free)(void *opaque))
Allocate and initialize a buffer pool with a more complex allocator.
#define FF_ARRAY_ELEMS(a)
#define CUDA_FRAME_ALIGNMENT
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
This struct describes the constraints on hardware frames attached to a given device with a hardware-s...
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
static int cuda_transfer_data(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src)
const HWContextType ff_hwcontext_type_cuda
uint8_t * data
The data buffer.
This struct is allocated as AVHWDeviceContext.hwctx.
This struct describes a set or pool of "hardware" frames (i.e.
refcounted data buffer API
enum AVPixelFormat * valid_hw_formats
A list of possible values for format in the hw_frames_ctx, terminated by AV_PIX_FMT_NONE.
static int cuda_context_init(AVHWDeviceContext *device_ctx, int flags)
AVHWFramesInternal * internal
Private data used internally by libavutil.
#define flags(name, subs,...)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
A reference to a data buffer.
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
#define AV_CUDA_USE_PRIMARY_CONTEXT
Use primary device context instead of creating a new one.
common internal and external API header
static void cuda_device_uninit(AVHWDeviceContext *device_ctx)
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
AVHWFrameTransferDirection
AVBufferPool * pool
A pool from which the frames are allocated by av_hwframe_get_buffer().
enum AVPixelFormat * valid_sw_formats
A list of possible values for sw_format in the hw_frames_ctx, terminated by AV_PIX_FMT_NONE.
VkPhysicalDevice phys_dev
Physical device.
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
#define av_malloc_array(a, b)
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.
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
AVPixelFormat
Pixel format.
#define AV_PIX_FMT_0RGB32