From 6b006637559d331ef3b85b0925f2282d6c8434b8 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 16 Jan 2017 15:34:34 +0100 Subject: vo_opengl: hwdec_cuda: export AVHWDeviceContext So we can use it for filtering later. --- video/decode/cuda.c | 29 ++++------------------------- video/out/opengl/hwdec_cuda.c | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/video/decode/cuda.c b/video/decode/cuda.c index cad02b2353..7454043fdf 100644 --- a/video/decode/cuda.c +++ b/video/decode/cuda.c @@ -38,54 +38,33 @@ static int probe(struct lavc_ctx *ctx, struct vd_lavc_hwdec *hwdec, static int init(struct lavc_ctx *ctx) { - ctx->hwdec_priv = hwdec_devices_get(ctx->hwdec_devs, HWDEC_CUDA)->ctx; + ctx->hwdec_priv = hwdec_devices_get(ctx->hwdec_devs, HWDEC_CUDA); return 0; } static int init_decoder(struct lavc_ctx *ctx, int w, int h) { AVCodecContext *avctx = ctx->avctx; - AVCUDADeviceContext *device_hwctx; - AVHWDeviceContext *device_ctx; - AVHWFramesContext *hwframe_ctx; - int ret = 0; + struct mp_hwdec_ctx *hwctx = ctx->hwdec_priv; if (avctx->hw_frames_ctx) { MP_ERR(ctx, "hw_frames_ctx already initialised!\n"); return -1; } - AVBufferRef *hw_device_ctx = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_CUDA); - if (!hw_device_ctx) { - MP_WARN(ctx, "av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_CUDA) failed\n"); - goto error; - } - - device_ctx = (AVHWDeviceContext*)hw_device_ctx->data; - - device_hwctx = device_ctx->hwctx; - device_hwctx->cuda_ctx = ctx->hwdec_priv; - - ret = av_hwdevice_ctx_init(hw_device_ctx); - if (ret < 0) { - MP_ERR(ctx, "av_hwdevice_ctx_init failed\n"); - goto error; - } - - avctx->hw_frames_ctx = av_hwframe_ctx_alloc(hw_device_ctx); + avctx->hw_frames_ctx = av_hwframe_ctx_alloc(hwctx->av_device_ref); if (!avctx->hw_frames_ctx) { MP_ERR(ctx, "av_hwframe_ctx_alloc failed\n"); goto error; } - hwframe_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data; + AVHWFramesContext *hwframe_ctx = (void* )avctx->hw_frames_ctx->data; hwframe_ctx->format = AV_PIX_FMT_CUDA; return 0; error: av_buffer_unref(&avctx->hw_frames_ctx); - av_buffer_unref(&hw_device_ctx); return -1; } diff --git a/video/out/opengl/hwdec_cuda.c b/video/out/opengl/hwdec_cuda.c index d7821f1a9f..b3aa939c33 100644 --- a/video/out/opengl/hwdec_cuda.c +++ b/video/out/opengl/hwdec_cuda.c @@ -28,7 +28,10 @@ */ #include "cuda_dynamic.h" -#include "video/mp_image_pool.h" + +#include +#include + #include "hwdec.h" #include "video.h" @@ -70,9 +73,10 @@ static int cuda_create(struct gl_hwdec *hw) { CUdevice device; CUcontext cuda_ctx = NULL; + AVBufferRef *hw_device_ctx = NULL; CUcontext dummy; unsigned int device_count; - int ret = 0, eret = 0; + int ret = 0; if (hw->gl->version < 210 && hw->gl->es < 300) { MP_VERBOSE(hw, "need OpenGL >= 2.1 or OpenGL-ES >= 3.0\n"); @@ -103,19 +107,39 @@ static int cuda_create(struct gl_hwdec *hw) p->cuda_ctx = cuda_ctx; + hw_device_ctx = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_CUDA); + if (!hw_device_ctx) + goto error; + + AVHWDeviceContext *device_ctx = (void *)hw_device_ctx->data; + + AVCUDADeviceContext *device_hwctx = device_ctx->hwctx; + device_hwctx->cuda_ctx = cuda_ctx; + + ret = av_hwdevice_ctx_init(hw_device_ctx); + if (ret < 0) { + MP_ERR(hw, "av_hwdevice_ctx_init failed\n"); + goto error; + } + + ret = CHECK_CU(cuCtxPopCurrent(&dummy)); + if (ret < 0) + goto error; + p->hwctx = (struct mp_hwdec_ctx) { .type = HWDEC_CUDA, .ctx = cuda_ctx, + .av_device_ref = hw_device_ctx, }; p->hwctx.driver_name = hw->driver->name; hwdec_devices_add(hw->devs, &p->hwctx); + return 0; error: - eret = CHECK_CU(cuCtxPopCurrent(&dummy)); - if (eret < 0) - return eret; + av_buffer_unref(&hw_device_ctx); + CHECK_CU(cuCtxPopCurrent(&dummy)); - return ret; + return -1; } static int reinit(struct gl_hwdec *hw, struct mp_image_params *params) @@ -217,6 +241,7 @@ static void destroy(struct gl_hwdec *hw) gl->DeleteTextures(2, p->gl_textures); hwdec_devices_remove(hw->devs, &p->hwctx); + av_buffer_unref(&p->hwctx.av_device_ref); } static int map_frame(struct gl_hwdec *hw, struct mp_image *hw_image, -- cgit v1.2.3