From d9376fc86ffec26f134e89293a4342c4b99f0e5b Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 13 Jan 2017 13:35:31 +0100 Subject: vaapi: always create AVHWDeviceContext on init For convenience. Since we still have code that works even if creating a AVHWDeviceContext fails, failure is ignored. (Although currently, it succeeds creation even with the stale/abandoned vdpau wrapper driver.) --- video/decode/vaapi.c | 15 ++------------- video/vaapi.c | 20 ++++++++++++++++++++ video/vaapi.h | 1 + 3 files changed, 23 insertions(+), 13 deletions(-) (limited to 'video') diff --git a/video/decode/vaapi.c b/video/decode/vaapi.c index 604f4807cd..8a7331fc26 100644 --- a/video/decode/vaapi.c +++ b/video/decode/vaapi.c @@ -41,7 +41,6 @@ struct priv { struct mp_vaapi_ctx *ctx; bool own_ctx; - AVBufferRef *device_ref; AVBufferRef *frames_ref; }; @@ -72,7 +71,7 @@ static int init_decoder(struct lavc_ctx *ctx, int w, int h) } if (!p->frames_ref) { - p->frames_ref = av_hwframe_ctx_alloc(p->device_ref); + p->frames_ref = av_hwframe_ctx_alloc(p->ctx->av_device_ref); if (!p->frames_ref) return -1; @@ -114,7 +113,6 @@ static void uninit(struct lavc_ctx *ctx) return; av_buffer_unref(&p->frames_ref); - av_buffer_unref(&p->device_ref); if (p->own_ctx) va_destroy(p->ctx); @@ -143,16 +141,7 @@ static int init(struct lavc_ctx *ctx, bool direct) ctx->hwdec_priv = p; - p->device_ref = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_VAAPI); - if (!p->device_ref) - return -1; - - AVHWDeviceContext *hwctx = (void *)p->device_ref->data; - AVVAAPIDeviceContext *vactx = hwctx->hwctx; - - vactx->display = p->ctx->display; - - if (av_hwdevice_ctx_init(p->device_ref) < 0) + if (!p->ctx->av_device_ref) return -1; return 0; diff --git a/video/vaapi.c b/video/vaapi.c index e71232db21..69c0163972 100644 --- a/video/vaapi.c +++ b/video/vaapi.c @@ -151,6 +151,21 @@ static void va_info_callback(const char *msg) va_message_callback(msg, MSGL_V); } +static void open_lavu_vaapi_device(struct mp_vaapi_ctx *ctx) +{ + ctx->av_device_ref = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_VAAPI); + if (!ctx->av_device_ref) + return; + + AVHWDeviceContext *hwctx = (void *)ctx->av_device_ref->data; + AVVAAPIDeviceContext *vactx = hwctx->hwctx; + + vactx->display = ctx->display; + + if (av_hwdevice_ctx_init(ctx->av_device_ref) < 0) + av_buffer_unref(&ctx->av_device_ref); +} + struct mp_vaapi_ctx *va_initialize(VADisplay *display, struct mp_log *plog, bool probing) { @@ -189,6 +204,11 @@ struct mp_vaapi_ctx *va_initialize(VADisplay *display, struct mp_log *plog, va_get_formats(res); if (!res->image_formats) goto error; + + // For now, some code will still work even if libavutil fails on old crap + // libva drivers (such as the vdpau wraper). So don't error out on failure. + open_lavu_vaapi_device(res); + return res; error: diff --git a/video/vaapi.h b/video/vaapi.h index 68d8d4383d..01fb4fa980 100644 --- a/video/vaapi.h +++ b/video/vaapi.h @@ -33,6 +33,7 @@ struct mp_vaapi_ctx { struct mp_hwdec_ctx hwctx; struct mp_log *log; VADisplay display; + struct AVBufferRef *av_device_ref; // AVVAAPIDeviceContext* struct va_image_formats *image_formats; bool gpu_memcpy_message; pthread_mutex_t lock; -- cgit v1.2.3