diff --git a/.gitmodules b/.gitmodules index d9d09732..b8bf2fb6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -17,7 +17,7 @@ [submodule "third-party/FFmpeg/FFmpeg"] path = third-party/FFmpeg/FFmpeg url = https://github.com/FFmpeg/FFmpeg.git - branch = release/7.1 + branch = release/8.0 [submodule "third-party/FFmpeg/SVT-AV1"] path = third-party/FFmpeg/SVT-AV1 url = https://github.com/LizardByte-infrastructure/SVT-AV1.git diff --git a/cmake/ffmpeg/ffmpeg.cmake b/cmake/ffmpeg/ffmpeg.cmake index 7fbc0366..8f24405c 100644 --- a/cmake/ffmpeg/ffmpeg.cmake +++ b/cmake/ffmpeg/ffmpeg.cmake @@ -52,7 +52,7 @@ if(BUILD_FFMPEG_AMF) endif() if(BUILD_FFMPEG_MF) list(APPEND FFMPEG_EXTRA_CONFIGURE - --enable-encoder=h264_mf,hevc_mf + --enable-encoder=h264_mf,hevc_mf,av1_mf --enable-mediafoundation ) endif() diff --git a/patches/FFmpeg/FFmpeg/AMF/01-amf-colorspace.patch b/patches/FFmpeg/FFmpeg/AMF/01-amf-colorspace.patch deleted file mode 100644 index 065d4151..00000000 --- a/patches/FFmpeg/FFmpeg/AMF/01-amf-colorspace.patch +++ /dev/null @@ -1,189 +0,0 @@ -From patchwork Sun Sep 8 20:02:09 2024 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Cameron Gutman -X-Patchwork-Id: 51399 -Delivered-To: ffmpegpatchwork2@gmail.com -Received: by 2002:a59:9c4f:0:b0:48e:c0f8:d0de with SMTP id w15csp1308472vqu; - Sun, 8 Sep 2024 14:59:08 -0700 (PDT) -X-Forwarded-Encrypted: i=2; - AJvYcCV1duo/VR5mKxFLFjf419y105vPMXivSAWwxRG0tiy4cyS/j9QCPnmwNWrA0hiu1i6FbuefpAQYWam08EKprp2P@gmail.com -X-Google-Smtp-Source: - AGHT+IHYs9OLdaZy5rk3aGM9iu+mYOraULoO1MfPDn7CRnDUSf2ijtZFQZQmGNo7GdJML/iUc2tJ -X-Received: by 2002:a05:6512:2391:b0:52e:fb8b:32d0 with SMTP id - 2adb3069b0e04-536587e0078mr3109605e87.1.1725832748562; - Sun, 08 Sep 2024 14:59:08 -0700 (PDT) -ARC-Seal: i=1; a=rsa-sha256; t=1725832748; cv=none; - d=google.com; s=arc-20240605; - b=YKGbsHbaRfhBSyzujnA64OiTNxkG3KBjao/XXIJtuwR3jw19xe0gslmdnXESIwuMW+ - BuTFPifJ+ZZFuBYQ1dyvfo3hQSnkiX4rF7+XHvp15x3yni4UuXwAKbZPruDSqF07m3xO - UJu2kak0WVHJ8ZGsrK94UKBG1U2KfxKYayi4WCB622DpJgjuZvrZFayQSJIJOJGwHMmx - U0NZq+Nny54BZebk67QfsXejXcZMGJwEhvRDnz2jUeo4bDV2SFWHfVy2W6gkwg3h+P+z - byh/stV9fBu9K+pdFB8WLt+9eOrU5BPYwSsVDbScSmyBN+gMTw0S5P3xyy8PE07xarh5 - lBow== -ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; - s=arc-20240605; - 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=8nUMYfrq83MxpQNA0jUrQXW6/kepJmaLcQ/ED+tE6/s=; - fh=ojNBnpj0zpT76yL3ht0RJoGb7zeeIrfYAfgAXalD5xc=; - b=RWBoYUFICzzugKQHXRjy8f5OjgYBlcwIQagvOvtPhmcFcBj/5IAa0DoP+czQ3lnCBL - 4EC90Ep4H/tfjC4RMe0pv7cF3k7uv3PywyJpeQujjGLKKyhwWg4uI3YiTNtuo1D0sOLi - Z/Wp/Dew6Ylu4yOy1e9wh/6Gw8VWaV/FB0Qcj67stwI19DgTiX20AsqxkWc4C6vFtqtj - 7CbVs5j0c7fprmm7exebC24g7JVLrCyhBSMamkvzFek8IiAwP1OUPMPsUVdIMsFyIqLV - zo3gZyf0z2CpCAxdF8cbtUGN4YnjCMKSWoBw/uBLtzJNomM1CR/mncm6G3tuv7QrqPk1 - rbBw==; - dara=google.com -ARC-Authentication-Results: i=1; mx.google.com; - dkim=neutral (body hash did not verify) header.i=@gmail.com - header.s=20230601 header.b=BVFZwiFm; - 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; - dara=fail header.i=@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 - 2adb3069b0e04-5365f9066a9si1197734e87.516.2024.09.08.14.59.08; - Sun, 08 Sep 2024 14:59:08 -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=@gmail.com - header.s=20230601 header.b=BVFZwiFm; - 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; - dara=fail header.i=@gmail.com -Received: from [127.0.1.1] (localhost [127.0.0.1]) - by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F2A0668DAC8; - Sun, 8 Sep 2024 23:04:11 +0300 (EEST) -X-Original-To: ffmpeg-devel@ffmpeg.org -Delivered-To: ffmpeg-devel@ffmpeg.org -Received: from mail-ot1-f44.google.com (mail-ot1-f44.google.com - [209.85.210.44]) - by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C894568D950 - for ; Sun, 8 Sep 2024 23:04:04 +0300 (EEST) -Received: by mail-ot1-f44.google.com with SMTP id - 46e09a7af769-70f670eb827so1756249a34.0 - for ; Sun, 08 Sep 2024 13:04:04 -0700 (PDT) -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20230601; t=1725825843; x=1726430643; 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=+l5ZDmyIsr6hkONNnQ2LfyuCqSk6j94jky6prkBG9Xo=; - b=BVFZwiFmY2YMBwUNprUbGbczTZWoQ7lZrObXNbrRpacr1SCrw6yuOqlkCxQoZCN5VA - A6HLXslEYYRDLJsGl/12WjT6utfpvEMAnROyxn3lqy2fvks+Lg+jGLSP8W8n81wX6aJZ - Q5o3zBMleWkWmaYlmefqO1SAluu9Ucl+Xq9alu1muwhIJ8LPc3irv/6sWfFOvKJSrLGA - RBWSotmgmeJPs+ZkPTVPMHt8u3RoYA4lg/sjEDQGS9sb622lqNjx5v9Rn9yTuxv1HAh2 - ggYPATJDgklAqFYXfpEloTemLGWJXfTQAQ8M0VqClkm02e4Z+DnVNX+UD0lOyMvFK2Ss - XYBA== -X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20230601; t=1725825843; x=1726430643; - 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=+l5ZDmyIsr6hkONNnQ2LfyuCqSk6j94jky6prkBG9Xo=; - b=IWWHiEtgyaGb3l2G7bA7mNFnPDLKLua4tVdggFeob2a5aFDxnypV/ri6fq7Qkl6IAi - jOMjDV17mSy62EUYlfw9y+TyCAciNYWpIWf2TF9AHE+FZDGmZcQ4lxehyxIrMgL3Qu1T - Jg04iCdG5o6WiXs8O8ZZ9mjc9dasJKDwFLiigw4g6HIv7Q8SNpvW9oQ3ZCk9flYbBhML - dewP7B+Y0O5s0H5XI/9jbPbecwC3nMA8PEBS17RCGZ8bdbFYep9z6VIH4pPCd/Dbgnkc - 1dvgoKG3to5MGiyuf1znWQeVOvH4kyxCrKD47hgojHjpmkVRfX64FpMIZe109GGuzDUY - nvrA== -X-Gm-Message-State: AOJu0YxKv3POyncQIhFCJgPIuibyY+4mBUBoWJzc/0KKdzaQ+CXRO5ZN - vA9hAXHYzcLvPODS441dzDNuAiusSLof78ea9/MjlxMOhRT2GiTLJIOk9w== -X-Received: by 2002:a05:6830:dc4:b0:703:68d0:a266 with SMTP id - 46e09a7af769-710cbb3f33cmr3750438a34.4.1725825842616; - Sun, 08 Sep 2024 13:04:02 -0700 (PDT) -Received: from localhost.localdomain - ([2600:1702:50c6:cf1f:9548:4dc9:5394:e50d]) - by smtp.gmail.com with ESMTPSA id - 46e09a7af769-710eeac556asm29618a34.55.2024.09.08.13.04.01 - (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); - Sun, 08 Sep 2024 13:04:01 -0700 (PDT) -From: Cameron Gutman -To: ffmpeg-devel@ffmpeg.org -Date: Sun, 8 Sep 2024 15:02:09 -0500 -Message-ID: <20240908200351.196-1-aicommander@gmail.com> -X-Mailer: git-send-email 2.43.0.windows.1 -MIME-Version: 1.0 -Subject: [FFmpeg-devel] [PATCH] avcodec/amfenc: Fix HEVC/AV1 colorspace - assumptions -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: lucenticus@gmail.com, ovchinnikov.dmitrii@gmail.com, primeadvice@gmail.com -Errors-To: ffmpeg-devel-bounces@ffmpeg.org -Sender: "ffmpeg-devel" -X-TUID: 4wkqHmzxK9ql - -Fixes incorrect colors in AMF encoding of 10-bit SDR content in HEVC and AV1. - -Signed-off-by: Cameron Gutman ---- - libavcodec/amfenc_av1.c | 13 ++++--------- - libavcodec/amfenc_hevc.c | 13 ++++--------- - 2 files changed, 8 insertions(+), 18 deletions(-) - -diff --git a/libavcodec/amfenc_av1.c b/libavcodec/amfenc_av1.c -index b40d54f70c..59b097edef 100644 ---- a/libavcodec/amfenc_av1.c -+++ b/libavcodec/amfenc_av1.c -@@ -252,15 +252,10 @@ FF_ENABLE_DEPRECATION_WARNINGS - - AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_COLOR_BIT_DEPTH, color_depth); - AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_OUTPUT_COLOR_PROFILE, color_profile); -- if (color_depth == AMF_COLOR_BIT_DEPTH_8) { -- /// Color Transfer Characteristics (AMF matches ISO/IEC) -- AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_OUTPUT_TRANSFER_CHARACTERISTIC, AMF_COLOR_TRANSFER_CHARACTERISTIC_BT709); -- /// Color Primaries (AMF matches ISO/IEC) -- AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_OUTPUT_COLOR_PRIMARIES, AMF_COLOR_PRIMARIES_BT709); -- } else { -- AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_OUTPUT_TRANSFER_CHARACTERISTIC, AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE2084); -- AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_OUTPUT_COLOR_PRIMARIES, AMF_COLOR_PRIMARIES_BT2020); -- } -+ /// Color Transfer Characteristics (AMF matches ISO/IEC) -+ AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_OUTPUT_TRANSFER_CHARACTERISTIC, (amf_int64)avctx->color_trc); -+ /// Color Primaries (AMF matches ISO/IEC) -+ AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_OUTPUT_COLOR_PRIMARIES, (amf_int64)avctx->color_primaries); - - profile_level = avctx->level; - if (profile_level == AV_LEVEL_UNKNOWN) { -diff --git a/libavcodec/amfenc_hevc.c b/libavcodec/amfenc_hevc.c -index fc25dcec1a..bdd2f273a9 100644 ---- a/libavcodec/amfenc_hevc.c -+++ b/libavcodec/amfenc_hevc.c -@@ -254,15 +254,10 @@ FF_ENABLE_DEPRECATION_WARNINGS - color_depth = AMF_COLOR_BIT_DEPTH_10; - } - AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_COLOR_BIT_DEPTH, color_depth); -- if (color_depth == AMF_COLOR_BIT_DEPTH_8) { -- /// Color Transfer Characteristics (AMF matches ISO/IEC) -- AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_OUTPUT_TRANSFER_CHARACTERISTIC, AMF_COLOR_TRANSFER_CHARACTERISTIC_BT709); -- /// Color Primaries (AMF matches ISO/IEC) -- AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_OUTPUT_COLOR_PRIMARIES, AMF_COLOR_PRIMARIES_BT709); -- } else { -- AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_OUTPUT_TRANSFER_CHARACTERISTIC, AMF_COLOR_TRANSFER_CHARACTERISTIC_SMPTE2084); -- AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_OUTPUT_COLOR_PRIMARIES, AMF_COLOR_PRIMARIES_BT2020); -- } -+ /// Color Transfer Characteristics (AMF matches ISO/IEC) -+ AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_OUTPUT_TRANSFER_CHARACTERISTIC, (amf_int64)avctx->color_trc); -+ /// Color Primaries (AMF matches ISO/IEC) -+ AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_OUTPUT_COLOR_PRIMARIES, (amf_int64)avctx->color_primaries); - - // Picture control properties - AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_NUM_GOPS_PER_IDR, ctx->gops_per_idr); diff --git a/patches/FFmpeg/FFmpeg/AMF/01-amf-outputdelay.patch b/patches/FFmpeg/FFmpeg/AMF/01-amf-outputdelay.patch new file mode 100644 index 00000000..91ab2b05 --- /dev/null +++ b/patches/FFmpeg/FFmpeg/AMF/01-amf-outputdelay.patch @@ -0,0 +1,35 @@ +From e0b38ef1a012ecdf684f80e215970a5cf8ccb5e2 Mon Sep 17 00:00:00 2001 +From: Cameron Gutman +Date: Sat, 9 Aug 2025 20:40:17 -0500 +Subject: [PATCH] avcodec/amfenc: fix output delayed by one frame + +Signed-off-by: Cameron Gutman +--- + libavcodec/amfenc.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c +index b16b642e4c..fb41aef90a 100644 +--- a/libavcodec/amfenc.c ++++ b/libavcodec/amfenc.c +@@ -634,7 +634,7 @@ static int amf_submit_frame(AVCodecContext *avctx, AVFrame *frame, AMFSurface + ret = av_fifo_write(ctx->timestamp_list, &frame->pts, 1); + if (ret < 0) + return ret; +- if(ctx->submitted_frame <= ctx->encoded_frame + max_b_frames + 1) ++ if(ctx->submitted_frame <= ctx->encoded_frame + max_b_frames) + return AVERROR(EAGAIN); // if frame just submiited - don't poll or wait + } + return 0; +@@ -700,7 +700,7 @@ int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) + if(ret != AVERROR_EOF){ + av_frame_free(&frame); + if(ret == AVERROR(EAGAIN)){ +- if(ctx->submitted_frame <= ctx->encoded_frame + max_b_frames + 1) // too soon to poll ++ if(ctx->submitted_frame <= ctx->encoded_frame + max_b_frames) // too soon to poll + return ret; + } + } +-- +2.50.1.windows.1 + diff --git a/patches/FFmpeg/FFmpeg/AMF/02-idr-on-amf.patch b/patches/FFmpeg/FFmpeg/AMF/02-idr-on-amf.patch deleted file mode 100644 index 2b6bf22d..00000000 --- a/patches/FFmpeg/FFmpeg/AMF/02-idr-on-amf.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 4ffd586e34081a1486f3a352741ce1f9bd1bbd5c Mon Sep 17 00:00:00 2001 -From: Cameron Gutman -Date: Sun, 8 Sep 2024 15:07:43 -0500 -Subject: [PATCH] avcodec/amfenc: Add support for on-demand key frames - -v2: Use forced_idr option instead of AV_FRAME_FLAG_KEY -Signed-off-by: Cameron Gutman ---- - libavcodec/amfenc.c | 41 +++++++++++++++++++++++++++++++++++++++- - libavcodec/amfenc.h | 1 + - libavcodec/amfenc_av1.c | 1 + - libavcodec/amfenc_h264.c | 1 + - libavcodec/amfenc_hevc.c | 1 + - 5 files changed, 44 insertions(+), 1 deletion(-) - -diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c -index a47aea6108..225fb9df27 100644 ---- a/libavcodec/amfenc.c -+++ b/libavcodec/amfenc.c -@@ -766,11 +766,50 @@ int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) - switch (avctx->codec->id) { - case AV_CODEC_ID_H264: - AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_INSERT_AUD, !!ctx->aud); -+ switch (frame->pict_type) { -+ case AV_PICTURE_TYPE_I: -+ if (ctx->forced_idr) { -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_INSERT_SPS, 1); -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_INSERT_PPS, 1); -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_IDR); -+ } else { -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_I); -+ } -+ break; -+ case AV_PICTURE_TYPE_P: -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_P); -+ break; -+ case AV_PICTURE_TYPE_B: -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_PICTURE_TYPE_B); -+ break; -+ } - break; - case AV_CODEC_ID_HEVC: - AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_HEVC_INSERT_AUD, !!ctx->aud); -+ switch (frame->pict_type) { -+ case AV_PICTURE_TYPE_I: -+ if (ctx->forced_idr) { -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_HEVC_INSERT_HEADER, 1); -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_HEVC_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_IDR); -+ } else { -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_HEVC_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_I); -+ } -+ break; -+ case AV_PICTURE_TYPE_P: -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_HEVC_FORCE_PICTURE_TYPE, AMF_VIDEO_ENCODER_HEVC_PICTURE_TYPE_P); -+ break; -+ } -+ break; -+ case AV_CODEC_ID_AV1: -+ if (frame->pict_type == AV_PICTURE_TYPE_I) { -+ if (ctx->forced_idr) { -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_AV1_FORCE_INSERT_SEQUENCE_HEADER, 1); -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE, AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE_KEY); -+ } else { -+ AMF_ASSIGN_PROPERTY_INT64(res, surface, AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE, AMF_VIDEO_ENCODER_AV1_FORCE_FRAME_TYPE_INTRA_ONLY); -+ } -+ } - break; -- //case AV_CODEC_ID_AV1 not supported - default: - break; - } -diff --git a/libavcodec/amfenc.h b/libavcodec/amfenc.h -index d985d01bb1..0f2abcbd82 100644 ---- a/libavcodec/amfenc.h -+++ b/libavcodec/amfenc.h -@@ -114,6 +114,7 @@ typedef struct AmfContext { - int max_b_frames; - int qvbr_quality_level; - int hw_high_motion_quality_boost; -+ int forced_idr; - - // HEVC - specific options - -diff --git a/libavcodec/amfenc_av1.c b/libavcodec/amfenc_av1.c -index 2a7a782063..b40d54f70c 100644 ---- a/libavcodec/amfenc_av1.c -+++ b/libavcodec/amfenc_av1.c -@@ -116,6 +116,7 @@ static const AVOption options[] = { - { "none", "no adaptive quantization", 0, AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_AQ_MODE_NONE }, 0, 0, VE, .unit = "adaptive_quantisation_mode" }, - { "caq", "context adaptive quantization", 0, AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_AQ_MODE_CAQ }, 0, 0, VE, .unit = "adaptive_quantisation_mode" }, - -+ { "forced_idr", "Force I frames to be IDR frames", OFFSET(forced_idr), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, - - { "align", "alignment mode", OFFSET(align), AV_OPT_TYPE_INT, {.i64 = AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_NO_RESTRICTIONS }, AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_ONLY, AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_NO_RESTRICTIONS, VE, .unit = "align" }, - { "64x16", "", 0, AV_OPT_TYPE_CONST, {.i64 = AMF_VIDEO_ENCODER_AV1_ALIGNMENT_MODE_64X16_ONLY }, 0, 0, VE, .unit = "align" }, -diff --git a/libavcodec/amfenc_h264.c b/libavcodec/amfenc_h264.c -index 8edd39c633..959be9eab6 100644 ---- a/libavcodec/amfenc_h264.c -+++ b/libavcodec/amfenc_h264.c -@@ -133,6 +133,7 @@ static const AVOption options[] = { - { "me_half_pel", "Enable ME Half Pixel", OFFSET(me_half_pel), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE }, - { "me_quarter_pel", "Enable ME Quarter Pixel", OFFSET(me_quarter_pel),AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE }, - -+ { "forced_idr", "Force I frames to be IDR frames", OFFSET(forced_idr) , AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, - { "aud", "Inserts AU Delimiter NAL unit", OFFSET(aud) , AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE }, - - -diff --git a/libavcodec/amfenc_hevc.c b/libavcodec/amfenc_hevc.c -index 7b4b2f722d..f9f6f8adb3 100644 ---- a/libavcodec/amfenc_hevc.c -+++ b/libavcodec/amfenc_hevc.c -@@ -100,6 +100,7 @@ static const AVOption options[] = { - { "me_half_pel", "Enable ME Half Pixel", OFFSET(me_half_pel), AV_OPT_TYPE_BOOL,{ .i64 = -1 }, -1, 1, VE }, - { "me_quarter_pel", "Enable ME Quarter Pixel ", OFFSET(me_quarter_pel),AV_OPT_TYPE_BOOL,{ .i64 = -1 }, -1, 1, VE }, - -+ { "forced_idr", "Force I frames to be IDR frames", OFFSET(forced_idr) ,AV_OPT_TYPE_BOOL,{ .i64 = 0 }, 0, 1, VE }, - { "aud", "Inserts AU Delimiter NAL unit", OFFSET(aud) ,AV_OPT_TYPE_BOOL,{ .i64 = -1 }, -1, 1, VE }, - - --- -2.25.1 - diff --git a/patches/FFmpeg/FFmpeg/AMF/03-amfenc-disable-buffering.patch b/patches/FFmpeg/FFmpeg/AMF/03-amfenc-disable-buffering.patch deleted file mode 100644 index 9f46460c..00000000 --- a/patches/FFmpeg/FFmpeg/AMF/03-amfenc-disable-buffering.patch +++ /dev/null @@ -1,43 +0,0 @@ -From d03de2a32c38c84bec7838826228ec194ec1dcf3 Mon Sep 17 00:00:00 2001 -From: Conn O'Griofa -Date: Thu, 24 Nov 2022 06:34:48 +0000 -Subject: [PATCH] amfenc: disable buffering & blocking delay in IPP mode - -When realtime encoding is required, the HW queue and arbitrary -1ms sleep during blocking introduces unnecessary latency, especially -in low FPS situations such as streaming desktop content at a variable -framerate. - -Resolve by disabling buffering and blocking delay if no B-frames are -requested, as is typical for zero latency streaming use cases. ---- - libavcodec/amfenc.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c -index f0c86297eb..529fa2afbb 100644 ---- a/libavcodec/amfenc.c -+++ b/libavcodec/amfenc.c -@@ -274,7 +274,7 @@ static int amf_init_context(AVCodecContext *avctx) - av_unused int ret; - - ctx->hwsurfaces_in_queue = 0; -- ctx->hwsurfaces_in_queue_max = 16; -+ ctx->hwsurfaces_in_queue_max = avctx->max_b_frames > 0 ? 16 : 0; // avoid buffering frames if no B frames are in use - - // configure AMF logger - // the return of these functions indicates old state and do not affect behaviour -@@ -925,7 +925,9 @@ int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) - if (query_output_data_flag == 0) { - if (res_resubmit == AMF_INPUT_FULL || ctx->delayed_drain || (ctx->eof && res_query != AMF_EOF) || (ctx->hwsurfaces_in_queue >= ctx->hwsurfaces_in_queue_max)) { - block_and_wait = 1; -- av_usleep(1000); -+ if (avctx->max_b_frames > 0) { -+ av_usleep(1000); // wait and poll again -+ } - } - } - } while (block_and_wait); --- -2.40.0.windows.1 - diff --git a/patches/FFmpeg/FFmpeg/AMF/04-amfenc-query-timeout.patch b/patches/FFmpeg/FFmpeg/AMF/04-amfenc-query-timeout.patch deleted file mode 100644 index 08ef6829..00000000 --- a/patches/FFmpeg/FFmpeg/AMF/04-amfenc-query-timeout.patch +++ /dev/null @@ -1,53 +0,0 @@ -From e2ebe91219c06b1272c870144448437227d32cf1 Mon Sep 17 00:00:00 2001 -From: Cameron Gutman -Date: Mon, 2 Sep 2024 16:57:36 -0500 -Subject: [PATCH 4/4] amfenc: Use QUERY_TIMEOUT feature to avoid busy looping - ---- - libavcodec/amfenc_av1.c | 2 ++ - libavcodec/amfenc_h264.c | 2 ++ - libavcodec/amfenc_hevc.c | 2 ++ - 3 files changed, 6 insertions(+) - -diff --git a/libavcodec/amfenc_av1.c b/libavcodec/amfenc_av1.c -index 59b097edef..ef000d57f0 100644 ---- a/libavcodec/amfenc_av1.c -+++ b/libavcodec/amfenc_av1.c -@@ -221,6 +221,8 @@ FF_ENABLE_DEPRECATION_WARNINGS - - AMF_ASSIGN_PROPERTY_RATE(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_FRAMERATE, framerate); - -+ AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_QUERY_TIMEOUT, 50); -+ - switch (avctx->profile) { - case AV_PROFILE_AV1_MAIN: - profile = AMF_VIDEO_ENCODER_AV1_PROFILE_MAIN; -diff --git a/libavcodec/amfenc_h264.c b/libavcodec/amfenc_h264.c -index 959be9eab6..b4989874ea 100644 ---- a/libavcodec/amfenc_h264.c -+++ b/libavcodec/amfenc_h264.c -@@ -229,6 +229,8 @@ FF_ENABLE_DEPRECATION_WARNINGS - - AMF_ASSIGN_PROPERTY_RATE(res, ctx->encoder, AMF_VIDEO_ENCODER_FRAMERATE, framerate); - -+ AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_QUERY_TIMEOUT, 50); -+ - switch (avctx->profile) { - case AV_PROFILE_H264_BASELINE: - profile = AMF_VIDEO_ENCODER_PROFILE_BASELINE; -diff --git a/libavcodec/amfenc_hevc.c b/libavcodec/amfenc_hevc.c -index bdd2f273a9..0d35ff455c 100644 ---- a/libavcodec/amfenc_hevc.c -+++ b/libavcodec/amfenc_hevc.c -@@ -195,6 +195,8 @@ FF_ENABLE_DEPRECATION_WARNINGS - - AMF_ASSIGN_PROPERTY_RATE(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_FRAMERATE, framerate); - -+ AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_QUERY_TIMEOUT, 50); -+ - switch (avctx->profile) { - case AV_PROFILE_HEVC_MAIN: - profile = AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN; --- -2.45.2.windows.1 - diff --git a/patches/FFmpeg/FFmpeg/MF/01-mfenc-lowlatency.patch b/patches/FFmpeg/FFmpeg/MF/01-mfenc-lowlatency.patch index 6efc1069..ae31a379 100644 --- a/patches/FFmpeg/FFmpeg/MF/01-mfenc-lowlatency.patch +++ b/patches/FFmpeg/FFmpeg/MF/01-mfenc-lowlatency.patch @@ -1,28 +1,50 @@ -From bf116dd598b4c134e26d1d24b6bd65bc86687b75 Mon Sep 17 00:00:00 2001 -From: Conn O'Griofa -Date: Tue, 3 Jan 2023 17:20:17 +0000 -Subject: [PATCH] mfenc: add low_latency encoder parameter +From: Cameron Gutman +To: ffmpeg-devel@ffmpeg.org +Date: Sat, 2 Aug 2025 23:55:25 -0500 +Message-ID: <20250803045559.1351-1-aicommander@gmail.com> +X-Mailer: git-send-email 2.50.1.windows.1 +MIME-Version: 1.0 +Subject: [FFmpeg-devel] [PATCH] avcodec/mfenc: add low_latency encoder + parameter +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: Conn O'Griofa +Errors-To: ffmpeg-devel-bounces@ffmpeg.org +Sender: "ffmpeg-devel" Implement support for CODECAPI_AVLowLatencyMode property, which is useful for live streaming use cases (and cannot be achieved by selecting any of the low latency "scenario" encoder presets alone). + +Co-authored-by: Conn O'Griofa +Signed-off-by: Cameron Gutman --- libavcodec/mfenc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libavcodec/mfenc.c b/libavcodec/mfenc.c -index bbe78605a9..5f5cc262f7 100644 +index 30531fe3e8..e84ce7bde0 100644 --- a/libavcodec/mfenc.c +++ b/libavcodec/mfenc.c -@@ -54,6 +54,7 @@ typedef struct MFContext { +@@ -64,6 +64,7 @@ typedef struct MFContext { int opt_enc_quality; int opt_enc_scenario; int opt_enc_hw; + int opt_enc_lowlatency; + AVD3D11VADeviceContext* device_hwctx; } MFContext; - static int mf_choose_output_type(AVCodecContext *avctx); -@@ -704,6 +705,9 @@ static int mf_encv_output_adjust(AVCodecContext *avctx, IMFMediaType *type) +@@ -866,6 +867,9 @@ static int mf_encv_output_adjust(AVCodecContext *avctx, IMFMediaType *type) if (c->opt_enc_scenario >= 0) ICodecAPI_SetValue(c->codec_api, &ff_CODECAPI_AVScenarioInfo, FF_VAL_VT_UI4(c->opt_enc_scenario)); @@ -32,7 +54,7 @@ index bbe78605a9..5f5cc262f7 100644 } return 0; -@@ -1278,6 +1282,7 @@ static const AVOption venc_opts[] = { +@@ -1445,6 +1449,7 @@ static const AVOption venc_opts[] = { {"quality", "Quality", OFFSET(opt_enc_quality), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 100, VE}, {"hw_encoding", "Force hardware encoding", OFFSET(opt_enc_hw), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, VE}, @@ -40,6 +62,3 @@ index bbe78605a9..5f5cc262f7 100644 {NULL} }; --- -2.39.0 - diff --git a/patches/FFmpeg/FFmpeg/VAAPI/.keep b/patches/FFmpeg/FFmpeg/VAAPI/.keep new file mode 100644 index 00000000..e69de29b diff --git a/patches/FFmpeg/FFmpeg/VAAPI/01-vaapi-customized-surface-alignment.patch b/patches/FFmpeg/FFmpeg/VAAPI/01-vaapi-customized-surface-alignment.patch deleted file mode 100644 index 30ef5862..00000000 --- a/patches/FFmpeg/FFmpeg/VAAPI/01-vaapi-customized-surface-alignment.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 46b79b10e995b3ee5ba8473dfa28986fdfea5bbc Mon Sep 17 00:00:00 2001 -From: Araz Iusubov -Date: Thu, 21 Mar 2024 18:02:19 +0100 -Subject: [PATCH] avcodec/vaapi_encode: add customized surface alignment - -This commit fixes issues with AMD HEVC encoding. -By default AMD hevc encoder asks for the alignment 64x16, while FFMPEG VAAPI has 16x16. -Adding support for customized surface size from VASurfaceAttribAlignmentSize in VAAPI version 1.21.0 - -Signed-off-by: Araz Iusubov ---- -Suggested-by: Matthew Schwartz -Pulled from: https://patchwork.ffmpeg.org/project/ffmpeg/patch/20240321170219.1487-1-Primeadvice@gmail.com/ -Context: https://github.com/LizardByte/Sunshine/issues/2636 -Support for FFmpeg 7.1 and libva <1.21 by: Cameron Gutman ---- - libavcodec/hw_base_encode.c | 11 +++++++++++ - libavutil/hwcontext.h | 7 +++++++ - libavutil/hwcontext_vaapi.c | 6 ++++++ - 3 files changed, 24 insertions(+) - -diff --git a/libavcodec/hw_base_encode.c b/libavcodec/hw_base_encode.c -index 7b6ec97d3b..8929e430ed 100644 ---- a/libavcodec/hw_base_encode.c -+++ b/libavcodec/hw_base_encode.c -@@ -749,6 +749,17 @@ int ff_hw_base_get_recon_format(FFHWBaseEncodeContext *ctx, const void *hwconfig - av_log(ctx->log_ctx, AV_LOG_DEBUG, "Using %s as format of " - "reconstructed frames.\n", av_get_pix_fmt_name(recon_format)); - -+ if (constraints->log2_alignment) { -+ ctx->surface_width = FFALIGN(ctx->input_frames->width, -+ 1 << (constraints->log2_alignment & 0xf)); -+ ctx->surface_height = FFALIGN(ctx->input_frames->height, -+ 1 << ((constraints->log2_alignment & 0xf0) >> 4)); -+ av_log(ctx->log_ctx, AV_LOG_VERBOSE, "Using customized alignment size " -+ "[%dx%d].\n", -+ (1 << (constraints->log2_alignment & 0xf)), -+ (1 << ((constraints->log2_alignment & 0xf0) >> 4))); -+ } -+ - if (ctx->surface_width < constraints->min_width || - ctx->surface_height < constraints->min_height || - ctx->surface_width > constraints->max_width || -diff --git a/libavutil/hwcontext.h b/libavutil/hwcontext.h -index bac30debae..1eb56aff78 100644 ---- a/libavutil/hwcontext.h -+++ b/libavutil/hwcontext.h -@@ -465,6 +465,13 @@ typedef struct AVHWFramesConstraints { - */ - int max_width; - int max_height; -+ -+ /** -+ * The frame width/height log2 alignment when available -+ * the lower 4 bits, width; another 4 bits, height -+ * (Zero is not applied, use the default value) -+ */ -+ int log2_alignment; - } AVHWFramesConstraints; - - /** -diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c -index 95aa38d9d2..6e53448e35 100644 ---- a/libavutil/hwcontext_vaapi.c -+++ b/libavutil/hwcontext_vaapi.c -@@ -60,6 +60,9 @@ typedef HRESULT (WINAPI *PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory) - #include "pixdesc.h" - #include "pixfmt.h" - -+#if !VA_CHECK_VERSION(1, 21, 0) -+#define VASurfaceAttribAlignmentSize 10 -+#endif - - typedef struct VAAPIDevicePriv { - #if HAVE_VAAPI_X11 -@@ -294,6 +297,9 @@ static int vaapi_frames_get_constraints(AVHWDeviceContext *hwdev, - case VASurfaceAttribMaxHeight: - constraints->max_height = attr_list[i].value.value.i; - break; -+ case VASurfaceAttribAlignmentSize: -+ constraints->log2_alignment = attr_list[i].value.value.i; -+ break; - } - } - if (pix_fmt_count == 0) { --- -2.46.2 - diff --git a/patches/FFmpeg/FFmpeg/VAAPI/02-vaapi-leak.patch b/patches/FFmpeg/FFmpeg/VAAPI/02-vaapi-leak.patch deleted file mode 100644 index c307b2cc..00000000 --- a/patches/FFmpeg/FFmpeg/VAAPI/02-vaapi-leak.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 48a1a12968345bf673db1e1cbb5c64bd3529c50c Mon Sep 17 00:00:00 2001 -From: David Rosca -Date: Tue, 15 Oct 2024 16:49:41 +0200 -Subject: [PATCH] hw_base_encode: Free pictures on close - -Fixes leaking recon surfaces with VAAPI. ---- - libavcodec/hw_base_encode.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/libavcodec/hw_base_encode.c b/libavcodec/hw_base_encode.c -index 7b6ec97d3b..912c707a68 100644 ---- a/libavcodec/hw_base_encode.c -+++ b/libavcodec/hw_base_encode.c -@@ -804,6 +804,11 @@ int ff_hw_base_encode_init(AVCodecContext *avctx, FFHWBaseEncodeContext *ctx) - - int ff_hw_base_encode_close(FFHWBaseEncodeContext *ctx) - { -+ FFHWBaseEncodePicture *pic; -+ -+ for (pic = ctx->pic_start; pic; pic = pic->next) -+ base_encode_pic_free(pic); -+ - av_fifo_freep2(&ctx->encode_fifo); - - av_frame_free(&ctx->frame); --- -2.25.1 - -From c98810ab47fa1cf339b16045e27fbe12b3a19951 Mon Sep 17 00:00:00 2001 -From: Marvin Scholz -Date: Thu, 17 Oct 2024 20:23:40 +0200 -Subject: [PATCH] avcodec/hw_base_encode: fix use after free on close - -The way the linked list of images was freed caused a -use after free, by accessing pic->next after pic was -already freed. - -Regression from 48a1a12968345bf673db1e1cbb5c64bd3529c50c - -Fix CID1633236 ---- - libavcodec/hw_base_encode.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/libavcodec/hw_base_encode.c b/libavcodec/hw_base_encode.c -index 912c707a68..4d8bf4fe71 100644 ---- a/libavcodec/hw_base_encode.c -+++ b/libavcodec/hw_base_encode.c -@@ -804,10 +804,10 @@ int ff_hw_base_encode_init(AVCodecContext *avctx, FFHWBaseEncodeContext *ctx) - - int ff_hw_base_encode_close(FFHWBaseEncodeContext *ctx) - { -- FFHWBaseEncodePicture *pic; -- -- for (pic = ctx->pic_start; pic; pic = pic->next) -+ for (FFHWBaseEncodePicture *pic = ctx->pic_start, *next_pic = pic; pic; pic = next_pic) { -+ next_pic = pic->next; - base_encode_pic_free(pic); -+ } - - av_fifo_freep2(&ctx->encode_fifo); - --- -2.25.1 - diff --git a/patches/FFmpeg/FFmpeg/nv-codec-headers/.keep b/patches/FFmpeg/FFmpeg/nv-codec-headers/.keep new file mode 100644 index 00000000..e69de29b diff --git a/patches/FFmpeg/FFmpeg/nv-codec-headers/01-nvenc-av1-filler.patch b/patches/FFmpeg/FFmpeg/nv-codec-headers/01-nvenc-av1-filler.patch deleted file mode 100644 index 64378f1c..00000000 --- a/patches/FFmpeg/FFmpeg/nv-codec-headers/01-nvenc-av1-filler.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 405addaa964425852ad3c3457d8c29b70885b01a Mon Sep 17 00:00:00 2001 -From: Cameron Gutman -Date: Sun, 27 Oct 2024 22:45:07 -0500 -Subject: [PATCH] avcodec/nvenc: add option to skip padding OBUs - -Some scenarios (such as game streaming or videoconferencing) may use CBR -to strictly cap the maximum encoded bitrate, but they don't mind the -bitrate falling below the target if the encoder doesn't need the -additional headroom. - -Allow users to opt-out of filler data in CBR mode for those usecases -where it is unwanted. - -Signed-off-by: Cameron Gutman ---- - libavcodec/nvenc.c | 2 +- - libavcodec/nvenc.h | 1 + - libavcodec/nvenc_av1.c | 2 ++ - 3 files changed, 4 insertions(+), 1 deletion(-) - -diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c -index 2cce478be0..17dc8ff6ba 100644 ---- a/libavcodec/nvenc.c -+++ b/libavcodec/nvenc.c -@@ -1521,7 +1521,7 @@ static av_cold int nvenc_setup_av1_config(AVCodecContext *avctx) - - av1->idrPeriod = cc->gopLength; - -- if (IS_CBR(cc->rcParams.rateControlMode)) { -+ if (ctx->filler_data && IS_CBR(cc->rcParams.rateControlMode)) { - av1->enableBitstreamPadding = 1; - } - -diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h -index 0130b99369..da206a5bfb 100644 ---- a/libavcodec/nvenc.h -+++ b/libavcodec/nvenc.h -@@ -285,6 +285,7 @@ typedef struct NvencContext - int lookahead_level; - int unidir_b; - int split_encode_mode; -+ int filler_data; - } NvencContext; - - int ff_nvenc_encode_init(AVCodecContext *avctx); -diff --git a/libavcodec/nvenc_av1.c b/libavcodec/nvenc_av1.c -index 79253cff66..5764e4214d 100644 ---- a/libavcodec/nvenc_av1.c -+++ b/libavcodec/nvenc_av1.c -@@ -149,6 +149,8 @@ static const AVOption options[] = { - OFFSET(extra_sei), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE }, - { "a53cc", "Use A53 Closed Captions (if available)", OFFSET(a53_cc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE }, - { "s12m_tc", "Use timecode (if available)", OFFSET(s12m_tc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE }, -+ { "filler_data", "Use filler data to ensure CBR bitrate is strictly adhered to", -+ OFFSET(filler_data), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE }, - #ifdef NVENC_HAVE_LOOKAHEAD_LEVEL - { "lookahead_level", "Specifies the lookahead level. Higher level may improve quality at the expense of performance.", - OFFSET(lookahead_level), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, NV_ENC_LOOKAHEAD_LEVEL_AUTOSELECT, VE, .unit = "lookahead_level" }, --- -2.43.0.windows.1 - diff --git a/third-party/FFmpeg/FFmpeg b/third-party/FFmpeg/FFmpeg index c2184b65..7eaa0f79 160000 --- a/third-party/FFmpeg/FFmpeg +++ b/third-party/FFmpeg/FFmpeg @@ -1 +1 @@ -Subproject commit c2184b65d214d60f2d3df86a11ca502567a3d134 +Subproject commit 7eaa0f799ab30e723209cc64777f10063ae55a23