[FFmpeg-devel] [PATCH] avutil/hwcontext_cuda: add AVCUDAFramesContext and AVCUDAFramesContext.flags
Timo Rothenpieler
timo at rothenpieler.org
Tue May 8 00:10:27 EEST 2018
Frames can be mapped from nvdec/cuvid, not needing any actual memory
allocation, but all other features of the hw_frames_ctx.
Hence the dummy-mode, which does not allocate any (notable amounts of)
memory but otherwise behaves the exact same.
---
doc/APIchanges | 3 +++
libavutil/hwcontext_cuda.c | 10 ++++++++++
libavutil/hwcontext_cuda.h | 18 +++++++++++++++++-
libavutil/version.h | 2 +-
4 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/doc/APIchanges b/doc/APIchanges
index ede5b186ae..82ec888fd8 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,9 @@ libavutil: 2017-10-21
API changes, most recent first:
+2018-05-xx - xxxxxxxxxx - lavu 56.19.100 - hwcontext.h
+ Add AVCUDAFramesContext and AVCUDAFramesContext.flags.
+
2018-04-xx - xxxxxxxxxx - lavu 56.18.100 - pixdesc.h
Add AV_PIX_FMT_FLAG_ALPHA to AV_PIX_FMT_PAL8.
diff --git a/libavutil/hwcontext_cuda.c b/libavutil/hwcontext_cuda.c
index 37827a770c..0d867ef0f5 100644
--- a/libavutil/hwcontext_cuda.c
+++ b/libavutil/hwcontext_cuda.c
@@ -83,6 +83,7 @@ static void cuda_buffer_free(void *opaque, uint8_t *data)
static AVBufferRef *cuda_pool_alloc(void *opaque, int size)
{
AVHWFramesContext *ctx = opaque;
+ AVCUDAFramesContext *frctx = ctx->hwctx;
AVCUDADeviceContext *hwctx = ctx->device_ctx->hwctx;
CudaFunctions *cu = hwctx->internal->cuda_dl;
@@ -97,6 +98,10 @@ static AVBufferRef *cuda_pool_alloc(void *opaque, int size)
return NULL;
}
+ // A lot of places expect the pointer to be !=NULL, so make minimum allocation instead.
+ if (frctx->flags & AV_CUDA_HWFRAMES_DUMMY_MODE)
+ size = 1;
+
err = cu->cuMemAlloc(&data, size);
if (err != CUDA_SUCCESS)
goto fail;
@@ -161,6 +166,7 @@ static int cuda_frames_init(AVHWFramesContext *ctx)
static int cuda_get_buffer(AVHWFramesContext *ctx, AVFrame *frame)
{
+ AVCUDAFramesContext *frctx = ctx->hwctx;
int aligned_width;
int width_in_bytes = ctx->width;
@@ -210,6 +216,9 @@ static int cuda_get_buffer(AVHWFramesContext *ctx, AVFrame *frame)
frame->width = ctx->width;
frame->height = ctx->height;
+ if (frctx->flags & AV_CUDA_HWFRAMES_DUMMY_MODE)
+ frame->data[0] = frame->data[1] = frame->data[2] = NULL;
+
return 0;
}
@@ -402,6 +411,7 @@ const HWContextType ff_hwcontext_type_cuda = {
.name = "CUDA",
.device_hwctx_size = sizeof(AVCUDADeviceContext),
+ .frames_hwctx_size = sizeof(AVCUDAFramesContext),
.frames_priv_size = sizeof(CUDAFramesContext),
.device_create = cuda_device_create,
diff --git a/libavutil/hwcontext_cuda.h b/libavutil/hwcontext_cuda.h
index 12dae8449e..388d6f8f1c 100644
--- a/libavutil/hwcontext_cuda.h
+++ b/libavutil/hwcontext_cuda.h
@@ -45,7 +45,23 @@ typedef struct AVCUDADeviceContext {
} AVCUDADeviceContext;
/**
- * AVHWFramesContext.hwctx is currently not used
+ * This struct is allocated as AVHWFramesContext.hwctx
*/
+typedef struct AVCUDAFramesContext {
+ /**
+ * Special implementation-specific flags.
+ *
+ * Must be set by the user before calling av_hwframe_ctx_init().
+ */
+ int flags;
+} AVCUDAFramesContext;
+
+/**
+ * No actual allocation will happen, but otherwise behaves like normal.
+ *
+ * This is to be used if a AVHWFramesContext is required, but the actual
+ * allocation has to happen outside of it.
+ */
+#define AV_CUDA_HWFRAMES_DUMMY_MODE (1 << 0)
#endif /* AVUTIL_HWCONTEXT_CUDA_H */
diff --git a/libavutil/version.h b/libavutil/version.h
index 5185454d9b..84409b1d69 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 56
-#define LIBAVUTIL_VERSION_MINOR 18
+#define LIBAVUTIL_VERSION_MINOR 19
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
--
2.17.0
More information about the ffmpeg-devel
mailing list