From f123e2a4855b3c2aa2b1f3e4d9ef97d6a0ea823d61248e5db26b01cd8dd22123 Mon Sep 17 00:00:00 2001
From: OBS User unknown <null@suse.de>
Date: Mon, 5 Aug 2024 10:26:50 +0000
Subject: [PATCH] 
 [info=8c17f41823d4600460b89dd35ff0365d154e30b5ae64f6d51ca6e5862223987c]

OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/ffmpeg-7?expand=0&rev=11
---
 _scmsync.obsinfo           |   4 +-
 build.specials.obscpio     |   2 +-
 ffmpeg-7-fix-crashes.patch | 113 +++++++++++++++++++++++++++++++++++++
 ffmpeg-7.changes           |   7 +++
 ffmpeg-7.spec              |   2 +
 5 files changed, 125 insertions(+), 3 deletions(-)
 create mode 100644 ffmpeg-7-fix-crashes.patch

diff --git a/_scmsync.obsinfo b/_scmsync.obsinfo
index 20f2056..d020f1b 100644
--- a/_scmsync.obsinfo
+++ b/_scmsync.obsinfo
@@ -1,4 +1,4 @@
-mtime: 1722482697
-commit: c11c165366f5efd4f76b39c067ee40963b935711f86e1d14fd08ef565763b0fc
+mtime: 1722848252
+commit: 8c17f41823d4600460b89dd35ff0365d154e30b5ae64f6d51ca6e5862223987c
 url: https://src.opensuse.org/jengelh/ffmpeg-7
 revision: master
diff --git a/build.specials.obscpio b/build.specials.obscpio
index 0f7d4b5..d733dba 100644
--- a/build.specials.obscpio
+++ b/build.specials.obscpio
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:6bcfae11b22448531746b03ddf00ec11a89ee5e2b22f8b39616c8af2a04f2d7c
+oid sha256:726930aaefbd6951fbdf48da5dba714f1165151d50e8d3567a5fb4cd6256110b
 size 256
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 <jamrial@gmail.com>
+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 <jamrial@gmail.com>
+---
+ 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.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 <qzhao@suse.com>
+
+- 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 <qzhao@suse.com>
 
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