| @@ -18,7 +18,6 @@ | |||
| #include "libavutil/buffer.h" | |||
| #include "libavutil/hwcontext.h" | |||
| #include "libavutil/hwcontext_cuda.h" | |||
| #include "libavutil/log.h" | |||
| #include "libavutil/opt.h" | |||
| @@ -35,60 +34,14 @@ typedef struct CudaUploadContext { | |||
| AVBufferRef *hwframe; | |||
| } CudaUploadContext; | |||
| static void cudaupload_ctx_free(AVHWDeviceContext *ctx) | |||
| { | |||
| AVCUDADeviceContext *hwctx = ctx->hwctx; | |||
| cuCtxDestroy(hwctx->cuda_ctx); | |||
| } | |||
| static av_cold int cudaupload_init(AVFilterContext *ctx) | |||
| { | |||
| CudaUploadContext *s = ctx->priv; | |||
| char buf[64] = { 0 }; | |||
| AVHWDeviceContext *device_ctx; | |||
| AVCUDADeviceContext *device_hwctx; | |||
| CUdevice device; | |||
| CUcontext cuda_ctx = NULL, dummy; | |||
| CUresult err; | |||
| int ret; | |||
| err = cuInit(0); | |||
| if (err != CUDA_SUCCESS) { | |||
| av_log(ctx, AV_LOG_ERROR, "Could not initialize the CUDA driver API\n"); | |||
| return AVERROR_UNKNOWN; | |||
| } | |||
| err = cuDeviceGet(&device, s->device_idx); | |||
| if (err != CUDA_SUCCESS) { | |||
| av_log(ctx, AV_LOG_ERROR, "Could not get the device number %d\n", s->device_idx); | |||
| return AVERROR_UNKNOWN; | |||
| } | |||
| err = cuCtxCreate(&cuda_ctx, 0, device); | |||
| if (err != CUDA_SUCCESS) { | |||
| av_log(ctx, AV_LOG_ERROR, "Error creating a CUDA context\n"); | |||
| return AVERROR_UNKNOWN; | |||
| } | |||
| cuCtxPopCurrent(&dummy); | |||
| s->hwdevice = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_CUDA); | |||
| if (!s->hwdevice) { | |||
| cuCtxDestroy(cuda_ctx); | |||
| return AVERROR(ENOMEM); | |||
| } | |||
| device_ctx = (AVHWDeviceContext*)s->hwdevice->data; | |||
| device_ctx->free = cudaupload_ctx_free; | |||
| snprintf(buf, sizeof(buf), "%d", s->device_idx); | |||
| device_hwctx = device_ctx->hwctx; | |||
| device_hwctx->cuda_ctx = cuda_ctx; | |||
| ret = av_hwdevice_ctx_init(s->hwdevice); | |||
| if (ret < 0) | |||
| return ret; | |||
| return 0; | |||
| return av_hwdevice_ctx_create(&s->hwdevice, AV_HWDEVICE_TYPE_CUDA, buf, NULL, 0); | |||
| } | |||
| static av_cold void cudaupload_uninit(AVFilterContext *ctx) | |||
| @@ -134,8 +87,8 @@ static int cudaupload_config_output(AVFilterLink *outlink) | |||
| hwframe_ctx = (AVHWFramesContext*)s->hwframe->data; | |||
| hwframe_ctx->format = AV_PIX_FMT_CUDA; | |||
| hwframe_ctx->sw_format = inlink->format; | |||
| hwframe_ctx->width = FFALIGN(inlink->w, 16); | |||
| hwframe_ctx->height = FFALIGN(inlink->h, 16); | |||
| hwframe_ctx->width = inlink->w; | |||
| hwframe_ctx->height = inlink->h; | |||
| ret = av_hwframe_ctx_init(s->hwframe); | |||
| if (ret < 0) | |||