From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 9E8E44D7F6 for ; Fri, 28 Nov 2025 14:20:47 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'VsvH9XZpTWd3eaW5mjzTyIPOP8iHvGJH12RU5B87fpw=', expected b'IbrTh1aJKQgRcqTn6DzuqOPsJpdBTTyOroGofaCcNFg=')) header.d=ffmpeg.org header.i=@ffmpeg.org header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1764339630; h=mime-version : to : date : message-id : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=VsvH9XZpTWd3eaW5mjzTyIPOP8iHvGJH12RU5B87fpw=; b=kAJ7oheL+sp6jGhig+ZJ8LMNA3WMB7gvII1YPTEEbSLWhg7NsW3V4AIfnU9iIOloTNSEJ x/hnLP6GtdT5z85WatYjn19MCzS1MKln7ElIAtK3mwJHKU/Y4rtZP6Brik5GXVGcfyeS47w dE6j/JaRocx2zBnCBSt/06+BCxv7dcoohpu6gOz7e7EW2Mu9XNeb/L/fnZ77Kg4zRQYY519 C2XlUSxJ5ttyyRbo8ZUBVtE9aBS7qrWHCZmBsfAVZsnjyP5071n9yZx1yDmiMasEmvBSlkB kitQ70+TDihpEwl9qOig6JCjW4XfdBlgGEQVyLGrBmxDlqrroy/1erFiN2FQ== Received: from [172.19.0.3] (unknown [172.19.0.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 4DE846902BC; Fri, 28 Nov 2025 16:20:30 +0200 (EET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1764339615; b=by9BBuo6WPG0NB7HmbyOhzgX6crJ67CrL3P1ABWedsmB+65kPRG3TXW/AC98YN7ar7MZ0 CqR1cxl9FSvTBzRiCn9XKwPo4FRLqufPMEEP70f8RZVXRFicWG/BxHh2drTHOnPTzci3d0K KnDgQIDGC0h9FIJcjF20R6utK0e/Be5xQcrA2eRFpMyxm8aQ94q6blRxKzhYtg6dBhkf6do 18RETQhtlJF3wRuX7y915+k4S7qeNUG3cudH3+48uP4XjLgdLz8OB0GlrZEyled3PF0E6t6 TvjyjvS0z8b4lAnc9f+C9XUsyK0VSrfW7jM5Fk1YR0jPy8MVPYFp+OL9csTw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1764339615; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=0mbCHGDb+bq4odmztyw9UAGw//o76v3ajPzt0m8ROD0=; b=kvitqCLYYDIft1hwklFiGLPT00xriawNDNUnLAIvUkcCrGJZPAIsaecUfCVRHd6SEaqup G06g4VxdvNYp/JodKkFTtGbHmsxKO+V4KcUG6CFzZxnKsaeWm1By3vCCQ9c+203tITfyumr 3ovODKY+98rMFJhfaTIKPvQYF49HdVkEvRjBU0UZ3h75SR08DOoYcLf7I7gOCcx5C7fuMfM sGFdkafQMsBbl2KTf1UyLILzX6PPu2zL399beeUNmhd/4GQ4aLk6tzWwxSRIeo2TSE3PfKo jAmoxsxT+yky7DL1AMN++fmKJr8DVOklwrYpQg2qlf9bThpHw7Q7m5n2Hwqg== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none; dmarc=pass header.from=ffmpeg.org policy.dmarc=quarantine Authentication-Results: ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=ffmpeg.org policy.dmarc=quarantine DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1764339607; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=IbrTh1aJKQgRcqTn6DzuqOPsJpdBTTyOroGofaCcNFg=; b=2G6krQc0AozI+1XWt63Tkny5rUbdvwGWJTmKqNhbLrV7othxcXD6+VfnHJ/hvw11TSjHW bpYtNmb8ZYIZniem8CuhAnZ9YEC28vJZrAafuaIIfuJBsMO3tpepPwRw55njXysj2lLrK28 yWDUHr2dj8CVGprMgoWp5kvGFjcuIPMPzwAlfla5CY7UdT1OArS8GedoRDilIPrnpVkUEgy SSLJuDFBCMjczSY3GkWqN5spuihltmH3ZlSXhqeuODdWc0FjNDydxcZHdJAkSZ4GteKb0Ox wEvtJj9Z4mVrSyqrYn30kDJa4RjDEeUtFqpcztKv9+aWDizWhKoQO6TMlYFA== Received: from 55ca25703178 (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id A0EFF6900CD for ; Fri, 28 Nov 2025 16:20:07 +0200 (EET) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Fri, 28 Nov 2025 14:20:07 -0000 Message-ID: <176433960780.39.7694841798788473584@2cb04c0e5124> Message-ID-Hash: 2OSIHBYCBCIG3K3R65XZWQ6RLHDXI7NP X-Message-ID-Hash: 2OSIHBYCBCIG3K3R65XZWQ6RLHDXI7NP X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] fftools/ffmpeg: add force key frame by scdet metadata support (PR #21040) List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Zhao Zhili via ffmpeg-devel Cc: Zhao Zhili Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #21040 opened by Zhao Zhili (quink) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21040 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21040.patch For example: ./ffmpeg -hwaccel videotoolbox \ -i input.mp4 -c:a copy \ -vf scdet=threshold=10 \ -c:v h264_videotoolbox \ -force_key_frames scd_metadata \ -g 1000 -t 30 output.mp4 >>From c07193ae1b9bba6131c9292e6c92a5bdd95fff4e Mon Sep 17 00:00:00 2001 From: Zhao Zhili Date: Fri, 28 Nov 2025 11:17:05 +0800 Subject: [PATCH] fftools/ffmpeg: add force key frame by scdet metadata support For example: ./ffmpeg -hwaccel videotoolbox \ -i input.mp4 -c:a copy \ -vf scdet=threshold=10 \ -c:v h264_videotoolbox \ -force_key_frames scd_metadata \ -g 1000 -t 30 output.mp4 --- doc/ffmpeg.texi | 9 +++++++++ fftools/ffmpeg.h | 2 ++ fftools/ffmpeg_enc.c | 3 +++ fftools/ffmpeg_mux_init.c | 2 ++ 4 files changed, 16 insertions(+) diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi index 3daf2f7ec2..2dae6632bc 100644 --- a/doc/ffmpeg.texi +++ b/doc/ffmpeg.texi @@ -1665,6 +1665,7 @@ Force video tag/fourcc. This is an alias for @code{-tag:v}. @item -force_key_frames[:@var{stream_specifier}] @var{time}[,@var{time}...] (@emph{output,per-stream}) @item -force_key_frames[:@var{stream_specifier}] expr:@var{expr} (@emph{output,per-stream}) @item -force_key_frames[:@var{stream_specifier}] source (@emph{output,per-stream}) +@item -force_key_frames[:@var{stream_specifier}] scd_metadata (@emph{output,per-stream}) @var{force_key_frames} can take arguments of the following form: @@ -1728,6 +1729,14 @@ the current frame being encoded is marked as a key frame in its source. In cases where this particular source frame has to be dropped, enforce the next available frame to become a key frame instead. +@item scd_metadata +If the argument is @code{scd_metadata}, ffmpeg will force a key frame if +the current frame contains a metadata entry with the key @code{lavfi.scd.time}. +The metadata can be added by filters like @code{scdet} and @code{scdet_vulkan}. +Avoid inserting filters that duplicate frames after @code{scdet}, as this can +cause duplicate metadata for multiple frames and repeated insertion of key +frames. + @end table Note that forcing too many keyframes is very harmful for the lookahead diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index cc2ea1a56e..7720dd9c59 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -602,6 +602,8 @@ enum { #if FFMPEG_OPT_FORCE_KF_SOURCE_NO_DROP KF_FORCE_SOURCE_NO_DROP = 2, #endif + // force keyframe if lavfi.scd.time metadata is set + KF_FORCE_SCD_METADATA = 3, }; typedef struct KeyframeForceCtx { diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c index 8f07a10848..0f7d961472 100644 --- a/fftools/ffmpeg_enc.c +++ b/fftools/ffmpeg_enc.c @@ -768,6 +768,9 @@ static enum AVPictureType forced_kf_apply(void *logctx, KeyframeForceCtx *kf, } } else if (kf->type == KF_FORCE_SOURCE && (frame->flags & AV_FRAME_FLAG_KEY)) { goto force_keyframe; + } else if (kf->type == KF_FORCE_SCD_METADATA && + av_dict_get(frame->metadata, "lavfi.scd.time", NULL, 0)) { + goto force_keyframe; } return AV_PICTURE_TYPE_NONE; diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c index bcbbee9126..194a87875d 100644 --- a/fftools/ffmpeg_mux_init.c +++ b/fftools/ffmpeg_mux_init.c @@ -3279,6 +3279,8 @@ static int process_forced_keyframes(Muxer *mux, const OptionsContext *o) "-force_key_frames is deprecated, use just 'source'\n"); ost->kf.type = KF_FORCE_SOURCE; #endif + } else if (!strcmp(forced_keyframes, "scd_metadata")) { + ost->kf.type = KF_FORCE_SCD_METADATA; } else { int ret = parse_forced_key_frames(ost, &ost->kf, mux, forced_keyframes); if (ret < 0) -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org