PR #23961 opened by Kacper Michajłow (kasper93) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23961 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23961.patch
The spec string is owned by the option list and re-read for every stream matching the same -force_key_frames, so terminating entries in place truncated it for later streams. From b5218d6c130bdef0df8d6bea1b5b559de83c1555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= <[email protected]> Date: Thu, 30 Jul 2026 14:47:03 +0200 Subject: [PATCH] fftools/ffmpeg_mux_init: don't split forced keyframe spec in place MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The spec string is owned by the option list and re-read for every stream matching the same -force_key_frames, so terminating entries in place truncated it for later streams. Signed-off-by: Kacper Michajłow <[email protected]> --- fftools/ffmpeg_mux_init.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c index 2a9146e60c..393ed9b668 100644 --- a/fftools/ffmpeg_mux_init.c +++ b/fftools/ffmpeg_mux_init.c @@ -3315,19 +3315,22 @@ static int compare_int64(const void *a, const void *b) static int parse_forced_key_frames(void *log, KeyframeForceCtx *kf, const Muxer *mux, const char *spec) { - const char *p; int n = 1, i, ret, size, index = 0; int64_t t, *pts; - for (p = spec; *p; p++) + for (const char *p = spec; *p; p++) if (*p == ',') n++; size = n; - pts = av_malloc_array(size, sizeof(*pts)); - if (!pts) - return AVERROR(ENOMEM); - p = spec; + char *spec_dup = av_strdup(spec); + pts = av_malloc_array(size, sizeof(*pts)); + if (!spec_dup || !pts) { + ret = AVERROR(ENOMEM); + goto fail; + } + + char *p = spec_dup; for (i = 0; i < n; i++) { char *next = strchr(p, ','); @@ -3345,8 +3348,10 @@ static int parse_forced_key_frames(void *log, KeyframeForceCtx *kf, } size += nb_ch - 1; pts = av_realloc_f(pts, size, sizeof(*pts)); - if (!pts) - return AVERROR(ENOMEM); + if (!pts) { + ret = AVERROR(ENOMEM); + goto fail; + } if (p[8]) { ret = av_parse_time(&t, p + 8, 1); @@ -3384,8 +3389,11 @@ static int parse_forced_key_frames(void *log, KeyframeForceCtx *kf, kf->nb_pts = size; kf->pts = pts; + av_freep(&spec_dup); + return 0; fail: + av_freep(&spec_dup); av_freep(&pts); return ret; } -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
