aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Thompson2020-08-24 14:50:02 +0100
committerPaul Kocialkowski2020-08-25 10:00:07 +0200
commitdb351826c6fb532138d9aa0b677752c31c1e40c4 (patch)
treee6853e54c32e506f9b1ac7b4d5338c2dbb6bb95d
parentc8ba0daf8dab2f5cbcdded37cd6383649933fbf3 (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>
-rw-r--r--libavutil/hwcontext_vaapi.c26
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