diff --git a/ffmpeg-7-fix-crashes.patch b/ffmpeg-7-fix-crashes.patch new file mode 100644 index 0000000..e5eff6c --- /dev/null +++ b/ffmpeg-7-fix-crashes.patch @@ -0,0 +1,113 @@ +From 5b87869c09cece1583e74b6f796aa825a4765631 Mon Sep 17 00:00:00 2001 +From: James Almer +Date: Wed, 31 Jul 2024 22:19:53 -0300 +Subject: [PATCH] avformat/mov: fix track handling when mixing IAMF and video + tracks + +Fixes crashes when muxing the two together. + +Signed-off-by: James Almer +--- + libavformat/movenc.c | 37 ++++++++++++++++++++++++++++--------- + 1 file changed, 28 insertions(+), 9 deletions(-) + +diff --git a/libavformat/movenc.c b/libavformat/movenc.c +index e40948edb8..d20d0bc064 100644 +--- a/libavformat/movenc.c ++++ b/libavformat/movenc.c +@@ -7149,7 +7149,9 @@ static int mov_create_dvd_sub_decoder_specific_info(MOVTrack *track, + static int mov_init_iamf_track(AVFormatContext *s) + { + MOVMuxContext *mov = s->priv_data; +- MOVTrack *track = &mov->tracks[0]; // IAMF if present is always the first track ++ MOVTrack *track; ++ IAMFContext *iamf; ++ int first_iamf_idx = INT_MAX, last_iamf_idx = 0; + int nb_audio_elements = 0, nb_mix_presentations = 0; + int ret; + +@@ -7171,24 +7173,24 @@ static int mov_init_iamf_track(AVFormatContext *s) + return AVERROR(EINVAL); + } + +- track->iamf = av_mallocz(sizeof(*track->iamf)); +- if (!track->iamf) ++ iamf = av_mallocz(sizeof(*iamf)); ++ if (!iamf) + return AVERROR(ENOMEM); + ++ + for (int i = 0; i < s->nb_stream_groups; i++) { + const AVStreamGroup *stg = s->stream_groups[i]; + switch(stg->type) { + case AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT: + for (int j = 0; j < stg->nb_streams; j++) { +- track->first_iamf_idx = FFMIN(stg->streams[j]->index, track->first_iamf_idx); +- track->last_iamf_idx = FFMAX(stg->streams[j]->index, track->last_iamf_idx); +- stg->streams[j]->priv_data = track; ++ first_iamf_idx = FFMIN(stg->streams[j]->index, first_iamf_idx); ++ last_iamf_idx = FFMAX(stg->streams[j]->index, last_iamf_idx); + } + +- ret = ff_iamf_add_audio_element(track->iamf, stg, s); ++ ret = ff_iamf_add_audio_element(iamf, stg, s); + break; + case AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION: +- ret = ff_iamf_add_mix_presentation(track->iamf, stg, s); ++ ret = ff_iamf_add_mix_presentation(iamf, stg, s); + break; + default: + av_assert0(0); +@@ -7197,8 +7199,20 @@ static int mov_init_iamf_track(AVFormatContext *s) + return ret; + } + ++ track = &mov->tracks[first_iamf_idx]; ++ track->iamf = iamf; ++ track->first_iamf_idx = first_iamf_idx; ++ track->last_iamf_idx = last_iamf_idx; + track->tag = MKTAG('i','a','m','f'); + ++ for (int i = 0; i < s->nb_stream_groups; i++) { ++ AVStreamGroup *stg = s->stream_groups[i]; ++ if (stg->type != AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT) ++ continue; ++ for (int j = 0; j < stg->nb_streams; j++) ++ stg->streams[j]->priv_data = track; ++ } ++ + ret = avio_open_dyn_buf(&track->iamf_buf); + if (ret < 0) + return ret; +@@ -7209,6 +7223,7 @@ static int mov_init_iamf_track(AVFormatContext *s) + static int mov_init(AVFormatContext *s) + { + MOVMuxContext *mov = s->priv_data; ++ int has_iamf = 0; + int i, ret; + + mov->fc = s; +@@ -7359,6 +7374,7 @@ static int mov_init(AVFormatContext *s) + } + st->priv_data = st; + } ++ has_iamf = 1; + + if (!mov->nb_tracks) // We support one track for the entire IAMF structure + mov->nb_tracks++; +@@ -7455,8 +7471,11 @@ static int mov_init(AVFormatContext *s) + for (int j = 0, i = 0; j < s->nb_streams; j++) { + AVStream *st = s->streams[j]; + +- if (st != st->priv_data) ++ if (st != st->priv_data) { ++ if (has_iamf) ++ i += has_iamf--; + continue; ++ } + st->priv_data = &mov->tracks[i++]; + } + +-- +2.41.0 + diff --git a/ffmpeg-7.0.tar.xz b/ffmpeg-7.0.tar.xz index ba44487..58bb59e 100644 Binary files a/ffmpeg-7.0.tar.xz and b/ffmpeg-7.0.tar.xz differ diff --git a/ffmpeg-7.changes b/ffmpeg-7.changes index d859277..2ec2c96 100644 --- a/ffmpeg-7.changes +++ b/ffmpeg-7.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Sat Aug 3 08:52:26 UTC 2024 - Cliff Zhao + +- Add ffmpeg-7-fix-crashes.patch: + Backporting 5b87869c from upstream, fix track handling when mixing + IAMF and video tracks, Fixes crashes when muxing the two together. + ------------------------------------------------------------------- Tue Jul 5 14:18:52 UTC 2024 - Cliff Zhao diff --git a/ffmpeg-7.spec b/ffmpeg-7.spec index 9129b4c..d554c6b 100644 --- a/ffmpeg-7.spec +++ b/ffmpeg-7.spec @@ -112,6 +112,7 @@ Patch91: ffmpeg-dlopen-openh264.patch Patch92: ffmpeg-7-CVE-2024-32228.patch Patch93: ffmpeg-7-CVE-2024-32230.patch Patch94: ffmpeg-7-CVE-2024-32229.patch +Patch95: ffmpeg-7-fix-crashes.patch BuildRequires: ladspa-devel BuildRequires: libgsm-devel BuildRequires: libmp3lame-devel >= 3.98.3 @@ -827,6 +828,7 @@ Patch91: ffmpeg-dlopen-openh264.patch Patch92: ffmpeg-7-CVE-2024-32228.patch Patch93: ffmpeg-7-CVE-2024-32230.patch Patch94: ffmpeg-7-CVE-2024-32229.patch +Patch95: ffmpeg-7-fix-crashes.patch BuildRequires: c_compiler Requires: this-is-only-for-build-envs diff --git a/ffmpeg-dlopen-headers.tar.xz b/ffmpeg-dlopen-headers.tar.xz index c72db64..e7ece3c 100644 Binary files a/ffmpeg-dlopen-headers.tar.xz and b/ffmpeg-dlopen-headers.tar.xz differ