From patchwork Mon Jun 12 22:40:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 3950 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.22.4 with SMTP id 4csp78342vsw; Mon, 12 Jun 2017 15:44:04 -0700 (PDT) X-Received: by 10.223.182.152 with SMTP id j24mr633663wre.122.1497307444916; Mon, 12 Jun 2017 15:44:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1497307444; cv=none; d=google.com; s=arc-20160816; b=rTLfJ/zm1wakMdZG7rR66nfAwh98ixskEDKzEspiyeZcZUAHOTFNb6ZxJo8gi1gLEz VZd8jJ8vkmrx/i+L5putngUJYYxzuq7KQFz2ghh/VomnUM5QSRTlzrtj0u7fnx9JyaHW oWAceLGhUNQpNZHdAeiglauQ6DHN4w+EbSc945cLesgqYyAvL69NU5tyX8lUrIbBxplG ZcxMkxxEhqjotkvkx0A8qKI10N5lHFSSjr7+ADev67ARUf4ChXqxdQn9kAWT8xk4U9Gn XCwm10utQLd38uEgVmvwNpzDG10gSSPrxZtZoSK2k/IyNoHNAxb65YVaG9UtObAsZyQS uoKQ== 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=/Bi2gqbfDz3gqcFzSEJp8bqa7xOSoDpWQ/O30vBeBrM=; b=ps8l3Jwnu/+2kjH2zMhbgCeNWxG695CboUEd+kWAswyZNP1Ou7ewM23+WDmY/b5tEF 96PaWIqqfaVHF1th03ks/wcDNPM5OIjSlJrCGWuiIkdo1r4Tkgp79ou+yHv5vGGXcktU LNtcN7zykvpQaPuIQPew3tcvFbRbp23Q1l41ocleELzEr7kqKKawdMPpFDIoy2okyjVE Im+byzXsBgCjwsecntt1LMZaf2b9FEcPItSUSZtK6JnCPVMAu4A7/su5dcw4RDPK8//W uMN185no/OBBO6rgD+G5o8NS5gWPfJ6n4236zzO/olAXbwdg7gGS+mLcqEAmY9kkEexK rzfg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@jkqxz-net.20150623.gappssmtp.com; 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 i8si10989973wrc.245.2017.06.12.15.44.04; Mon, 12 Jun 2017 15:44:04 -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; 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 B326E68A0AB; Tue, 13 Jun 2017 01:41:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f176.google.com (mail-wr0-f176.google.com [209.85.128.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 849E168A039 for ; Tue, 13 Jun 2017 01:41:14 +0300 (EEST) Received: by mail-wr0-f176.google.com with SMTP id v104so113617827wrb.0 for ; Mon, 12 Jun 2017 15:41:16 -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=JOCHlgT6Vc+uRrjb2sRYolmidV6AL89RBueM34FK+68=; b=mbPH6vnU/HgNHESSPR5wBlWJLQ0t4DxtYdSfZwj/zCzO0r+avPzsXEkguox0sg2tYA bzCRQxteQdyN9z/ixLG+z5XOWf2gTMyDNU+x750lvc8Co0vexi3QMGA4t/+Gdz0ghfE2 k67/T5qHGFqjz5JxcFi+TRiAGgokfsNmGQkTqhYuMkM+YXif5VF+Sh6zKUHCQzdqeBBK il3coJXh3LiYjsztrcSYE1vJGOP2oKS2v9Q9uUUcG4d2tSaKtyqCrt6ZZL68BE/18BLP XOxHL9eDA5UJbra5aSfa8+13UuhQqkXKSlQSYgd5BkJIRWtK0wIJDfSUkfEYHCoE2K0Z qkcA== 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=JOCHlgT6Vc+uRrjb2sRYolmidV6AL89RBueM34FK+68=; b=itO2RZNMB0QN1cO3/htixFSzyipFJLV4etXU9lqr2EQ4IIk+2Q+5EjDCYwNsdIjw+e yVoqoo1EEowsvVDhMbZlRG4gf42ML3WnZY+TboZAvR6khitMfhIHWtNd85P1dMgH/ZSw OC7FBckKauG34Vp3Hx+45/tR/7wLMQRiWP5sbzMFpQFq+GTMp147kTjEjAO5ikzzsX7A ryAOqa8cZ3MKUpyXYqrpcgPN33qy91FyAteAo3OFMPXXmtg7s8Gf5p2Ql45Cz5CwwA+h C7N1TkHZ0Svj1dfyuQLTqknOyHtsyiY2F3WLsGBRpcQSPeGjevKTdESmsIiobUua8fnb jIdQ== X-Gm-Message-State: AKS2vOy1wFiE0XXVHz+M8LyqJOQLTPwrPPr6TaHOoAKp1JWDyDawwYtA nR35t+1g7jcCpH+YAbw= X-Received: by 10.28.142.211 with SMTP id q202mr9258741wmd.76.1497307276061; Mon, 12 Jun 2017 15:41:16 -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 m191sm13098233wmg.30.2017.06.12.15.41.15 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Jun 2017 15:41:15 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Mon, 12 Jun 2017 23:40:37 +0100 Message-Id: <20170612224041.6750-21-sw@jkqxz.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170612224041.6750-1-sw@jkqxz.net> References: <20170612224041.6750-1-sw@jkqxz.net> Subject: [FFmpeg-devel] [PATCH 20/24] hwcontext_qsv: Implement mapping frames to the child device type 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" (cherry picked from commit e1c5d56b18b82e3fb42382b1b1f972e8b371fc38) --- libavutil/hwcontext_qsv.c | 88 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 2 deletions(-) diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index 8dbff88b0a..75057f7d52 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -577,13 +577,62 @@ static int qsv_transfer_get_formats(AVHWFramesContext *ctx, return 0; } +static int qsv_frames_derive_from(AVHWFramesContext *dst_ctx, + AVHWFramesContext *src_ctx, int flags) +{ + AVQSVFramesContext *src_hwctx = src_ctx->hwctx; + int i; + + switch (dst_ctx->device_ctx->type) { +#if CONFIG_VAAPI + case AV_HWDEVICE_TYPE_VAAPI: + { + AVVAAPIFramesContext *dst_hwctx = dst_ctx->hwctx; + dst_hwctx->surface_ids = av_mallocz_array(src_hwctx->nb_surfaces, + sizeof(*dst_hwctx->surface_ids)); + if (!dst_hwctx->surface_ids) + return AVERROR(ENOMEM); + for (i = 0; i < src_hwctx->nb_surfaces; i++) + dst_hwctx->surface_ids[i] = + *(VASurfaceID*)src_hwctx->surfaces[i].Data.MemId; + dst_hwctx->nb_surfaces = src_hwctx->nb_surfaces; + } + break; +#endif +#if CONFIG_DXVA2 + case AV_HWDEVICE_TYPE_DXVA2: + { + AVDXVA2FramesContext *dst_hwctx = dst_ctx->hwctx; + dst_hwctx->surfaces = av_mallocz_array(src_hwctx->nb_surfaces, + sizeof(*dst_hwctx->surfaces)); + if (!dst_hwctx->surfaces) + return AVERROR(ENOMEM); + for (i = 0; i < src_hwctx->nb_surfaces; i++) + dst_hwctx->surfaces[i] = + (IDirect3DSurface9*)src_hwctx->surfaces[i].Data.MemId; + dst_hwctx->nb_surfaces = src_hwctx->nb_surfaces; + if (src_hwctx->frame_type == MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET) + dst_hwctx->surface_type = DXVA2_VideoDecoderRenderTarget; + else + dst_hwctx->surface_type = DXVA2_VideoProcessorRenderTarget; + } + break; +#endif + default: + return AVERROR(ENOSYS); + } + + return 0; +} + static int qsv_map_from(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src, int flags) { QSVFramesContext *s = ctx->internal->priv; mfxFrameSurface1 *surf = (mfxFrameSurface1*)src->data[3]; AVHWFramesContext *child_frames_ctx; - + const AVPixFmtDescriptor *desc; + uint8_t *child_data; AVFrame *dummy; int ret = 0; @@ -591,6 +640,40 @@ static int qsv_map_from(AVHWFramesContext *ctx, return AVERROR(ENOSYS); child_frames_ctx = (AVHWFramesContext*)s->child_frames_ref->data; + switch (child_frames_ctx->device_ctx->type) { +#if CONFIG_VAAPI + case AV_HWDEVICE_TYPE_VAAPI: + child_data = (uint8_t*)(intptr_t)*(VASurfaceID*)surf->Data.MemId; + break; +#endif +#if CONFIG_DXVA2 + case AV_HWDEVICE_TYPE_DXVA2: + child_data = surf->Data.MemId; + break; +#endif + default: + return AVERROR(ENOSYS); + } + + if (dst->format == child_frames_ctx->format) { + ret = ff_hwframe_map_create(s->child_frames_ref, + dst, src, NULL, NULL); + if (ret < 0) + return ret; + + dst->width = src->width; + dst->height = src->height; + dst->data[3] = child_data; + + return 0; + } + + desc = av_pix_fmt_desc_get(dst->format); + if (desc && desc->flags & AV_PIX_FMT_FLAG_HWACCEL) { + // This only supports mapping to software. + return AVERROR(ENOSYS); + } + dummy = av_frame_alloc(); if (!dummy) return AVERROR(ENOMEM); @@ -603,7 +686,7 @@ static int qsv_map_from(AVHWFramesContext *ctx, dummy->format = child_frames_ctx->format; dummy->width = src->width; dummy->height = src->height; - dummy->data[3] = surf->Data.MemId; + dummy->data[3] = child_data; ret = av_hwframe_map(dst, dummy, flags); @@ -1042,6 +1125,7 @@ const HWContextType ff_hwcontext_type_qsv = { .map_to = qsv_map_to, .map_from = qsv_map_from, .frames_derive_to = qsv_frames_derive_to, + .frames_derive_from = qsv_frames_derive_from, .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_QSV, AV_PIX_FMT_NONE }, };