From patchwork Tue Nov 28 13:52:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Evgeny Pavlov X-Patchwork-Id: 44840 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bca6:b0:181:818d:5e7f with SMTP id fx38csp4197080pzb; Tue, 28 Nov 2023 06:05:30 -0800 (PST) X-Google-Smtp-Source: AGHT+IGKlWMi1xWVoUXxPgg3Tu9WUNP7mPidadUqGRwvmBCIkWW/kYlWm1ilmP0Zsn/s4JXhVwJz X-Received: by 2002:a17:906:2404:b0:a01:ae7b:d190 with SMTP id z4-20020a170906240400b00a01ae7bd190mr9354270eja.5.1701180329727; Tue, 28 Nov 2023 06:05:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701180329; cv=none; d=google.com; s=arc-20160816; b=I/cDp6kPBq+0Cm6oxymvFdcdXv6OYp47YsSc8kKyGAAhMqxLgs+n7lExlY2W20VHQ2 dJWfbrsb4OtNOK2Bl731AHp9+XVkATgAaXoJEoZPISWeEN+QnMQeV3x3mci6RX/gtR27 hsyifTJWFPuVzshhwjNId0byiFse+pouilue/txnYKqq1npTZDvyZmYtbYBDS9esurY3 rLMRBiqyfYFnwwVdrtIZf+Oq7cClFlK0FYKk2LR9IcXEtP4bXCbU4HbVqMrnMRfsKwXe K29OtjNLpSWgkcSYqNuVpOzyB+YrhX3HheO5sJDSVEl+UOPTCi+ZItpFLBX4I40SRgHQ akXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=C97SqSRbFhkpAgxUK4/6ndg8JlfHVcBLztdozEdds2s=; fh=l8BBgSaHK1qPkRTUMT3LasR23D+FgYCLMIPW5YpagSs=; b=ICOWl52kcSzS1x5FESj9MHQZ2QUg0eEg5ubgVvjeoEB1+ueEt04t6viWgc5xiSDXdB 0Hct5uKAQpPDkqNYw8UiNELpgx6w1AE0U2Y5L+0yTkF1v5hloiSrGvusPTEGpDrPwyEr NAdcYSW3T8rIXe4RfkWREyeu7HLAM8EPVMAQumsR+Rh6L/1Fppwm+bdY6k4dwFCVguzx aMTERhP0wadRFF4L71tD6sLQVWrI40kFf5IZZx0JqveCDreHL3oQRCQPPBepVVYLHi8M n8+5l72CgNLgQhQxUGnVFI+gqm0/yJNSBQOWPMvsPeJqdB3eMfCdLdE7fTIZGAKskVla mtxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=ZBVQX4jf; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 15-20020a50874f000000b0054b0af6bc3csi4588165edv.644.2023.11.28.06.05.29; Tue, 28 Nov 2023 06:05:29 -0800 (PST) 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=@gmail.com header.s=20230601 header.b=ZBVQX4jf; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 35BA268CF09; Tue, 28 Nov 2023 16:05:26 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f49.google.com (mail-ej1-f49.google.com [209.85.218.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EA46E68CD2D for ; Tue, 28 Nov 2023 16:05:19 +0200 (EET) Received: by mail-ej1-f49.google.com with SMTP id a640c23a62f3a-a00a9c6f283so739897666b.0 for ; Tue, 28 Nov 2023 06:05:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1701180319; x=1701785119; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Zr4gDeVFmfOUXVFu/i5yoVA7pX/cwu8NMcZXmh8KtMk=; b=ZBVQX4jf7o+B0NO3IJV4cE1o0tq4+tBmMqt/8wJ2OnWHcJJxB65aedZMvmCDC0y4hs MDTH34VJDSE32YmGi/ys8zXHIAlWQ/T7gYdfYAQwkLI0X5C2jFMYfr+ZW5gjUC1dubhM Uun/ukTXm25iBNuDzyTqgNTmZx4mSBnlhAPiN6CozCHVdAPqkpLrZp2pxtgjGjbcV6RQ 5ENTuVFAJrQEYmnOl/1SnuZst7chF8HRRuZmUzxpSvqcXgM4aBqOP931CRtBp+V5ns0i A6naTRqEwM90hd72e0I7qEISpQj0oNvXwIU8HQXWNW7KGsM6ZmH/f+h7HiYSId+RxtIW Cseg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701180319; x=1701785119; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Zr4gDeVFmfOUXVFu/i5yoVA7pX/cwu8NMcZXmh8KtMk=; b=ZEvYFptQ3dLvfs4Cv0R0Bp26y+aWsCgH54AAczvq4007wNpPNBfX3TFR6PSy62H/dt HB9Z9QfoY1ufT6Wj/iHaZU31tlUzxpst9c69ofmxBFXaOLituobeLTbRF2huO+1qMg99 vgOd750q/0Nxme/Z4yz2qtbZRmcXGfo5GBUcKv6tgGjWpGfmV6/yMG/zVUZawgzEd9Zs iFd4McqIO/vv56kcbM7Hd4ipjydeccStWaOG0FKtPpf54nOfheWE645oM9YY0Vlyg8GL JblMoR7MpQJarpmVx/HMXkXwmRHyLFsznfbD8TBOnp5y1bCkFKCKVI8FVR+rJna1D0NQ MjeQ== X-Gm-Message-State: AOJu0YyXXpRmUnM5Fwb4d5sri1NiGq8BhqscpBJbcTVV1QkOmRhus0nd MZ/OPt7MmwYei95nDtip+mF5T5f5ZNTHediY X-Received: by 2002:a17:906:6a05:b0:a01:84d6:762d with SMTP id qw5-20020a1709066a0500b00a0184d6762dmr11986834ejc.13.1701180318495; Tue, 28 Nov 2023 06:05:18 -0800 (PST) Received: from MSDN-EVPAVLOV.amd.com (178-223-50-56.dynamic.isp.telekom.rs. [178.223.50.56]) by smtp.gmail.com with ESMTPSA id 9-20020a170906218900b00a0988d69549sm5333463eju.189.2023.11.28.06.05.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Nov 2023 06:05:17 -0800 (PST) From: Evgeny Pavlov To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Nov 2023 14:52:45 +0100 Message-ID: <20231128135347.892-2-lucenticus@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231123094246.14268-2-lucenticus@gmail.com> References: <20231123094246.14268-2-lucenticus@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3] avcodec/amfenc: add smart access video option X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Evgeny Pavlov Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 0HVb93mC5t08 This commit adds option for enabling SmartAccess Video (SAV) in AMF encoders. SAV is an AMD hardware-specific feature which enables the parallelization of encode and decode streams across multiple Video Codec Engine (VCN) hardware instances. Signed-off-by: Evgeny Pavlov --- libavcodec/amfenc.c | 11 +++++++++++ libavcodec/amfenc.h | 6 ++++++ libavcodec/amfenc_av1.c | 8 ++++++++ libavcodec/amfenc_h264.c | 8 ++++++++ libavcodec/amfenc_hevc.c | 8 ++++++++ 5 files changed, 41 insertions(+) diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c index 061859f85c..c48eb27056 100644 --- a/libavcodec/amfenc.c +++ b/libavcodec/amfenc.c @@ -369,6 +369,17 @@ static int amf_init_encoder(AVCodecContext *avctx) res = ctx->factory->pVtbl->CreateComponent(ctx->factory, ctx->context, codec_id, &ctx->encoder); AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_ENCODER_NOT_FOUND, "CreateComponent(%ls) failed with error %d\n", codec_id, res); + if (ctx->smart_access_video != -1) { + AMF_ASSIGN_PROPERTY_BOOL(res, ctx->encoder, AMF_PER_CODEC_OPTION(ENABLE_SMART_ACCESS_VIDEO), ctx->smart_access_video != 0); + if (res != AMF_OK) { + av_log(avctx, AV_LOG_ERROR, "The Smart Access Video is not supported by AMF.\n"); + if (ctx->smart_access_video != 0) + return AVERROR(ENOSYS); + } else { + av_log(avctx, AV_LOG_INFO, "The Smart Access Video (%d) is set.\n", ctx->smart_access_video); + } + } + return 0; } diff --git a/libavcodec/amfenc.h b/libavcodec/amfenc.h index 2dbd378ef8..9bb3278bc5 100644 --- a/libavcodec/amfenc.h +++ b/libavcodec/amfenc.h @@ -89,6 +89,7 @@ typedef struct AmfContext { int quality; int b_frame_delta_qp; int ref_b_frame_delta_qp; + int smart_access_video; // Dynamic options, can be set after Init() call @@ -179,4 +180,9 @@ extern const enum AVPixelFormat ff_amf_pix_fmts[]; return ret_value; \ } +#define AMF_PER_CODEC_OPTION(name) \ + (avctx->codec->id == AV_CODEC_ID_AV1 ? AMF_VIDEO_ENCODER_AV1_ ## name : \ + avctx->codec->id == AV_CODEC_ID_HEVC ? AMF_VIDEO_ENCODER_HEVC_ ## name : \ + AMF_VIDEO_ENCODER_ ## name) + #endif //AVCODEC_AMFENC_H diff --git a/libavcodec/amfenc_av1.c b/libavcodec/amfenc_av1.c index 3f164ccc59..06ce566f39 100644 --- a/libavcodec/amfenc_av1.c +++ b/libavcodec/amfenc_av1.c @@ -104,6 +104,8 @@ static const AVOption options[] = { { "log_to_dbg", "Enable AMF logging to debug output", OFFSET(log_to_dbg), AV_OPT_TYPE_BOOL,{.i64 = 0 }, 0, 1, VE }, + { "smart_access_video", "Enable parallelization of encode and decode streams across multiple VCN hardware instances", OFFSET(smart_access_video), AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1, VE}, + //Pre Analysis options { "preanalysis", "Enable preanalysis", OFFSET(preanalysis), AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1, VE }, @@ -243,6 +245,12 @@ FF_ENABLE_DEPRECATION_WARNINGS } } + // Set low latency mode if Smart Access Video is enabled + if (ctx->smart_access_video == 1) { + AMF_ASSIGN_PROPERTY_BOOL(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE, AMF_VIDEO_ENCODER_AV1_ENCODING_LATENCY_MODE_LOWEST_LATENCY); + av_log(avctx, AV_LOG_INFO, "The Smart Access Video set low latency mode.\n"); + } + // Pre-Pass, Pre-Analysis, Two-Pass if (ctx->rate_control_mode == AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CONSTANT_QP) { AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_PREENCODE, 0); diff --git a/libavcodec/amfenc_h264.c b/libavcodec/amfenc_h264.c index bd544d12df..9b36a8b088 100644 --- a/libavcodec/amfenc_h264.c +++ b/libavcodec/amfenc_h264.c @@ -136,6 +136,8 @@ static const AVOption options[] = { { "log_to_dbg", "Enable AMF logging to debug output", OFFSET(log_to_dbg) , AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, + { "smart_access_video", "Enable parallelization of encode and decode streams across multiple VCN hardware instances", OFFSET(smart_access_video), AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1, VE}, + //Pre Analysis options { "preanalysis", "Enable preanalysis", OFFSET(preanalysis), AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1, VE }, @@ -353,6 +355,12 @@ FF_ENABLE_DEPRECATION_WARNINGS av_log(ctx, AV_LOG_WARNING, "rate control mode is PEAK_CONSTRAINED_VBR but rc_max_rate is not set\n"); } + // Set low latency mode if Smart Access Video is enabled + if (ctx->smart_access_video == 1) { + AMF_ASSIGN_PROPERTY_BOOL(res, ctx->encoder, AMF_VIDEO_ENCODER_LOWLATENCY_MODE, true); + av_log(avctx, AV_LOG_INFO, "The Smart Access Video set low latency mode.\n"); + } + if (ctx->preanalysis != -1) { AMF_ASSIGN_PROPERTY_BOOL(res, ctx->encoder, AMF_VIDEO_ENCODER_PRE_ANALYSIS_ENABLE, !!((ctx->preanalysis == 0) ? false : true)); } diff --git a/libavcodec/amfenc_hevc.c b/libavcodec/amfenc_hevc.c index 352564a301..7ccac37d15 100644 --- a/libavcodec/amfenc_hevc.c +++ b/libavcodec/amfenc_hevc.c @@ -99,6 +99,8 @@ static const AVOption options[] = { { "log_to_dbg", "Enable AMF logging to debug output", OFFSET(log_to_dbg), AV_OPT_TYPE_BOOL,{ .i64 = 0 }, 0, 1, VE }, + { "smart_access_video", "Enable parallelization of encode and decode streams across multiple VCN hardware instances", OFFSET(smart_access_video), AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1, VE}, + //Pre Analysis options { "preanalysis", "Enable preanalysis", OFFSET(preanalysis), AV_OPT_TYPE_BOOL, {.i64 = -1 }, -1, 1, VE }, @@ -241,6 +243,12 @@ FF_ENABLE_DEPRECATION_WARNINGS } } + // Set low latency mode if Smart Access Video is enabled + if (ctx->smart_access_video != -1 && ctx->smart_access_video != 0) { + AMF_ASSIGN_PROPERTY_BOOL(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_LOWLATENCY_MODE, true); + av_log(avctx, AV_LOG_INFO, "The Smart Access Video set low latency mode.\n"); + } + // Pre-Pass, Pre-Analysis, Two-Pass if (ctx->rate_control_mode == AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CONSTANT_QP) { AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_PREENCODE_ENABLE, 0);