From patchwork Thu Nov 23 09:41:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Evgeny Pavlov X-Patchwork-Id: 44756 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:bca6:b0:181:818d:5e7f with SMTP id fx38csp456178pzb; Thu, 23 Nov 2023 01:43:49 -0800 (PST) X-Google-Smtp-Source: AGHT+IHa7Cw1NepM889s82imzosZ3dTUt7p00mX4CUjAL+emqynnmrSFtUphDLdzvqWa2gfxMSTi X-Received: by 2002:a17:906:189:b0:9f2:3e76:5d39 with SMTP id 9-20020a170906018900b009f23e765d39mr3167481ejb.0.1700732629458; Thu, 23 Nov 2023 01:43:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700732629; cv=none; d=google.com; s=arc-20160816; b=I2wbSE6O9q4YXYqNDhQVTMY8KUNxk90/8WBlv86dqIS2vYCChalhwwWdicnZlXAL2h 7FV5H1vc33XoeDQ98jTiEoSVcol9grrpYVrx1VXj0pGgZqBUMr4goGk5QccpdxoqTQF0 swwE3YLUtPnk41yQSbYH5hwnPFBzJqlsFlwYTYeLom4pxm3TbmEOfbh19d5RZk4HYidn tuzBeGGPmTSYvLud0CfBXirFn8vNCvZX2Xv0dKE2nH6AU9ZLMTM74o6u6Id4/zAA3KJ3 miWS2s3RUoYTLLI9vzxgmZHcCh3ZezjB6iqPTcR/rQcCAuTGLg34MeNVhC5fQwy9NWuI /zsw== 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:message-id:date:to:from :dkim-signature:delivered-to; bh=TceT28NM8HlrvueuSFKspPtjpzFWb2EHlaK+KapNTXY=; fh=l8BBgSaHK1qPkRTUMT3LasR23D+FgYCLMIPW5YpagSs=; b=AdYHgBB+Cd61NMZDt8X7UTSh1gO7zUgum9rGLTFZC3IrDYDArfjCeZWiWhOw1cowVA ejtndHS+t9kHnLafBXMSJDxUT5txi8RTVRCh3IYC0kEkfk651Vn/qTNcuMyFlDWpyqaf CvntksOZxQgXxZVXL6jioW59hhXdkJkFeZsMxnQvThq6MwFZbaIuTJrZil0rcNu9DByH miUEcOfbgMGjajy3CwPeTZVe0fSU3hmt2npbpcYn2EzEjLGx2eywj3BdM0Zr62akL7uK sIKHgXSP7wWmth6MG3KonolSadNVh/whPoDgK7eVwl7yrpOFeFqVNQWsleJmEb2UKXsQ lakA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=jvag3v7G; 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 s15-20020a170906500f00b009d464ba0b23si517791ejj.111.2023.11.23.01.43.48; Thu, 23 Nov 2023 01:43:49 -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=jvag3v7G; 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 53EC768CBAE; Thu, 23 Nov 2023 11:43:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f178.google.com (mail-lj1-f178.google.com [209.85.208.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D77AD68C6E6 for ; Thu, 23 Nov 2023 11:43:37 +0200 (EET) Received: by mail-lj1-f178.google.com with SMTP id 38308e7fff4ca-2c871d566cfso7422981fa.3 for ; Thu, 23 Nov 2023 01:43:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1700732616; x=1701337416; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=59y3fJarAhTSsJe/GCgB1a6egQB7x+spmRhzfZhozCg=; b=jvag3v7GVOhf0cO+xqcFzS9Vor00lqoeT7iuXE4Yhho1YdQrmSufB72D25dGfJInMn v8zmdoRHq/Ldj4FytiPKfXqY+AVzjGxfR2SGiOAHS7gGPCsEuAYXR+WDkM22ZZsbOGRX c9Dkfhaw/SHtPqy/32DT88Z5TKhy/t9N9sS7V2k0MJ7ytKF0qVBS7UsR1RBUEU7QZJ+o ZcVrEzs3CUZlLtpgP0GiROZajLBQ8jnsKejWoUiNa1EBmAPwXuAcLHrt9hxIlSPxzqwD tf3ZB+TwoAg4ds0PWe59ETzsAPwAVHIviO73I6KFw9L1XrgPSg3DpF062Qa33AQVL5f3 WM6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700732616; x=1701337416; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=59y3fJarAhTSsJe/GCgB1a6egQB7x+spmRhzfZhozCg=; b=A5hp0+8Q1tYHUgauU5VKSfIrwbQI9bsFBtZ45+eUUcF2VLZdqsuy95w0UASd8kk/wi LQ/VbBmozlzmUXIyeOsF3hdBabxqA11VmSag0mkYBURabk1oyFmwCMuTziCCz1KGMtH6 pQxERk3We3wnXtEKslf1tBzF8ZMTZJylHuQxr/maYGiTS9zLZ52HbSxsHH9BnGCLS1n0 t9A3dJKtf5R2S7SDEIOQSBi+KgUBKg4PLi8o/GsgzesnVl2upHv08ebjD4lvtDgI2sBV U8efaNt/dYjiSBkwNMAawFgF1l8914qonv/7xMMnNDGSzQYgHaN19ZT2dct4cl8SqU0q +2IA== X-Gm-Message-State: AOJu0Yytb0ldRg76Sq4UE+EuJKaD1Yegu1KGyy+oq+8Lh/zS0H5zHUQA ++Xy1WWX4E0lCfKd4sv5bhcMeYI0rbpheg== X-Received: by 2002:a05:6512:e89:b0:4fb:8f79:631 with SMTP id bi9-20020a0565120e8900b004fb8f790631mr2346501lfb.46.1700732616129; Thu, 23 Nov 2023 01:43:36 -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 n27-20020a05600c3b9b00b004067e905f44sm1392069wms.9.2023.11.23.01.43.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Nov 2023 01:43:35 -0800 (PST) From: Evgeny Pavlov To: ffmpeg-devel@ffmpeg.org Date: Thu, 23 Nov 2023 10:41:31 +0100 Message-ID: <20231123094246.14268-2-lucenticus@gmail.com> X-Mailer: git-send-email 2.42.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] 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: CwJZee03rhw7 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.h | 1 + libavcodec/amfenc_av1.c | 18 ++++++++++++++++++ libavcodec/amfenc_h264.c | 18 ++++++++++++++++++ libavcodec/amfenc_hevc.c | 18 ++++++++++++++++++ 4 files changed, 55 insertions(+) diff --git a/libavcodec/amfenc.h b/libavcodec/amfenc.h index 2dbd378ef8..e8d66164ed 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 diff --git a/libavcodec/amfenc_av1.c b/libavcodec/amfenc_av1.c index 3f164ccc59..912d6bf020 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 Smart Access Video", 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,22 @@ FF_ENABLE_DEPRECATION_WARNINGS } } + if (ctx->smart_access_video != -1) { + AMF_ASSIGN_PROPERTY_BOOL(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_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); + // Set low latency mode if Smart Access Video is enabled + if (ctx->smart_access_video != 0) { + 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..b0b47645fc 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 Smart Access Video", 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,22 @@ 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"); } + if (ctx->smart_access_video != -1) { + AMF_ASSIGN_PROPERTY_BOOL(res, ctx->encoder, AMF_VIDEO_ENCODER_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); + // Set low latency mode if Smart Access Video is enabled + if (ctx->smart_access_video != 0) { + 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..a5b6b15ef7 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 Smart Access Video", 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,22 @@ FF_ENABLE_DEPRECATION_WARNINGS } } + if (ctx->smart_access_video != -1) { + AMF_ASSIGN_PROPERTY_BOOL(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_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); + // Set low latency mode if Smart Access Video is enabled + if (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);