[FFmpeg-devel] [PATCH] hwcontext_vaapi: Don't require a render node when deriving from DRM

Mark Thompson sw at jkqxz.net
Sat Aug 29 01:15:41 EEST 2020


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 an
associated 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 at bootlin.com>
---
Also tested by the reporter.  I'll apply this in a few days if there are no comments.

- Mark


  libavutil/hwcontext_vaapi.c | 28 ++++++++++++++++------------
  1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c
index 38bdeb7820..2227d6ed69 100644
--- a/libavutil/hwcontext_vaapi.c
+++ b/libavutil/hwcontext_vaapi.c
@@ -1677,20 +1677,24 @@ 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 the device does not have an "
+                           "associated render node.\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 the associated render node "
+                               "could not be opened.\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
-- 
2.28.0


More information about the ffmpeg-devel mailing list