From patchwork Sat Apr 14 15:53:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 8444 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.1.70 with SMTP id c67csp1941938jad; Sat, 14 Apr 2018 09:00:29 -0700 (PDT) X-Google-Smtp-Source: AIpwx48mGMPICQvlnvpZsgGYTR73ZtByyNJst4sN0P1CQBT66vaJ+8oF7m1+9ffhFt/5MRCyq+qv X-Received: by 10.223.136.34 with SMTP id d31mr697171wrd.18.1523721629319; Sat, 14 Apr 2018 09:00:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523721629; cv=none; d=google.com; s=arc-20160816; b=0EbPDMoDFar+hl8Zt5JHk6aYQEmpnLisecCH2y/b36Km3aio8LSP7h/zZy4gfZ9wEJ jecYmsywFzXRTL798wo/MpxAZkIssD78d1Kcl7Yd8c8+DB3f/91TlpISWIyxUxHGOpAj C9sUhP64WtriGpRJVLO0hKzvaKxwB9Xe6ZaOXBZQcFjydQtvhNGCajqPbKbKWclLrLES hFW/P3gyIXviIAD7rhOjFVQt3dCYVDsTSEOEAA5FRTQA2DF4jEd9oPYHjXb4enR5zfqf LFalBOE0dq2QkEK1GdUldCBWtDKLwguAvfISTmdxJV9xQB2mu7fKvLCnDHffdtGCwPQi vYTQ== 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:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=0HfRhbjKnZhoCSEjxX4/qSh378YQum8yOJMuQvM/efw=; b=Wv6Ts8npbbNFWlxTxRx3IH5gGCUv5AUvBLWxBN5xC9joIE743JgYzmerValAFJLRB/ tw/fH0WxCEyPzZjIkkxEj503g0fZYG+SEBwEdsm0Qvtjj3+TPwRBxwA0JHlCipEBStHj cAOrKF1NRKj2wKW0sO6s0PPvW+CndAceAIVM0faFgxFyLcFvAUNkj+R/SyZOM32vzJPl c2qJLPCLRZc3ibh4+mW8YO8cSaIbIHVfRlY8Bmzccoc3z6rRt4CBWmDqxZyrWX/MABhU nOQekz4N8ZYh/OSFhMemt43lD64X0uZIQCPv39BpHkkUrnG6XEX7vF3kGtekzjeo9slB i5dA== 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=rpMZHn5F; 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 u35si6209092wrc.262.2018.04.14.09.00.28; Sat, 14 Apr 2018 09:00:29 -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=rpMZHn5F; 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 B6C1E689E89; Sat, 14 Apr 2018 18:59:55 +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 04CEF689982 for ; Sat, 14 Apr 2018 18:59:49 +0300 (EEST) Received: by mail-wr0-f176.google.com with SMTP id u46so15128136wrc.11 for ; Sat, 14 Apr 2018 09:00:14 -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; bh=GOowxCR3sujEtlk10w4EyPY2fQYoYzK1iWTIxZeVoBM=; b=rpMZHn5FVCDCFeU2tHMt19GxOqB9pWcQVT62idDxBEdwW2cUoORF3CZHrbQ2y8cPja IGdDCojbik+5sfn+cP25ArrGV9uqp+NAHSVKBfQDR6vXQT4pgbpfNTBVhqaE22/WRYHn P0159LQGAt586sNx7iWw27M1W89cDzIFdEFiSmv9GjzLlWTXrMeACUzKyJtjkSPQBrPl ujkve4lgKuEW8CVG61ADM/MZbNxn1jBDQYXssQbszUTZU0QvYAC6buPdr+TEYNXT317B NaEQi347dVuuOEQkGZyKtvH/ZfBTGfHxLDrRvUEvFi3g7uUDWHkKFdZo4Rk+/CQESMrE doAg== 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; bh=GOowxCR3sujEtlk10w4EyPY2fQYoYzK1iWTIxZeVoBM=; b=oTH1mXfzmMcSOsWIwoQLp9dCYDdGtkEu4JjxYcQ2K8Fvv6rBc1g9NnrS+yh4bTy6zD hPjuDpESdjlrgaTLJm89f/ekAVsZ+nr7D/gWQI+1NxtSUFQ5ZIwapMC1/sxHBztdEBVg YvsOopAOaBx0UH/cql1Ei4isFYZcAV/I6LN1HN2JN5Pz0k+9yqZqj+TVxgSGFLyoIkv6 ofekrk+AP5N3ZWUIyaEayh2b+0Kp3BEM9aAItX8NHwQf1dVr7l3ighMsyEzcbLRRjL6W KYlcsGbuz/Y+TWwGMDfc2tIo0Zr6EgPl/t9gxDFdIU8/JhIbU376w5ylMwoPXS65MLLd maeg== X-Gm-Message-State: ALQs6tAKqCFdhgf2h7bUwPVrC2rUZ0v8Cz4ZpS5UpqkE+PoA83c9dJOb Qny5sWoJJnoPHF+Ev3msO3aIMnjr X-Received: by 10.28.111.10 with SMTP id k10mr1599620wmc.148.1523721226627; Sat, 14 Apr 2018 08:53:46 -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 n49sm13651823wrn.50.2018.04.14.08.53.45 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 14 Apr 2018 08:53:45 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sat, 14 Apr 2018 16:53:35 +0100 Message-Id: <20180414155339.22839-1-sw@jkqxz.net> X-Mailer: git-send-email 2.16.3 Subject: [FFmpeg-devel] [PATCH 1/5] amfenc: Fail to open if the user-supplied device is not usable 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" If the user supplies a device or frames context then it is an error not to use it; this is consistent with other hardware components. Also factorise out the D3D11 initialisation and improve error messages. --- libavcodec/amfenc.c | 130 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 81 insertions(+), 49 deletions(-) diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c index b9418b6791..8a9d6884a4 100644 --- a/libavcodec/amfenc.c +++ b/libavcodec/amfenc.c @@ -152,10 +152,30 @@ static int amf_load_library(AVCodecContext *avctx) return 0; } +#if CONFIG_D3D11VA +static int amf_init_from_d3d11_device(AVCodecContext *avctx, AVD3D11VADeviceContext *hwctx) +{ + AmfContext *ctx = avctx->priv_data; + AMF_RESULT res; + + res = ctx->context->pVtbl->InitDX11(ctx->context, hwctx->device, AMF_DX11_1); + if (res != AMF_OK) { + if (res == AMF_NOT_SUPPORTED) + av_log(avctx, AV_LOG_ERROR, "AMF via D3D11 is not supported on the given device.\n"); + else + av_log(avctx, AV_LOG_ERROR, "AMF failed to initialise on the given D3D11 device: %d.\n", res); + return AVERROR(ENODEV); + } + + return 0; +} +#endif + static int amf_init_context(AVCodecContext *avctx) { - AmfContext *ctx = avctx->priv_data; - AMF_RESULT res = AMF_OK; + AmfContext *ctx = avctx->priv_data; + AMF_RESULT res; + av_unused int ret; ctx->hwsurfaces_in_queue = 0; ctx->hwsurfaces_in_queue_max = 16; @@ -176,59 +196,71 @@ static int amf_init_context(AVCodecContext *avctx) res = ctx->factory->pVtbl->CreateContext(ctx->factory, &ctx->context); AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "CreateContext() failed with error %d\n", res); - // try to reuse existing DX device -#if CONFIG_D3D11VA + + // If a device was passed to the encoder, try to initialise from that. if (avctx->hw_frames_ctx) { - AVHWFramesContext *device_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data; - if (device_ctx->device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) { - if (amf_av_to_amf_format(device_ctx->sw_format) != AMF_SURFACE_UNKNOWN) { - if (device_ctx->device_ctx->hwctx) { - AVD3D11VADeviceContext *device_d3d11 = (AVD3D11VADeviceContext *)device_ctx->device_ctx->hwctx; - res = ctx->context->pVtbl->InitDX11(ctx->context, device_d3d11->device, AMF_DX11_1); - if (res == AMF_OK) { - ctx->hw_frames_ctx = av_buffer_ref(avctx->hw_frames_ctx); - if (!ctx->hw_frames_ctx) { - return AVERROR(ENOMEM); - } - if (device_ctx->initial_pool_size > 0) - ctx->hwsurfaces_in_queue_max = device_ctx->initial_pool_size - 1; - } else { - if(res == AMF_NOT_SUPPORTED) - av_log(avctx, AV_LOG_INFO, "avctx->hw_frames_ctx has D3D11 device which doesn't have D3D11VA interface, switching to default\n"); - else - av_log(avctx, AV_LOG_INFO, "avctx->hw_frames_ctx has non-AMD device, switching to default\n"); - } - } - } else { - av_log(avctx, AV_LOG_INFO, "avctx->hw_frames_ctx has format not uspported by AMF, switching to default\n"); - } + AVHWFramesContext *frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data; + + if (amf_av_to_amf_format(frames_ctx->sw_format) == AMF_SURFACE_UNKNOWN) { + av_log(avctx, AV_LOG_ERROR, "Format of input frames context (%s) is not supported by AMF.\n", + av_get_pix_fmt_name(frames_ctx->sw_format)); + return AVERROR(EINVAL); } - } else if (avctx->hw_device_ctx) { - AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)(avctx->hw_device_ctx->data); - if (device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) { - if (device_ctx->hwctx) { - AVD3D11VADeviceContext *device_d3d11 = (AVD3D11VADeviceContext *)device_ctx->hwctx; - res = ctx->context->pVtbl->InitDX11(ctx->context, device_d3d11->device, AMF_DX11_1); - if (res == AMF_OK) { - ctx->hw_device_ctx = av_buffer_ref(avctx->hw_device_ctx); - if (!ctx->hw_device_ctx) { - return AVERROR(ENOMEM); - } - } else { - if (res == AMF_NOT_SUPPORTED) - av_log(avctx, AV_LOG_INFO, "avctx->hw_device_ctx has D3D11 device which doesn't have D3D11VA interface, switching to default\n"); - else - av_log(avctx, AV_LOG_INFO, "avctx->hw_device_ctx has non-AMD device, switching to default\n"); - } - } + + switch (frames_ctx->device_ctx->type) { +#if CONFIG_D3D11VA + case AV_HWDEVICE_TYPE_D3D11VA: + ret = amf_init_from_d3d11_device(avctx, frames_ctx->device_ctx->hwctx); + if (ret < 0) + return ret; + break; +#endif + default: + av_log(avctx, AV_LOG_ERROR, "AMF initialisation from a %s frames context is not supported.\n", + av_hwdevice_get_type_name(frames_ctx->device_ctx->type)); + return AVERROR(ENOSYS); } - } + + ctx->hw_frames_ctx = av_buffer_ref(avctx->hw_frames_ctx); + if (!ctx->hw_frames_ctx) + return AVERROR(ENOMEM); + + if (frames_ctx->initial_pool_size > 0) + ctx->hwsurfaces_in_queue_max = frames_ctx->initial_pool_size - 1; + + } else if (avctx->hw_device_ctx) { + AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)avctx->hw_device_ctx->data; + + switch (device_ctx->type) { +#if CONFIG_D3D11VA + case AV_HWDEVICE_TYPE_D3D11VA: + ret = amf_init_from_d3d11_device(avctx, device_ctx->hwctx); + if (ret < 0) + return ret; + break; #endif - if (!ctx->hw_frames_ctx && !ctx->hw_device_ctx) { + default: + av_log(avctx, AV_LOG_ERROR, "AMF initialisation from a %s device is not supported.\n", + av_hwdevice_get_type_name(device_ctx->type)); + return AVERROR(ENOSYS); + } + + ctx->hw_device_ctx = av_buffer_ref(avctx->hw_device_ctx); + if (!ctx->hw_device_ctx) + return AVERROR(ENOMEM); + + } else { res = ctx->context->pVtbl->InitDX11(ctx->context, NULL, AMF_DX11_1); - if (res != AMF_OK) { + if (res == AMF_OK) { + av_log(avctx, AV_LOG_VERBOSE, "AMF initialisation succeeded via D3D11.\n"); + } else { res = ctx->context->pVtbl->InitDX9(ctx->context, NULL); - AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "InitDX9() failed with error %d\n", res); + if (res == AMF_OK) { + av_log(avctx, AV_LOG_VERBOSE, "AMF initialisation succeeded via D3D9.\n"); + } else { + av_log(avctx, AV_LOG_ERROR, "AMF initialisation failed via D3D9: error %d.\n", res); + return AVERROR(ENOSYS); + } } } return 0;