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 },