From patchwork Sun Jul 5 15:49:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 20822 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 2E08544BC3D for ; Sun, 5 Jul 2020 18:52:05 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E34FA68921A; Sun, 5 Jul 2020 18:52:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C25A5687FD3 for ; Sun, 5 Jul 2020 18:51:58 +0300 (EEST) Received: by mail-wr1-f44.google.com with SMTP id b6so38095018wrs.11 for ; Sun, 05 Jul 2020 08:51:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=meijq8S4lt99arWAlkyNHPuWp0H+AtBhMWBkhCssXqQ=; b=n7uN9x3bcXq31pwugnkvM/aAzWYZegsY3wY2qYaKHGqCdFJlJ0jQWF0MUDw4DGj8NI 8IA/V07Rc3ndEdb6cMiyylNnm3KJPsw/1UCkGyvQqW7EvYCab1ZS8pKzIR5zR+9UBVI4 z1RHb83Xe/J566YJq0gUmdZcSVL4Yq+qitHJifGhUaUZFwBOrytV8PjUijn/VFKoE5yU J8Fm0Bqpc/Osn9/aiMGJN2DpbS3PduQzy5kd/c4sYlAYZs82c9EGU228bZhaOdZm0vFw gWrgNTRgTmL9yvYbBVcB/PAPDU6r21yc/mnVdLM5h4PtOFJCEUcV3OcbeegMRP616a7u oMQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=meijq8S4lt99arWAlkyNHPuWp0H+AtBhMWBkhCssXqQ=; b=CVt4oYrKAY4nTP6W1J9Ew4MEcF2sDfeeHPMShbax8U5clBwo9wS9Snp6JEoMaS0Io9 cKQfUuQZviueVOsuzHq0SP1YCFY8jznuNBrou8SvsHWj+qPghUnx3dO4yqqYpb0fVR9+ k7EXi3mL1ewloIZhpjHLSlUUAKf3TQKEEcbBLGDfbqc+NJ2dhNk8P33T5k/414nMMW/S VY3viItyw9EfaU9EwlBe0mmiZevwMIVHZxH6GM1wmmKM+KLdpTdHIADkFhZLWEXhDJjl C0elBLaa1ICeKtEZWJAD1KpkhQoi1gdk8aoLhnGzr1s98M4NDmXYDcZLbpgaye8HHdJ/ 6sbQ== X-Gm-Message-State: AOAM5301Yute4NBHj/NTOXoBvLYwIVLQ3OKkw2Kd5u7R57mtYywOX4zC pCFXVkwcniS0YhcfnsAjhYaRB5zgj2U= X-Google-Smtp-Source: ABdhPJzNTwEiuYwFo4ODR+5IkzJ0YyieT1Qgi7XIce59zjRoXzhRNcYCd5KKt4qC19xF+BQ1vYQrlg== X-Received: by 2002:adf:ef8a:: with SMTP id d10mr43634021wro.126.1593964317825; Sun, 05 Jul 2020 08:51:57 -0700 (PDT) Received: from localhost.localdomain (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id j4sm16070985wrp.51.2020.07.05.08.51.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Jul 2020 08:51:57 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Jul 2020 16:49:43 +0100 Message-Id: <20200705154946.401280-1-sw@jkqxz.net> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/4] kmsgrab: Refactor and clean error cases X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavdevice/kmsgrab.c | 151 ++++++++++++++++++++++++++---------------- 1 file changed, 93 insertions(+), 58 deletions(-) diff --git a/libavdevice/kmsgrab.c b/libavdevice/kmsgrab.c index d0de774871..47ba15ca07 100644 --- a/libavdevice/kmsgrab.c +++ b/libavdevice/kmsgrab.c @@ -81,70 +81,42 @@ static void kmsgrab_free_frame(void *opaque, uint8_t *data) av_frame_free(&frame); } -static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) +static int kmsgrab_get_fb(AVFormatContext *avctx, + drmModePlane *plane, + AVDRMFrameDescriptor *desc) { KMSGrabContext *ctx = avctx->priv_data; - drmModePlane *plane; - drmModeFB *fb; - AVDRMFrameDescriptor *desc; - AVFrame *frame; - int64_t now; + drmModeFB *fb = NULL; int err, fd; - now = av_gettime(); - if (ctx->frame_last) { - int64_t delay; - while (1) { - delay = ctx->frame_last + ctx->frame_delay - now; - if (delay <= 0) - break; - av_usleep(delay); - now = av_gettime(); - } - } - ctx->frame_last = now; - - plane = drmModeGetPlane(ctx->hwctx->fd, ctx->plane_id); - if (!plane) { - av_log(avctx, AV_LOG_ERROR, "Failed to get plane " - "%"PRIu32".\n", ctx->plane_id); - return AVERROR(EIO); - } - if (!plane->fb_id) { - av_log(avctx, AV_LOG_ERROR, "Plane %"PRIu32" no longer has " - "an associated framebuffer.\n", ctx->plane_id); - return AVERROR(EIO); - } - fb = drmModeGetFB(ctx->hwctx->fd, plane->fb_id); if (!fb) { av_log(avctx, AV_LOG_ERROR, "Failed to get framebuffer " "%"PRIu32".\n", plane->fb_id); - return AVERROR(EIO); + err = AVERROR(EIO); + goto fail; } if (fb->width != ctx->width || fb->height != ctx->height) { av_log(avctx, AV_LOG_ERROR, "Plane %"PRIu32" framebuffer " "dimensions changed: now %"PRIu32"x%"PRIu32".\n", ctx->plane_id, fb->width, fb->height); - return AVERROR(EIO); + err = AVERROR(EIO); + goto fail; } if (!fb->handle) { av_log(avctx, AV_LOG_ERROR, "No handle set on framebuffer.\n"); - return AVERROR(EIO); + err = AVERROR(EIO); + goto fail; } err = drmPrimeHandleToFD(ctx->hwctx->fd, fb->handle, O_RDONLY, &fd); if (err < 0) { - err = errno; + err = AVERROR(errno); av_log(avctx, AV_LOG_ERROR, "Failed to get PRIME fd from " "framebuffer handle: %s.\n", strerror(errno)); - return AVERROR(err); + goto fail; } - desc = av_mallocz(sizeof(*desc)); - if (!desc) - return AVERROR(ENOMEM); - *desc = (AVDRMFrameDescriptor) { .nb_objects = 1, .objects[0] = { @@ -164,31 +136,92 @@ static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) }, }; + err = 0; +fail: + drmModeFreeFB(fb); + return err; +} + +static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) +{ + KMSGrabContext *ctx = avctx->priv_data; + drmModePlane *plane = NULL; + AVDRMFrameDescriptor *desc = NULL; + AVFrame *frame = NULL; + int64_t now; + int err; + + now = av_gettime(); + if (ctx->frame_last) { + int64_t delay; + while (1) { + delay = ctx->frame_last + ctx->frame_delay - now; + if (delay <= 0) + break; + av_usleep(delay); + now = av_gettime(); + } + } + ctx->frame_last = now; + + plane = drmModeGetPlane(ctx->hwctx->fd, ctx->plane_id); + if (!plane) { + av_log(avctx, AV_LOG_ERROR, "Failed to get plane " + "%"PRIu32".\n", ctx->plane_id); + err = AVERROR(EIO); + goto fail; + } + if (!plane->fb_id) { + av_log(avctx, AV_LOG_ERROR, "Plane %"PRIu32" no longer has " + "an associated framebuffer.\n", ctx->plane_id); + err = AVERROR(EIO); + goto fail; + } + + desc = av_mallocz(sizeof(*desc)); + if (!desc) { + err = AVERROR(ENOMEM); + goto fail; + } + + err = kmsgrab_get_fb(avctx, plane, desc); + if (err < 0) + goto fail; + frame = av_frame_alloc(); - if (!frame) - return AVERROR(ENOMEM); + if (!frame) { + err = AVERROR(ENOMEM); + goto fail; + } frame->hw_frames_ctx = av_buffer_ref(ctx->frames_ref); - if (!frame->hw_frames_ctx) - return AVERROR(ENOMEM); + if (!frame->hw_frames_ctx) { + err = AVERROR(ENOMEM); + goto fail; + } frame->buf[0] = av_buffer_create((uint8_t*)desc, sizeof(*desc), &kmsgrab_free_desc, avctx, 0); - if (!frame->buf[0]) - return AVERROR(ENOMEM); + if (!frame->buf[0]) { + err = AVERROR(ENOMEM); + goto fail; + } frame->data[0] = (uint8_t*)desc; frame->format = AV_PIX_FMT_DRM_PRIME; - frame->width = fb->width; - frame->height = fb->height; + frame->width = ctx->width; + frame->height = ctx->height; - drmModeFreeFB(fb); drmModeFreePlane(plane); + plane = NULL; + desc = NULL; pkt->buf = av_buffer_create((uint8_t*)frame, sizeof(*frame), &kmsgrab_free_frame, avctx, 0); - if (!pkt->buf) - return AVERROR(ENOMEM); + if (!pkt->buf) { + err = AVERROR(ENOMEM); + goto fail; + } pkt->data = (uint8_t*)frame; pkt->size = sizeof(*frame); @@ -196,6 +229,12 @@ static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) pkt->flags |= AV_PKT_FLAG_TRUSTED; return 0; + +fail: + drmModeFreePlane(plane); + av_freep(&desc); + av_frame_free(&frame); + return err; } static const struct { @@ -402,13 +441,9 @@ static av_cold int kmsgrab_read_header(AVFormatContext *avctx) err = 0; fail: - if (plane_res) - drmModeFreePlaneResources(plane_res); - if (plane) - drmModeFreePlane(plane); - if (fb) - drmModeFreeFB(fb); - + drmModeFreePlaneResources(plane_res); + drmModeFreePlane(plane); + drmModeFreeFB(fb); return err; } From patchwork Sun Jul 5 15:49:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 20825 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 58AB544B1CB for ; Sun, 5 Jul 2020 19:00:11 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 336F968A3D6; Sun, 5 Jul 2020 19:00:11 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DF1A1680330 for ; Sun, 5 Jul 2020 19:00:04 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id q15so36591286wmj.2 for ; Sun, 05 Jul 2020 09:00:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=WQ1XOBEdQwQt9NPihIgMdRZbi4EzVzpsqN02b3dkjK0=; b=YCtHgd1dPfFN/pGL5+H3O/ia++H0j1Syht1AtvIKIio1Qkj/oW7Yc3yYauCmGRZ3gx bXESaAmJAYXFA+VyaYStmvC+1osOfcatHs5xYEZymIDAIN3PfoVh1KXZzkma0J8lEqcA ugFH84MU66oL85IC/0f1npIKTjdk2bx5OK79OYNYVQBdQ4US/m49lueHxTcgMtvKCZqD rpSOv+MPj9YVN8WjTGNBXtzN/eUGWBFYYhSnOHAYyIi/ms9RiLwLCxuT7FblZrWSExEH /lyVwsHpdQNB3IbOoUqVhHe81rePDitlN1DKUhnIMwWA8CO1RdfONQOAOuuc2NJ9h0hi j5Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=WQ1XOBEdQwQt9NPihIgMdRZbi4EzVzpsqN02b3dkjK0=; b=JAogDUKnv3+MLYgocYq7Ay3T/18SdNCHqlziH7LsftAG5le4ZdRBLK5ncEn4C5MQYQ r4iQFg3JqgtE926CxpBBvaZtvHFCiavaST0+nUYzTMETUB4RxWxAKzaHjW2ZVnt+0WgW tm49HPeRe2tL8OL+DhhJadhlWgCkXwVkTCjD5Wlj02CmaKPfgK6paBKOd64+oF+UG7lO VYNka6LMijtxfMIGQH29mW0EHtfn7y2QaQWD1PbxD9r/XhtjZkLPw7Mef5MGsytarYAb E8dFY7SqLCH/ZA7Gsw/+cd1eGw6R/z2TN1g+Yu3xphZX51Pq2U0dIMcuhEqVIUbyPNHg /TuA== X-Gm-Message-State: AOAM530bU2xMvaw0c9QczzQ1/W3L15yI0Yn5mRulofiU9ePvq67J5E5Z lqYP5W+WwVDgGpPOcL9MM42SNpg3YZE= X-Google-Smtp-Source: ABdhPJyiIFD0DSjQ6VKtBqrPrQ0Hfg8w2hfJ38aHMgxe5kDIvabuqndTIP/G29EYHetYB1tNZBxYQA== X-Received: by 2002:a1c:3bc2:: with SMTP id i185mr46158992wma.33.1593964318676; Sun, 05 Jul 2020 08:51:58 -0700 (PDT) Received: from localhost.localdomain (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id j4sm16070985wrp.51.2020.07.05.08.51.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Jul 2020 08:51:58 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Jul 2020 16:49:44 +0100 Message-Id: <20200705154946.401280-2-sw@jkqxz.net> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200705154946.401280-1-sw@jkqxz.net> References: <20200705154946.401280-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/4] kmsgrab: Use GetFB2 if available X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The most useful feature here is the ability to automatically extract the framebuffer format and modifiers. It also makes support for multi-plane framebuffers possible, though they will need to be added to the format table to work (not tested by me). This requires libdrm 2.4.101 (from April 2020) to build, so it includes a configure check to allow compatibility with existing distributions. Even with libdrm support, it still won't do anything at runtime if you are running Linux < 5.7 (before June 2020). --- This has been hanging around for a while waiting for the GETFB2 ioctl() to actually make it into stable Linux, which it now is with 5.7. configure | 4 + libavdevice/kmsgrab.c | 221 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 203 insertions(+), 22 deletions(-) diff --git a/configure b/configure index bdfd731602..2900acc687 100755 --- a/configure +++ b/configure @@ -2323,6 +2323,7 @@ HAVE_LIST=" $THREADS_LIST $TOOLCHAIN_FEATURES $TYPES_LIST + libdrm_getfb2 makeinfo makeinfo_html opencl_d3d11 @@ -6631,6 +6632,9 @@ test_cpp <= 0.35.0" "va/va.h" vaInitialize diff --git a/libavdevice/kmsgrab.c b/libavdevice/kmsgrab.c index 47ba15ca07..3e89c3f445 100644 --- a/libavdevice/kmsgrab.c +++ b/libavdevice/kmsgrab.c @@ -27,6 +27,11 @@ #include #include +// Required for compatibility when building against libdrm < 2.4.83. +#ifndef DRM_FORMAT_MOD_INVALID +#define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1) +#endif + #include "libavutil/hwcontext.h" #include "libavutil/hwcontext_drm.h" #include "libavutil/internal.h" @@ -45,6 +50,7 @@ typedef struct KMSGrabContext { AVBufferRef *device_ref; AVHWDeviceContext *device; AVDRMDeviceContext *hwctx; + int fb2_available; AVBufferRef *frames_ref; AVHWFramesContext *frames; @@ -68,8 +74,10 @@ typedef struct KMSGrabContext { static void kmsgrab_free_desc(void *opaque, uint8_t *data) { AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor*)data; + int i; - close(desc->objects[0].fd); + for (i = 0; i < desc->nb_objects; i++) + close(desc->objects[i].fd); av_free(desc); } @@ -142,6 +150,114 @@ fail: return err; } +#if HAVE_LIBDRM_GETFB2 +static int kmsgrab_get_fb2(AVFormatContext *avctx, + drmModePlane *plane, + AVDRMFrameDescriptor *desc) +{ + KMSGrabContext *ctx = avctx->priv_data; + drmModeFB2 *fb; + int err, i, nb_objects; + + fb = drmModeGetFB2(ctx->hwctx->fd, plane->fb_id); + if (!fb) { + av_log(avctx, AV_LOG_ERROR, "Failed to get framebuffer " + "%"PRIu32".\n", plane->fb_id); + return AVERROR(EIO); + } + if (fb->pixel_format != ctx->drm_format) { + av_log(avctx, AV_LOG_ERROR, "Plane %"PRIu32" framebuffer " + "format changed: now %"PRIx32".\n", + ctx->plane_id, fb->pixel_format); + err = AVERROR(EIO); + goto fail; + } + if (fb->modifier != ctx->drm_format_modifier) { + av_log(avctx, AV_LOG_ERROR, "Plane %"PRIu32" framebuffer " + "format modifier changed: now %"PRIx64".\n", + ctx->plane_id, fb->modifier); + err = AVERROR(EIO); + goto fail; + } + if (fb->width != ctx->width || fb->height != ctx->height) { + av_log(avctx, AV_LOG_ERROR, "Plane %"PRIu32" framebuffer " + "dimensions changed: now %"PRIu32"x%"PRIu32".\n", + ctx->plane_id, fb->width, fb->height); + err = AVERROR(EIO); + goto fail; + } + if (!fb->handles[0]) { + av_log(avctx, AV_LOG_ERROR, "No handle set on framebuffer.\n"); + err = AVERROR(EIO); + goto fail; + } + + *desc = (AVDRMFrameDescriptor) { + .nb_layers = 1, + .layers[0] = { + .format = ctx->drm_format, + }, + }; + + nb_objects = 0; + for (i = 0; i < 4 && fb->handles[i]; i++) { + size_t size; + int dup = 0, j, obj; + + size = fb->offsets[i] + fb->height * fb->pitches[i]; + + for (j = 0; j < i; j++) { + if (fb->handles[i] == fb->handles[j]) { + dup = 1; + break; + } + } + if (dup) { + obj = desc->layers[0].planes[j].object_index; + + if (desc->objects[j].size < size) + desc->objects[j].size = size; + + desc->layers[0].planes[i] = (AVDRMPlaneDescriptor) { + .object_index = obj, + .offset = fb->offsets[i], + .pitch = fb->pitches[i], + }; + + } else { + int fd; + err = drmPrimeHandleToFD(ctx->hwctx->fd, fb->handles[i], + O_RDONLY, &fd); + if (err < 0) { + err = AVERROR(errno); + av_log(avctx, AV_LOG_ERROR, "Failed to get PRIME fd from " + "framebuffer handle: %s.\n", strerror(errno)); + goto fail; + } + + obj = nb_objects++; + desc->objects[obj] = (AVDRMObjectDescriptor) { + .fd = fd, + .size = size, + .format_modifier = fb->modifier, + }; + desc->layers[0].planes[i] = (AVDRMPlaneDescriptor) { + .object_index = obj, + .offset = fb->offsets[i], + .pitch = fb->pitches[i], + }; + } + } + desc->nb_objects = nb_objects; + desc->layers[0].nb_planes = i; + + err = 0; +fail: + drmModeFreeFB2(fb); + return err; +} +#endif + static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) { KMSGrabContext *ctx = avctx->priv_data; @@ -184,7 +300,12 @@ static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) goto fail; } - err = kmsgrab_get_fb(avctx, plane, desc); +#if HAVE_LIBDRM_GETFB2 + if (ctx->fb2_available) + err = kmsgrab_get_fb2(avctx, plane, desc); + else +#endif + err = kmsgrab_get_fb(avctx, plane, desc); if (err < 0) goto fail; @@ -278,6 +399,9 @@ static av_cold int kmsgrab_read_header(AVFormatContext *avctx) drmModePlaneRes *plane_res = NULL; drmModePlane *plane = NULL; drmModeFB *fb = NULL; +#if HAVE_LIBDRM_GETFB2 + drmModeFB2 *fb2 = NULL; +#endif AVStream *stream; int err, i; @@ -379,28 +503,78 @@ static av_cold int kmsgrab_read_header(AVFormatContext *avctx) ctx->plane_id = plane->plane_id; - fb = drmModeGetFB(ctx->hwctx->fd, plane->fb_id); - if (!fb) { - err = errno; +#if HAVE_LIBDRM_GETFB2 + fb2 = drmModeGetFB2(ctx->hwctx->fd, plane->fb_id); + if (!fb2 && errno == ENOSYS) { + av_log(avctx, AV_LOG_INFO, "GETFB2 not supported, " + "will try to use GETFB instead.\n"); + } else if (!fb2) { + err = AVERROR(err); av_log(avctx, AV_LOG_ERROR, "Failed to get " "framebuffer %"PRIu32": %s.\n", - plane->fb_id, strerror(err)); - err = AVERROR(err); + plane->fb_id, strerror(errno)); goto fail; + } else { + av_log(avctx, AV_LOG_INFO, "Template framebuffer is " + "%"PRIu32": %"PRIu32"x%"PRIu32" " + "format %"PRIx32" modifier %"PRIx64" flags %"PRIx32".\n", + fb2->fb_id, fb2->width, fb2->height, + fb2->pixel_format, fb2->modifier, fb2->flags); + + ctx->width = fb2->width; + ctx->height = fb2->height; + + if (!fb2->handles[0]) { + av_log(avctx, AV_LOG_ERROR, "No handle set on framebuffer: " + "maybe you need some additional capabilities?\n"); + err = AVERROR(EINVAL); + goto fail; + } + if (ctx->drm_format != fb2->pixel_format) { + av_log(avctx, AV_LOG_ERROR, "Framebuffer pixel format " + "%"PRIx32" does not match expected format.\n", + fb2->pixel_format); + err = AVERROR(EINVAL); + goto fail; + } + if (ctx->drm_format_modifier != DRM_FORMAT_MOD_INVALID && + ctx->drm_format_modifier != fb2->modifier) { + av_log(avctx, AV_LOG_ERROR, "Framebuffer format modifier " + "%"PRIx64" does not match expected modifier.\n", + fb2->modifier); + err = AVERROR(EINVAL); + goto fail; + } else { + ctx->drm_format_modifier = fb2->modifier; + } + ctx->fb2_available = 1; } +#endif - av_log(avctx, AV_LOG_INFO, "Template framebuffer is %"PRIu32": " - "%"PRIu32"x%"PRIu32" %"PRIu32"bpp %"PRIu32"b depth.\n", - fb->fb_id, fb->width, fb->height, fb->bpp, fb->depth); + if (!ctx->fb2_available) { + fb = drmModeGetFB(ctx->hwctx->fd, plane->fb_id); + if (!fb) { + err = errno; + av_log(avctx, AV_LOG_ERROR, "Failed to get " + "framebuffer %"PRIu32": %s.\n", + plane->fb_id, strerror(err)); + err = AVERROR(err); + goto fail; + } - ctx->width = fb->width; - ctx->height = fb->height; + av_log(avctx, AV_LOG_INFO, "Template framebuffer is %"PRIu32": " + "%"PRIu32"x%"PRIu32" %"PRIu32"bpp %"PRIu32"b depth.\n", + fb->fb_id, fb->width, fb->height, fb->bpp, fb->depth); - if (!fb->handle) { - av_log(avctx, AV_LOG_ERROR, "No handle set on framebuffer: " - "maybe you need some additional capabilities?\n"); - err = AVERROR(EINVAL); - goto fail; + ctx->width = fb->width; + ctx->height = fb->height; + + if (!fb->handle) { + av_log(avctx, AV_LOG_ERROR, "No handle set on framebuffer: " + "maybe you need some additional capabilities?\n"); + err = AVERROR(EINVAL); + goto fail; + } } stream = avformat_new_stream(avctx, NULL); @@ -411,8 +585,8 @@ static av_cold int kmsgrab_read_header(AVFormatContext *avctx) stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; stream->codecpar->codec_id = AV_CODEC_ID_WRAPPED_AVFRAME; - stream->codecpar->width = fb->width; - stream->codecpar->height = fb->height; + stream->codecpar->width = ctx->width; + stream->codecpar->height = ctx->height; stream->codecpar->format = AV_PIX_FMT_DRM_PRIME; avpriv_set_pts_info(stream, 64, 1, 1000000); @@ -426,8 +600,8 @@ static av_cold int kmsgrab_read_header(AVFormatContext *avctx) ctx->frames->format = AV_PIX_FMT_DRM_PRIME; ctx->frames->sw_format = ctx->format, - ctx->frames->width = fb->width; - ctx->frames->height = fb->height; + ctx->frames->width = ctx->width; + ctx->frames->height = ctx->height; err = av_hwframe_ctx_init(ctx->frames_ref); if (err < 0) { @@ -444,6 +618,9 @@ fail: drmModeFreePlaneResources(plane_res); drmModeFreePlane(plane); drmModeFreeFB(fb); +#if HAVE_LIBDRM_GETFB2 + drmModeFreeFB2(fb2); +#endif return err; } @@ -468,7 +645,7 @@ static const AVOption options[] = { { .i64 = AV_PIX_FMT_BGR0 }, 0, UINT32_MAX, FLAGS }, { "format_modifier", "DRM format modifier for framebuffer", OFFSET(drm_format_modifier), AV_OPT_TYPE_INT64, - { .i64 = DRM_FORMAT_MOD_NONE }, 0, INT64_MAX, FLAGS }, + { .i64 = DRM_FORMAT_MOD_INVALID }, 0, INT64_MAX, FLAGS }, { "crtc_id", "CRTC ID to define capture source", OFFSET(source_crtc), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, UINT32_MAX, FLAGS }, From patchwork Sun Jul 5 15:49:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 20824 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 4D35644A07F for ; Sun, 5 Jul 2020 18:59:47 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 261C868A08F; Sun, 5 Jul 2020 18:59:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BA379689AA2 for ; Sun, 5 Jul 2020 18:59:40 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id q15so36590686wmj.2 for ; Sun, 05 Jul 2020 08:59:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=5WZ26NJG7ULGm09+EL/y5K4Z//WSC7ajz/fjU3uDpVQ=; b=YszhVBvIfulbYAE5XzcUNxS5JIIQ5UqyPe77bxlmoV6j79ezZ09phDuIRIwAYqqLU3 pOk/TuHJ7Bg9/E8V8nGnTAo4Xz+YJhuBbj/eFcrSYeS0lEPBbfQZJY/UsQpYnV6sgDrz EhUsX6kJMaXFKn7AU8PDzrOVKTbDQBkaJsLF8/oazUn0Ulm1II5yEIk8cINGtCUBWh1r Bmqfccct2s5RROmKRW2WgsSBxNjqGr+aBo6bJOQvwK4y7VaCn0yqs1XsFcbq4CGN8SpJ CfnVvjo21a/NyHfZsj7JeMKARgRxQtQlYzYt1dXy5NqcgGbFEydFCQxgcfXcC/87fhjw dKLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=5WZ26NJG7ULGm09+EL/y5K4Z//WSC7ajz/fjU3uDpVQ=; b=jdRGDXiRzFhBTcp1kva01Srgy/qoabONu92jgyr+hSW9x8BVso6Q56yWEWmzcU5zHL /YK/gOjYkUcoPI+xcmXWwidVjk4+F/uAOHmSzIF8Zg9z0KcOjNI6o8djxa2EI+x8QOgc 5tObbJq9XUgYS8n/TC8e/9ilzIDT6e0o2Ua1GeEERl1VMMN7AkireLy4Fy6zwELMJEoz 6Z4t2XEkwVuAW1wnw5DMcUR8CUMopcBMV8IWuEV0G0rTMVEpNloTPR6Aw+hstQwgniFJ P5P88t5qSm6IqOIaACooPS8DUXreGwOOa7xVeKn3XCRyvAZO3TMYgu9X24xL0ml3d5b3 ZF6w== X-Gm-Message-State: AOAM531TZu5V6dP6FXxYipd+Qq3XmPlvYFCiENWEIC/GM0RkFxyJ6ym+ s8itI51Y1SjxyNQ14vzD1JqBLAyusQo= X-Google-Smtp-Source: ABdhPJy+756bi4GZDKAumzHkRg2+JX+XYK22pkcU9CGomHoIFitWBePdGJJbI/XuD2LmEw/YzcT64g== X-Received: by 2002:a05:600c:c1:: with SMTP id u1mr46372862wmm.48.1593964319559; Sun, 05 Jul 2020 08:51:59 -0700 (PDT) Received: from localhost.localdomain (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id j4sm16070985wrp.51.2020.07.05.08.51.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Jul 2020 08:51:59 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Jul 2020 16:49:45 +0100 Message-Id: <20200705154946.401280-3-sw@jkqxz.net> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200705154946.401280-1-sw@jkqxz.net> References: <20200705154946.401280-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/4] kmsgrab: Don't require the user to set framebuffer format X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This is provided by GetFB2, but we still need the option for cases where that isn't available. --- libavdevice/kmsgrab.c | 55 +++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/libavdevice/kmsgrab.c b/libavdevice/kmsgrab.c index 3e89c3f445..b859f202aa 100644 --- a/libavdevice/kmsgrab.c +++ b/libavdevice/kmsgrab.c @@ -405,18 +405,6 @@ static av_cold int kmsgrab_read_header(AVFormatContext *avctx) AVStream *stream; int err, i; - for (i = 0; i < FF_ARRAY_ELEMS(kmsgrab_formats); i++) { - if (kmsgrab_formats[i].pixfmt == ctx->format) { - ctx->drm_format = kmsgrab_formats[i].drm_format; - break; - } - } - if (i >= FF_ARRAY_ELEMS(kmsgrab_formats)) { - av_log(avctx, AV_LOG_ERROR, "Unsupported format %s.\n", - av_get_pix_fmt_name(ctx->format)); - return AVERROR(EINVAL); - } - err = av_hwdevice_ctx_create(&ctx->device_ref, AV_HWDEVICE_TYPE_DRM, ctx->device_path, NULL, 0); if (err < 0) { @@ -530,9 +518,25 @@ static av_cold int kmsgrab_read_header(AVFormatContext *avctx) err = AVERROR(EINVAL); goto fail; } - if (ctx->drm_format != fb2->pixel_format) { + + for (i = 0; i < FF_ARRAY_ELEMS(kmsgrab_formats); i++) { + if (kmsgrab_formats[i].drm_format == fb2->pixel_format) { + if (ctx->format != AV_PIX_FMT_NONE && + ctx->format != kmsgrab_formats[i].pixfmt) { + av_log(avctx, AV_LOG_ERROR, "Framebuffer pixel format " + "%"PRIx32" does not match expected format.\n", + fb2->pixel_format); + err = AVERROR(EINVAL); + goto fail; + } + ctx->drm_format = fb2->pixel_format; + ctx->format = kmsgrab_formats[i].pixfmt; + break; + } + } + if (i == FF_ARRAY_ELEMS(kmsgrab_formats)) { av_log(avctx, AV_LOG_ERROR, "Framebuffer pixel format " - "%"PRIx32" does not match expected format.\n", + "%"PRIx32" is not a known supported format.\n", fb2->pixel_format); err = AVERROR(EINVAL); goto fail; @@ -547,11 +551,32 @@ static av_cold int kmsgrab_read_header(AVFormatContext *avctx) } else { ctx->drm_format_modifier = fb2->modifier; } + av_log(avctx, AV_LOG_VERBOSE, "Format is %s, from " + "DRM format %"PRIx32" modifier %"PRIx64".\n", + av_get_pix_fmt_name(ctx->format), + ctx->drm_format, ctx->drm_format_modifier); + ctx->fb2_available = 1; } #endif if (!ctx->fb2_available) { + if (ctx->format == AV_PIX_FMT_NONE) { + // Backward compatibility: assume BGR0 if no format supplied. + ctx->format = AV_PIX_FMT_BGR0; + } + for (i = 0; i < FF_ARRAY_ELEMS(kmsgrab_formats); i++) { + if (kmsgrab_formats[i].pixfmt == ctx->format) { + ctx->drm_format = kmsgrab_formats[i].drm_format; + break; + } + } + if (i >= FF_ARRAY_ELEMS(kmsgrab_formats)) { + av_log(avctx, AV_LOG_ERROR, "Unsupported format %s.\n", + av_get_pix_fmt_name(ctx->format)); + return AVERROR(EINVAL); + } + fb = drmModeGetFB(ctx->hwctx->fd, plane->fb_id); if (!fb) { err = errno; @@ -642,7 +667,7 @@ static const AVOption options[] = { { .str = "/dev/dri/card0" }, 0, 0, FLAGS }, { "format", "Pixel format for framebuffer", OFFSET(format), AV_OPT_TYPE_PIXEL_FMT, - { .i64 = AV_PIX_FMT_BGR0 }, 0, UINT32_MAX, FLAGS }, + { .i64 = AV_PIX_FMT_NONE }, -1, INT32_MAX, FLAGS }, { "format_modifier", "DRM format modifier for framebuffer", OFFSET(drm_format_modifier), AV_OPT_TYPE_INT64, { .i64 = DRM_FORMAT_MOD_INVALID }, 0, INT64_MAX, FLAGS }, From patchwork Sun Jul 5 15:49:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 20823 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 34E1644BC3D for ; Sun, 5 Jul 2020 18:52:08 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 169B0689AA2; Sun, 5 Jul 2020 18:52:08 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 24C5A688344 for ; Sun, 5 Jul 2020 18:52:01 +0300 (EEST) Received: by mail-wr1-f49.google.com with SMTP id r12so38056075wrj.13 for ; Sun, 05 Jul 2020 08:52:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=MyUDtj0zkDD1UCwtiJ44eIP/IwZ0W08+Jui34R9OCIk=; b=As897PEi16Tg0T0PfD22NLYQQhX9EYew11kQbD/NDhgqV+1Q9f0ZaCgsFtj3AKu5kn GLcRGMRZ24gCY9yJjB+YuajoVeKZEPa0gN7DdHnqWc3k4SHddF3tmudPKgmebkrN+wbx CquWXmk/Q6ys9tu8Z5wXF7THnQ4UiqmHCB0Z/P4FEsdD1Wtm/dzCkI6YjDgvPAYCJHtb F70DuNsgNZzVH5oIeuTLzUk9m/IfxinnbJKdJJOgoDGKolZmE6IyRvE5cjmInc/rH3Q7 bbQHlcWeqniTIGo+lXJKkNfnYv5mdUrifBZ24qx9cM9HR0WanzWKhPNiDeCqDnoxwVfR ZyBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=MyUDtj0zkDD1UCwtiJ44eIP/IwZ0W08+Jui34R9OCIk=; b=CJIIakIeZEwFRQ0/r6rg38rjw2Z0dRlFRwoZgDWvE0FPdx60uHckEFnB9tNw2llgU4 o5LUZ6B7olA/ZUGzWMClD8/Jj9b5JlKxitl9BxyS4fdCShSHpuDkd8dpFqjvP3Lt4WvK yi7RKMgN19jFU7IPcqaVmrXmCl/mLvoVam3cDEBp2QxRgKh4IvjvtL7jEyS967VM1ASq 6mim1Tyzi+DrmWr4UvtEd7KMIQkJAuUo2qAJUO4uXT1B96m77UdGgjyw5boIA3GvDyK5 H5/+x8RioNVJCx7QMaXSJYv6dl2WQiv64Sc/UdaRcQUTf6f98bymjm0mrvj28etmBo18 Nglw== X-Gm-Message-State: AOAM533PpFZV53znTMA3L/2DyBygW0CthJz248wVOJb44Paf1G96Bq8a CijelZxfbxvXh5LN8ninoaYgREj4cGM= X-Google-Smtp-Source: ABdhPJyd20Y+ow4dNB49RZMlXJ9FoUB1S8gAnsbgtYpHDe4Qs5zTW7z9JEYqJIkAOF/8eQJbL4s6jg== X-Received: by 2002:adf:fa81:: with SMTP id h1mr45205709wrr.266.1593964320360; Sun, 05 Jul 2020 08:52:00 -0700 (PDT) Received: from localhost.localdomain (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id j4sm16070985wrp.51.2020.07.05.08.51.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Jul 2020 08:51:59 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 5 Jul 2020 16:49:46 +0100 Message-Id: <20200705154946.401280-4-sw@jkqxz.net> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200705154946.401280-1-sw@jkqxz.net> References: <20200705154946.401280-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/4] doc/indevs: Note improved behaviour of kmsgrab with Linux 5.7 X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- doc/indevs.texi | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/indevs.texi b/doc/indevs.texi index 0f33fc66d8..4d2312e201 100644 --- a/doc/indevs.texi +++ b/doc/indevs.texi @@ -889,11 +889,15 @@ If you don't understand what all of that means, you probably don't want this. L DRM device to capture on. Defaults to @option{/dev/dri/card0}. @item format -Pixel format of the framebuffer. Defaults to @option{bgr0}. +Pixel format of the framebuffer. This can be autodetected if you are running Linux 5.7 +or later, but needs to be provided for earlier versions. Defaults to @option{bgr0}, +which is the most common format used by the Linux console and Xorg X server. @item format_modifier Format modifier to signal on output frames. This is necessary to import correctly into -some APIs, but can't be autodetected. See the libdrm documentation for possible values. +some APIs. It can be autodetected if you are running Linux 5.7 or later, but will need +to be provided explicitly when needed in earlier versions. See the libdrm documentation +for possible values. @item crtc_id KMS CRTC ID to define the capture source. The first active plane on the given CRTC From patchwork Sat Aug 1 17:57:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 21440 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 1B8A344ADBC for ; Sat, 1 Aug 2020 20:57:44 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E5BF868BB01; Sat, 1 Aug 2020 20:57:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CCAAB68BAFF for ; Sat, 1 Aug 2020 20:57:37 +0300 (EEST) Received: by mail-wm1-f66.google.com with SMTP id k8so11961352wma.2 for ; Sat, 01 Aug 2020 10:57:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=subject:from:to:references:message-id:date:user-agent:mime-version :in-reply-to:content-language:content-transfer-encoding; bh=UhbQwkC8hm7QlrurIsQngjhBuyFimE252sC+niOCmUw=; b=W/o5uKunLP4vNVUyUeTbEL+WpcNcW0U057ehsZudVD/U/aVK9F64Gxj2yMDNa6swmQ mQO2aKwpWZPNNSm0HiRUjg04fr/i3Vfhg14jh/774td9R7Eis4AMk1WA23nv/fWOZBSq xpcKdGxVG5rbwlgX/XFqjiLmJNQfCq1oKIffGGNWu9f8UxfraapfjKIeqFxRtjOdjVwU Yz0JnEDLvAP4AjnDas9AfgnLh6txFOQgJ4bXifdP2HuagGlQY84Kf+BapmvM1yc8mRVD iYBb94PoUIZ3GEKoW0o9cgztgGmYx8FJL5JSFshEg6emuX8mjRULCZunhtcp+dxcLY1i U6rA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=UhbQwkC8hm7QlrurIsQngjhBuyFimE252sC+niOCmUw=; b=RoLbWwNlCf2y8W/DQeG/6sWoqVVS1kDZbKl9+tazMDGz+7u9SFh9PikS98AVGUbnvb ja+vXzt/v3l1FPeoLQzPx8Zw4xO3UR38mJGLvY6uS0vg4XTsTkCzqxEEJDbD+kCdhWsX DblipzUcXVm1u0skESq9E2Voda2jORBIiEVbJJIlBj/cTkjtc4yzZcjqmotk5ici7UHn VkZE+eYmRfMRHqR+9rQjRyVtrqCA3LovMZiuqt8h/bhjFZpP1GhLUq45UCw6unWRvjEn EvalSH0swHeAw7SehL2/t/LoVihhMdNbFzH3PQFWuQfYi8jojNLcLWh8PgpqSKKjAGTw nf5g== X-Gm-Message-State: AOAM530mvg8NL19Yev7rtnE80yoISJicOGsbg6K0f2jNYgEy44xiTw6C hCvdZvIxKYtWKntnvdzBAjeOUCPz4Ss= X-Google-Smtp-Source: ABdhPJzgFlw9Ykm/9RnW+uXut34Wnup3ou0KFEF/WDDIEKrgwLBchSzuSf6cY+ariXZifwjeEDEMpA== X-Received: by 2002:a1c:32c3:: with SMTP id y186mr8631922wmy.15.1596304657015; Sat, 01 Aug 2020 10:57:37 -0700 (PDT) Received: from [192.168.0.3] (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id 32sm20263402wrh.18.2020.08.01.10.57.36 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 01 Aug 2020 10:57:36 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org References: <20200705154946.401280-1-sw@jkqxz.net> Message-ID: Date: Sat, 1 Aug 2020 18:57:35 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0 MIME-Version: 1.0 In-Reply-To: <20200705154946.401280-1-sw@jkqxz.net> Content-Language: en-US Subject: [FFmpeg-devel] [PATCH 5/5] kmsgrab: Add more supported formats X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X2RGB10 tested on both Intel Gen9 and AMD Polaris 11. NV12 tested on Intel Gen9 only - since it has multiple planes, this requires GetFB2. Also add some comments to split the list up a bit. --- libavdevice/kmsgrab.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libavdevice/kmsgrab.c b/libavdevice/kmsgrab.c index b859f202aa..59c3358f5f 100644 --- a/libavdevice/kmsgrab.c +++ b/libavdevice/kmsgrab.c @@ -362,6 +362,7 @@ static const struct { enum AVPixelFormat pixfmt; uint32_t drm_format; } kmsgrab_formats[] = { + // Monochrome. #ifdef DRM_FORMAT_R8 { AV_PIX_FMT_GRAY8, DRM_FORMAT_R8 }, #endif @@ -369,6 +370,7 @@ static const struct { { AV_PIX_FMT_GRAY16LE, DRM_FORMAT_R16 }, { AV_PIX_FMT_GRAY16BE, DRM_FORMAT_R16 | DRM_FORMAT_BIG_ENDIAN }, #endif + // <8-bit RGB. { AV_PIX_FMT_BGR8, DRM_FORMAT_BGR233 }, { AV_PIX_FMT_RGB555LE, DRM_FORMAT_XRGB1555 }, { AV_PIX_FMT_RGB555BE, DRM_FORMAT_XRGB1555 | DRM_FORMAT_BIG_ENDIAN }, @@ -378,6 +380,7 @@ static const struct { { AV_PIX_FMT_RGB565BE, DRM_FORMAT_RGB565 | DRM_FORMAT_BIG_ENDIAN }, { AV_PIX_FMT_BGR565LE, DRM_FORMAT_BGR565 }, { AV_PIX_FMT_BGR565BE, DRM_FORMAT_BGR565 | DRM_FORMAT_BIG_ENDIAN }, + // 8-bit RGB. { AV_PIX_FMT_RGB24, DRM_FORMAT_RGB888 }, { AV_PIX_FMT_BGR24, DRM_FORMAT_BGR888 }, { AV_PIX_FMT_0RGB, DRM_FORMAT_BGRX8888 }, @@ -388,6 +391,12 @@ static const struct { { AV_PIX_FMT_ABGR, DRM_FORMAT_RGBA8888 }, { AV_PIX_FMT_RGBA, DRM_FORMAT_ABGR8888 }, { AV_PIX_FMT_BGRA, DRM_FORMAT_ARGB8888 }, + // 10-bit RGB. + { AV_PIX_FMT_X2RGB10LE, DRM_FORMAT_XRGB2101010 }, + { AV_PIX_FMT_X2RGB10BE, DRM_FORMAT_XRGB2101010 | DRM_FORMAT_BIG_ENDIAN }, + // 8-bit YUV 4:2:0. + { AV_PIX_FMT_NV12, DRM_FORMAT_NV12 }, + // 8-bit YUV 4:2:2. { AV_PIX_FMT_YUYV422, DRM_FORMAT_YUYV }, { AV_PIX_FMT_YVYU422, DRM_FORMAT_YVYU }, { AV_PIX_FMT_UYVY422, DRM_FORMAT_UYVY },