From patchwork Sun Oct 8 15:11:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 5458 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.90 with SMTP id m26csp1688427jah; Sun, 8 Oct 2017 08:18:47 -0700 (PDT) X-Received: by 10.223.132.6 with SMTP id 6mr6817572wrf.93.1507475927212; Sun, 08 Oct 2017 08:18:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1507475927; cv=none; d=google.com; s=arc-20160816; b=IMXSM3Xk1slcRkNRp7YJl+7mkKDxUDymnePrwfyZunWLyrH4tC65pObILP/mkO4MZb ukbAd+PuvE988bB7baM3f9tINnwgHSTy/g1PQOgZiLqWS3nYnRTdU578Uhm3RiLJ1VUR IonCYjQltdU3gonfHiblwX15BpLZhXyyVp7/IQEh4fYWb15G9JMos5SzateCbCZDCvud 7K5dZ+23K4DHUX4bP38ERyMftFgRzazYh0b9bEKg2A40d0/AYpfuS+1jFdlDMCplVvtc +uyZtBtbAggDZ4xzGdzI9h2pMqOe5gJavuhDTCW0QXFVsqagYUOOLalwt/l4PyTFMLdG +0nA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=T2OvEPfEHlGR0TNuZUuB0XAADsICquHEg7+09hGntv0=; b=utezMchn1DVLT6ILya+pyDxxPVfYIWtGTIk5INh4TF8jISv1qWdpbPMdg6H8myNyQH F49mzo/8mYK3at1MwFQjVhDQbYW6XIGMP9jy3qpP+3puCOR545282oA//lKQYFm+y7Qs YGFMY6fm5thAQFKEUITO/JvMgnLqnZIOCFIm/vOS8EqmaYv//++ht90gi8iVjWcMGc9X aAT2PqLwanPAzJnG4WKyu8CNPn6GYtZfUqV+0xck7RbzR4gEibJn1qhOpdeUu7gOwQxI UJRLnUVcli/mBpDIGhDhxfTvc5f442Muu3UoXBgd7pUIrhe0oegoDVdweyDo0SUp4QLX lyMg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@jkqxz-net.20150623.gappssmtp.com header.s=20150623 header.b=tYddmB5S; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 33si5489331wrb.357.2017.10.08.08.18.46; Sun, 08 Oct 2017 08:18:47 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@jkqxz-net.20150623.gappssmtp.com header.s=20150623 header.b=tYddmB5S; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A089B689E0B; Sun, 8 Oct 2017 18:18:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f54.google.com (mail-wm0-f54.google.com [74.125.82.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0A65F689E04 for ; Sun, 8 Oct 2017 18:18:36 +0300 (EEST) Received: by mail-wm0-f54.google.com with SMTP id m72so16774908wmc.1 for ; Sun, 08 Oct 2017 08:18:37 -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; bh=HA/BH5l0S3TBzbpzV1/t/fK1AlLiPYHF+hbPKKvl2vQ=; b=tYddmB5SEpTzjxXphi36n/cCYBwaQfg9w0Cz6pfBMjc1EsQcEOog1GTHXzvtFxFbOR 7kbFcUA2alEk1BGRLiMeR5xHix4NRzD2Q1Urf3ZCAbs5NfgGFd2M0mtwUk++UDTVnc5/ On7GfyOGZE80RCc/lHNpctDVPvtUSxtnFE7gjdNWwtSScNszI8RUZkRcTEys/oDTci3x hklOvETtNL9OUuDNDGjyQ2e3AOB4IK2Lo4YmjkOO3VAYp61FQD3/Z5AZtowWCoF9F/RZ dA1N3eawvbxj6DUQi/of1ET3ecJvkeAms7+GGrdz8Vb7f/fVQ7DjSQUmOc4T/4mapbOh Jucg== 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; bh=HA/BH5l0S3TBzbpzV1/t/fK1AlLiPYHF+hbPKKvl2vQ=; b=VPCVIqspz5/DtcLCMVSdnQxgeoAuHhMk2w4GR6uG9AtLr/SuYqLpl+VKgzumeDPyRf jG1LiDEBuVQyDdcwMKh4pV9BoteoC0lJ5pFHciR9ihzKKUtsCt74uLf0KUpYP7Mw8hKb Mptuy+QPRY71Df4Xu/hjtlxrK3gf1HoKUwWlzXct/pjazBuuqpbH7nU6aIHK8XyYC1nA Dwdmc0fHdq8g8oG/TWbcLTkoj/Vr8mXg3QXIOkSl7g8vaGBFNsSQItappTBMAZlmzI/Z CT/sXNBZs3WANyLcRQxFPNsl+WZ6bhRdTR9XdneVtPuwcFsAjVt9LqPltuAqZQ8SjxYf pZFw== X-Gm-Message-State: AMCzsaXxrujmpIsuWkAtTrM5LOnHzHNcFRdT7xYO94bfB9muCJSMneOZ O3mNauR4Je2u958PJI22oob/f5BO X-Google-Smtp-Source: AOwi7QBDe3qqdVh7WIXm3LPCnfL7iZ28d94uSYQtcT0PQLoUpYQperZ5zQfkZcgo3YZ0/ABPIr/A1g== X-Received: by 10.223.150.194 with SMTP id u60mr7606541wrb.141.1507475514579; Sun, 08 Oct 2017 08:11:54 -0700 (PDT) Received: from rywe.jkqxz.net (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id b190sm6770476wma.22.2017.10.08.08.11.53 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 08 Oct 2017 08:11:54 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 8 Oct 2017 16:11:46 +0100 Message-Id: <20171008151146.13505-6-sw@jkqxz.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171008151146.13505-1-sw@jkqxz.net> References: <20171008151146.13505-1-sw@jkqxz.net> Subject: [FFmpeg-devel] [PATCH 6/6] hwcontext_vaapi: Add support for mapping to DRM objects 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Uses vaExportSurfaceHandle() from libva2. --- libavutil/hwcontext_vaapi.c | 106 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 2 deletions(-) diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c index b2f2e376d8..3b4ca57d6f 100644 --- a/libavutil/hwcontext_vaapi.c +++ b/libavutil/hwcontext_vaapi.c @@ -884,8 +884,8 @@ fail: return err; } -static int vaapi_map_from(AVHWFramesContext *hwfc, AVFrame *dst, - const AVFrame *src, int flags) +static int vaapi_map_to_memory(AVHWFramesContext *hwfc, AVFrame *dst, + const AVFrame *src, int flags) { int err; @@ -1060,6 +1060,95 @@ static int vaapi_map_from_drm(AVHWFramesContext *src_fc, AVFrame *dst, return 0; } + +static void vaapi_unmap_to_drm(AVHWFramesContext *dst_fc, + HWMapDescriptor *hwmap) +{ + AVDRMFrameDescriptor *drm_desc = hwmap->priv; + int i; + + for (i = 0; i < drm_desc->nb_objects; i++) + close(drm_desc->objects[i].fd); + + av_freep(&drm_desc); +} + +static int vaapi_map_to_drm(AVHWFramesContext *hwfc, AVFrame *dst, + const AVFrame *src, int flags) +{ +#if CONFIG_VAAPI_1 + AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx; + VASurfaceID surface_id; + VAStatus vas; + VADRMPRIMESurfaceDescriptor va_desc; + AVDRMFrameDescriptor *drm_desc = NULL; + int err, i, j; + + surface_id = (VASurfaceID)(uintptr_t)src->data[3]; + + vas = vaExportSurfaceHandle(hwctx->display, surface_id, + VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2, + VA_EXPORT_SURFACE_READ_ONLY | + VA_EXPORT_SURFACE_SEPARATE_LAYERS, + &va_desc); + if (vas != VA_STATUS_SUCCESS) { + av_log(hwfc, AV_LOG_ERROR, "Failed to export surface %#x: " + "%d (%s).\n", surface_id, vas, vaErrorStr(vas)); + return AVERROR(EIO); + } + + drm_desc = av_mallocz(sizeof(*drm_desc)); + if (!drm_desc) { + err = AVERROR(ENOMEM); + goto fail; + } + + // By some bizarre coincidence, these structures are very similar... + drm_desc->nb_objects = va_desc.num_objects; + for (i = 0; i < va_desc.num_objects; i++) { + drm_desc->objects[i].fd = va_desc.objects[i].fd; + drm_desc->objects[i].size = va_desc.objects[i].size; + drm_desc->objects[i].format_modifier = + va_desc.objects[i].drm_format_modifier; + } + drm_desc->nb_layers = va_desc.num_layers; + for (i = 0; i < va_desc.num_layers; i++) { + drm_desc->layers[i].format = va_desc.layers[i].drm_format; + drm_desc->layers[i].nb_planes = va_desc.layers[i].num_planes; + for (j = 0; j < va_desc.layers[i].num_planes; j++) { + drm_desc->layers[i].planes[j].object_index = + va_desc.layers[i].object_index[j]; + drm_desc->layers[i].planes[j].offset = + va_desc.layers[i].offset[j]; + drm_desc->layers[i].planes[j].pitch = + va_desc.layers[i].pitch[j]; + } + } + + err = ff_hwframe_map_create(src->hw_frames_ctx, dst, src, + &vaapi_unmap_to_drm, drm_desc); + if (err < 0) + goto fail; + + dst->width = src->width; + dst->height = src->height; + dst->data[0] = (uint8_t*)drm_desc; + + return 0; + +fail: + for (i = 0; i < va_desc.num_objects; i++) + close(va_desc.objects[i].fd); + av_freep(&drm_desc); + return err; +#else + // Older versions without vaExportSurfaceHandle() are not supported - + // in theory this is possible with a combination of vaDeriveImage() + // and vaAcquireBufferHandle(), but it doesn't carry enough metadata + // to actually use the result in a generic way. + return AVERROR(ENOSYS); +#endif +} #endif static int vaapi_map_to(AVHWFramesContext *hwfc, AVFrame *dst, @@ -1075,6 +1164,19 @@ static int vaapi_map_to(AVHWFramesContext *hwfc, AVFrame *dst, } } +static int vaapi_map_from(AVHWFramesContext *hwfc, AVFrame *dst, + const AVFrame *src, int flags) +{ + switch (dst->format) { +#if CONFIG_LIBDRM + case AV_PIX_FMT_DRM_PRIME: + return vaapi_map_to_drm(hwfc, dst, src, flags); +#endif + default: + return vaapi_map_to_memory(hwfc, dst, src, flags); + } +} + static void vaapi_device_free(AVHWDeviceContext *ctx) { AVVAAPIDeviceContext *hwctx = ctx->hwctx;