avformat/mov: fix cases where we discard iamf packets from enabled streams

Given the entire iamf struct is inside a single Track, if the first iamf stream
(which is the one sharing the index and id from the Track) was to be disabled,
then packets from every iamf stream would be discarded.
Fix this by actually going through the entire iamf Sample and discarding those
from the disabled streams only.

Signed-off-by: James Almer <jamrial@gmail.com>
(cherry picked from commit 16ee3d8d99)
This commit is contained in:
James Almer
2026-02-27 10:41:31 -03:00
parent 9434a8349d
commit 67641670cc
3 changed files with 11 additions and 2 deletions

View File

@@ -94,6 +94,9 @@ static int audio_frame_obu(AVFormatContext *s, const IAMFDemuxContext *c,
memcpy(side_data, c->recon, c->recon_size);
}
if (st->discard == AVDISCARD_ALL)
pkt->flags |= AV_PKT_FLAG_DISCARD;
pkt->stream_index = st->index;
return 0;
}

View File

@@ -10114,7 +10114,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
sample->size = FFMIN(sample->size, (mov->next_root_atom - sample->pos));
}
if (st->discard != AVDISCARD_ALL) {
if (st->discard != AVDISCARD_ALL || sc->iamf) {
int64_t ret64 = avio_seek(sc->pb, sample->pos, SEEK_SET);
if (ret64 != sample->pos) {
av_log(mov->fc, AV_LOG_ERROR, "stream %d, offset 0x%"PRIx64": partial file\n",
@@ -10149,6 +10149,12 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
return ret;
}
size -= ret;
if (pkt->flags & AV_PKT_FLAG_DISCARD) {
av_packet_unref(pkt);
ret = 0;
continue;
}
pkt->pts = pts; pkt->dts = dts;
pkt->pos = pos; pkt->flags |= flags;
pkt->duration = duration;

View File

@@ -32,7 +32,7 @@
#include "version_major.h"
#define LIBAVFORMAT_VERSION_MINOR 1
#define LIBAVFORMAT_VERSION_MICRO 101
#define LIBAVFORMAT_VERSION_MICRO 102
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \