From patchwork Sat Jul 4 13:17:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: hanishkvc X-Patchwork-Id: 20799 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 ED1654498AB for ; Sat, 4 Jul 2020 16:19:17 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D3A9F68B4C3; Sat, 4 Jul 2020 16:19:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9E62868B414 for ; Sat, 4 Jul 2020 16:19:10 +0300 (EEST) Received: by mail-pj1-f52.google.com with SMTP id k5so5513568pjg.3 for ; Sat, 04 Jul 2020 06:19:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=X73mpZPOht/b+HX0SbCvXAXfylNaVU4HacnUBXFPbvk=; b=OT5IrAsHKB+dlgrz4grHq/xzIp0G8dbKu6NbeWMlhWU7qKjtZcOpVy8pP4/8u4ukJh YRGTEDXJ5uNTtmccqLisvrb2c8l3EbzYfypYyKPxV/tqTrYkkJABzmr2saJ6RqBrERqK qr4f4kYuuMKHxyBc6wojRHh4iICXhvc76TwnrCqRfMU6wZG7OfBUhRbLORegrmSqCGt5 1+WbfSSfg/3Sd6NsxS11d/C4roG/TNF5qQmFvAMVwvnn5+QomqpMGGTMjE0hLye8juWg XnC8fP4JnCS7U8x9gNnrtv/RyHAbPY+g70co2jC5n6h8Rvdc4LKAKD6cv+psjWDP+bjt S49A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=X73mpZPOht/b+HX0SbCvXAXfylNaVU4HacnUBXFPbvk=; b=sqlNgnBmPUtafpiw727xuS44yinNuXk1OSPFpyrL3bRVomeZhasC5WGXvuAgnJN6SQ +BZlCSR0MDRzeQdnkicpgeJ3CPuSXRrY+c57ZHjwUyArlBQoBvFVTMpm7YRipQqRtY4Y d7Q1PRqGIB8eZ1AtdeOuIHWmZCOSZZHjw/aUsfdRttUAF237hjD860RQ+/E19DylkJSq xL/IUe16E9eD1LIpF6BJZHHONzX3UstG1+TZs0O4jp9gJfiYAN+/2ZqO0Spg9PWVYMOa wIQTvyUQLoFnuzc7x24FYm88qw06DzPEGm+JR4QLCUWWZaZBZ3Z6r5pMvxpi6KU+e234 Kk2A== X-Gm-Message-State: AOAM532Dy0X68CXwknRwB5rOZx1iA3ExWmicHoKwSJPg6aNigQvOycA4 NzMKMrsEg8DivD53dP15mKPl4Djs X-Google-Smtp-Source: ABdhPJw+xFXevpdlf2hJjK68NfFEInRgghfA0pIdAvOEjQVuKH99cGSLR0S1j1IhTYoMx8t3KvNsCg== X-Received: by 2002:a17:902:c206:: with SMTP id 6mr11883711pll.30.1593868748525; Sat, 04 Jul 2020 06:19:08 -0700 (PDT) Received: from localhost.localdomain ([122.179.70.80]) by smtp.gmail.com with ESMTPSA id b191sm14657507pga.13.2020.07.04.06.19.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 04 Jul 2020 06:19:07 -0700 (PDT) From: hanishkvc To: ffmpeg-devel@ffmpeg.org Date: Sat, 4 Jul 2020 18:47:15 +0530 Message-Id: <20200704131717.49428-4-hanishkvc@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200704131717.49428-1-hanishkvc@gmail.com> References: <20200704131717.49428-1-hanishkvc@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v06 3/5] hwcontext_drm detile non linear layout, if possible 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 Cc: hanishkvc Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" If the framebuffer is a tiled layout, use the fbtile helper routines to try and detile it into linear layout, if supported by fbtile. It uses the format_modifier associated with the framebuffer to decide whether to apply detiling or not and inturn which specific detiling to apply. If user is using kmsgrab, they will have to use -format_modifer option of kmsgrab to force a specific detile logic, in case they dont want to use the original format_modifier related detiling. Or they could even use -format_modifier 0 to make hwcontext_drm bypass this detiling. --- Changelog | 1 + libavutil/hwcontext_drm.c | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Changelog b/Changelog index 3881587caa..b6a4ad1b34 100644 --- a/Changelog +++ b/Changelog @@ -2,6 +2,7 @@ Entries are sorted chronologically from oldest to youngest within each release, releases are sorted from youngest to oldest. version : +- hwcontext_drm detiles non linear layouts, if possible - kmsgrab GetFB2 format_modifier, if user doesnt specify - AudioToolbox output device - MacCaption demuxer diff --git a/libavutil/hwcontext_drm.c b/libavutil/hwcontext_drm.c index 32cbde82eb..bd74b3f13d 100644 --- a/libavutil/hwcontext_drm.c +++ b/libavutil/hwcontext_drm.c @@ -21,6 +21,7 @@ #include #include +#include #include #include "avassert.h" @@ -28,6 +29,7 @@ #include "hwcontext_drm.h" #include "hwcontext_internal.h" #include "imgutils.h" +#include "fbtile.h" static void drm_device_free(AVHWDeviceContext *hwdev) @@ -185,6 +187,32 @@ static int drm_transfer_get_formats(AVHWFramesContext *ctx, return 0; } +// Can be overridden during compiling, if required. +#ifndef HWCTXDRM_SYNCRELATED_FORMATMODIFIER +#define HWCTXDRM_SYNCRELATED_FORMATMODIFIER 1 +#endif +static int drm_transfer_with_detile(const AVFrame *hwAVFrame, AVFrame *dst, const AVFrame *src) +{ + int err = 0; + + if (hwAVFrame->format == AV_PIX_FMT_DRM_PRIME) { + AVDRMFrameDescriptor *drmFrame = (AVDRMFrameDescriptor*)hwAVFrame->data[0]; + uint64_t formatModifier = drmFrame->objects[0].format_modifier; + if (formatModifier != DRM_FORMAT_MOD_LINEAR) { + err = detile_this(TILE_AUTO, formatModifier, dst->width, dst->height, + dst->data[0], dst->linesize[0], + src->data[0], src->linesize[0], 4); + if (!err) { +#if HWCTXDRM_SYNCRELATED_FORMATMODIFIER + drmFrame->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; +#endif + return 0; + } + } + } + return av_frame_copy(dst, src); +} + static int drm_transfer_data_from(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src) { @@ -206,7 +234,7 @@ static int drm_transfer_data_from(AVHWFramesContext *hwfc, map->width = dst->width; map->height = dst->height; - err = av_frame_copy(dst, map); + err = drm_transfer_with_detile(src, dst, map); if (err) goto fail; @@ -238,7 +266,7 @@ static int drm_transfer_data_to(AVHWFramesContext *hwfc, map->width = src->width; map->height = src->height; - err = av_frame_copy(map, src); + err = drm_transfer_with_detile(dst, map, src); if (err) goto fail;