diff options
author | Mark Thompson | 2020-08-24 14:50:02 +0100 |
---|---|---|
committer | Paul Kocialkowski | 2020-08-25 10:00:07 +0200 |
commit | db351826c6fb532138d9aa0b677752c31c1e40c4 (patch) | |
tree | e6853e54c32e506f9b1ac7b4d5338c2dbb6bb95d /libavutil/hwcontext_vaapi.c | |
parent | c8ba0daf8dab2f5cbcdded37cd6383649933fbf3 (diff) |
hwcontext_vaapi: Don't require a render node when deriving from DRMvaapi/drm-render-node
The V4L2 driver does not actually have an associated DRM device at all, so
users work around the requirement by giving libva an unrelated display-only
device instead (which is fine, because it doesn't actually do anything with
that device). This was broken by bc9b6358fb7315c0173de322472641766f6289da
forcing a render node, because the display-only device did not have a
matching render node to use. Fix that by just passing through the original
non-render DRM fd if we can't find a render node.
Reported-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Diffstat (limited to 'libavutil/hwcontext_vaapi.c')
-rw-r--r-- | libavutil/hwcontext_vaapi.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c index 38bdeb7820..b576447407 100644 --- a/libavutil/hwcontext_vaapi.c +++ b/libavutil/hwcontext_vaapi.c @@ -1677,20 +1677,22 @@ static int vaapi_device_derive(AVHWDeviceContext *ctx, } else { render_node = drmGetRenderDeviceNameFromFd(src_hwctx->fd); if (!render_node) { - av_log(ctx, AV_LOG_ERROR, "Failed to find a render node " - "matching the DRM device.\n"); - return AVERROR(ENODEV); - } - fd = open(render_node, O_RDWR); - if (fd < 0) { - av_log(ctx, AV_LOG_ERROR, "Failed to open render node %s" - "matching the DRM device.\n", render_node); + av_log(ctx, AV_LOG_VERBOSE, "Using non-render node " + "because no associated render node was found.\n"); + fd = src_hwctx->fd; + } else { + fd = open(render_node, O_RDWR); + if (fd < 0) { + av_log(ctx, AV_LOG_VERBOSE, "Using non-render node " + "because render node failed to open.\n"); + fd = src_hwctx->fd; + } else { + av_log(ctx, AV_LOG_VERBOSE, "Using render node %s " + "in place of non-render DRM device.\n", + render_node); + } free(render_node); - return AVERROR(errno); } - av_log(ctx, AV_LOG_VERBOSE, "Using render node %s in place " - "of non-render DRM device.\n", render_node); - free(render_node); } } #else |