From patchwork Wed Feb 16 13:37:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 34337 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6838:90eb:0:0:0:0 with SMTP id a11csp1229709nkf; Wed, 16 Feb 2022 05:38:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJyUVTAEWylAc7m07rnfwcvN+jLJixMCbdaUUvvd5yPffyS59kAtB1r6uPXzJQI2eas5bEsj X-Received: by 2002:a50:e08c:0:b0:407:cdc6:809e with SMTP id f12-20020a50e08c000000b00407cdc6809emr3044220edl.162.1645018707669; Wed, 16 Feb 2022 05:38:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1645018707; cv=none; d=google.com; s=arc-20160816; b=iTCXDUXAPaSqQrbenTq9oNjtbAjRwg1IQ1F1S4V4YxJpe2wvoTNRW7pQAPNKSPO2xK yTeRETNzqZBeMD08LRKzUUKR+q3OLRo88kIAb8nkINBU/uCh21ITAhWpjz27sPK25uS3 KokvO9/mlv0SYll7SyJEdYtvhRFm30Kmnn37fTSpmbcBq2rz/uAQTRAehhb3jql14juB FFy69PPymZ0JNVsMKBk0D1HOvmPelNMrIY0WvaAQm6RBDtEkf0JpkapSIKKhf6ZGgzSK Q1ulqNFE+Y13FO0OySHH8GK37Tg1BDtwo+0WKTsdInXwchBRSVGr3ElMb4fgYHkQOLvD rrpw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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=EKTSgC8pVMeJ8mW57P5+yP875o0CWdFORu+jd1oAtt0=; b=PGsyBlfkGMq1L9iNSgl8lkOQCI2XPjYW1EoP/fS+i4MS2PL9BUqG1T4VP/MBqWn5rV sAq36e9IcQF2lzUtCngiJuRkNSCUsHn2a9eUH/bn+0XOsyxc+s4/JMextI7Ka6yWptSm vlSPaH67M6kiInycxcgoQgY7++QRD1oLVHxvI8cdNWdNKUAFjxccBqnt/6S4i+MoKnNK YmVvBp5aPqKkhIWB6DGo/hLQsTA3VY+CBMPedxtDlDQAsWoIxT3B4uvnPcjvRhxJ1seE dPHkBVVY6p7IHlfSwR0jmdDV9P9xaufatYmHbogqaRxGBGLJoDOA1HmD3YRosgKZUEcY URSg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b="lmIe/z+D"; 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 hp33si36473961ejc.530.2022.02.16.05.38.26; Wed, 16 Feb 2022 05:38:27 -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=20210112 header.b="lmIe/z+D"; 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 A393768B252; Wed, 16 Feb 2022 15:38:23 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f181.google.com (mail-oi1-f181.google.com [209.85.167.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4BE4E68B14C for ; Wed, 16 Feb 2022 15:38:17 +0200 (EET) Received: by mail-oi1-f181.google.com with SMTP id q5so1096552oij.6 for ; Wed, 16 Feb 2022 05:38:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=ciONDvwd1pTFtKOPlgVr84A08VIDsrYyLOQeXyZxfwo=; b=lmIe/z+DuE7w+9JDg/Ly4RJ5oDbWYp+5xdyy5+heuFEIp2N9KTgNWriakwlrxAnCOD fH2CvfT9duQLKWsDY/ks1lSkEwTgEXNB9Nom3jjfPdEU0fb8DB0EUhH68oCW/z2JFy41 Q0To556ZB6SGXK65Vf3YwMza8tdfSfF0bJuen5ycMdTKdUhAn2wPb5hSV4kUzS84BWV0 bLy+FzmIhXwjZLzfYweMWni1DBib3gAqWY62NEKrEEseCsvFjTbGuEYMpu0y9A9+3IxV DDMBRwEtt1O4CkK4OOcFQM2lWjsjMYl5mvo/WO1GGubg51GVK09LvCoJ6JHNTNbrloxR CWdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=ciONDvwd1pTFtKOPlgVr84A08VIDsrYyLOQeXyZxfwo=; b=C8MQ59ijQuuTWJLeYR3Qn9kWks/jbk7tWECv6dnAaNdsAAbH2LJbUVjU5IEeVBclb1 ioSaZNHdsiCDnWVSdU1QL1JoDHP7BVscKwbc8/NJwE1gEXKT8sDw9fkBPb+DkxsVQyvV 6KjQsaPfu/htKO1tYOzSdI6R5rIzqwW1kG5adGYEE8cZjqb78ym542wXvG93i8rmrrjQ DouBBQvXSjt741a6YaVuj+mMdB/BAAK5Lkt74po9fpBlibVHKDAgnYkTIrkVfBbH6/oE hyRHOHeUdX/3GrkUbwEJ3l4e1fzcTCRcqANJVGKhfCIwdw4h2Y7QFWuBsQOtNouq/68g gN+w== X-Gm-Message-State: AOAM533uvXOM/ObUZMjeB6Y7TtNu1l0vfKpfWN/PZwTD6g3vNDNAY1aX FsAEENkdHQCXvYYyCfV7k/RLJbIrNyUw9w== X-Received: by 2002:aca:5a86:0:b0:2ce:6ee7:2caa with SMTP id o128-20020aca5a86000000b002ce6ee72caamr634984oib.216.1645018695078; Wed, 16 Feb 2022 05:38:15 -0800 (PST) Received: from localhost.localdomain ([186.136.131.95]) by smtp.gmail.com with ESMTPSA id u3sm19156116oao.25.2022.02.16.05.38.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Feb 2022 05:38:14 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 16 Feb 2022 10:37:02 -0300 Message-Id: <20220216133702.959-1-jamrial@gmail.com> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/libsvtav1: add a svtav1-params option to pass a list of key=value parameters 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: CMmEuZR+2HVv Signed-off-by: James Almer --- doc/encoders.texi | 3 +++ libavcodec/libsvtav1.c | 52 ++++++++++++++++++++++++++++++------------ 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/doc/encoders.texi b/doc/encoders.texi index bfb6c7eef6..1a040bccdd 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -1816,6 +1816,9 @@ Set log2 of the number of rows of tiles to use (0-6). @item tile_columns Set log2 of the number of columns of tiles to use (0-4). +@item svtav1-params +Set the SVT-AV1 configuration using a :-separated list of key=value parameters + @end table @section libkvazaar diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c index 6196da25e6..ce3b0ba7ac 100644 --- a/libavcodec/libsvtav1.c +++ b/libavcodec/libsvtav1.c @@ -60,6 +60,7 @@ typedef struct SvtContext { EOS_STATUS eos_flag; // User options. + AVDictionary *svtav1_opts; int hierarchical_level; int la_depth; int enc_mode; @@ -151,6 +152,41 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param, { SvtContext *svt_enc = avctx->priv_data; const AVPixFmtDescriptor *desc; + AVDictionaryEntry *en = NULL; + + // Update param from options + param->hierarchical_levels = svt_enc->hierarchical_level; + param->enc_mode = svt_enc->enc_mode; + param->tier = svt_enc->tier; + param->rate_control_mode = svt_enc->rc_mode; + param->scene_change_detection = svt_enc->scd; + param->qp = svt_enc->qp; + + if (svt_enc->la_depth >= 0) + param->look_ahead_distance = svt_enc->la_depth; + + param->tile_columns = svt_enc->tile_columns; + param->tile_rows = svt_enc->tile_rows; + +#if SVT_AV1_CHECK_VERSION(0, 9, 1) + while ((en = av_dict_get(svt_enc->svtav1_opts, "", en, AV_DICT_IGNORE_SUFFIX))) { + EbErrorType ret = svt_av1_enc_parse_parameter(param, en->key, en->value); + if (ret != EB_ErrorNone) { + int level = (avctx->err_recognition & AV_EF_EXPLODE) ? AV_LOG_ERROR : AV_LOG_WARNING; + av_log(avctx, level, "Error parsing option %s: %s.\n", en->key, en->value); + if (avctx->err_recognition & AV_EF_EXPLODE) + return AVERROR(EINVAL); + } + } +#else + if ((en = av_dict_get(svt_enc->svtav1_opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) { + int level = (avctx->err_recognition & AV_EF_EXPLODE) ? AV_LOG_ERROR : AV_LOG_WARNING; + av_log(avctx, level, "svt-params needs libavcodec to be compiled with SVT-AV1 " + "headers >= 0.9.1.\n"); + if (avctx->err_recognition & AV_EF_EXPLODE) + return AVERROR(ENOSYS); + } +#endif param->source_width = avctx->width; param->source_height = avctx->height; @@ -184,14 +220,6 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param, param->profile = FF_PROFILE_AV1_HIGH; } - // Update param from options - param->hierarchical_levels = svt_enc->hierarchical_level; - param->enc_mode = svt_enc->enc_mode; - param->tier = svt_enc->tier; - param->rate_control_mode = svt_enc->rc_mode; - param->scene_change_detection = svt_enc->scd; - param->qp = svt_enc->qp; - param->target_bit_rate = avctx->bit_rate; if (avctx->gop_size > 0) @@ -214,12 +242,6 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param, /* 2 = IDR, closed GOP, 1 = CRA, open GOP */ param->intra_refresh_type = avctx->flags & AV_CODEC_FLAG_CLOSED_GOP ? 2 : 1; - if (svt_enc->la_depth >= 0) - param->look_ahead_distance = svt_enc->la_depth; - - param->tile_columns = svt_enc->tile_columns; - param->tile_rows = svt_enc->tile_rows; - return 0; } @@ -535,6 +557,8 @@ static const AVOption options[] = { { "tile_columns", "Log2 of number of tile columns to use", OFFSET(tile_columns), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 4, VE}, { "tile_rows", "Log2 of number of tile rows to use", OFFSET(tile_rows), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 6, VE}, + { "svtav1-params", "Set the SVT-AV1 configuration using a :-separated list of key=value parameters", OFFSET(svtav1_opts), AV_OPT_TYPE_DICT, { 0 }, 0, 0, VE }, + {NULL}, };