This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 8d1f247ec11d16774675b218c9442af1ac5cd0da Author: James Almer <[email protected]> AuthorDate: Sat Jan 24 14:09:20 2026 -0300 Commit: James Almer <[email protected]> CommitDate: Thu Jan 29 21:09:02 2026 -0300 avformat/cafenc: fix setting frame count fields in Packet Table Description st->duration is not guaranteed to be set, so store the sum of packet durations instead. Also, set mPrimingFrames and mRemainderFrames to correct values. Based on a patch by Jun Zhao. Signed-off-by: James Almer <[email protected]> --- libavformat/cafenc.c | 19 +++++++++++++------ tests/ref/fate/caf-alac-remux | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/libavformat/cafenc.c b/libavformat/cafenc.c index 89ecb51e53..e229358970 100644 --- a/libavformat/cafenc.c +++ b/libavformat/cafenc.c @@ -32,9 +32,10 @@ typedef struct { int64_t data; + int64_t total_duration; + int64_t packets; int size_buffer_size; int size_entries_used; - int packets; } CAFContext; static uint32_t codec_flags(enum AVCodecID codec_id) { @@ -235,6 +236,7 @@ static int caf_write_packet(AVFormatContext *s, AVPacket *pkt) } pkt_sizes[caf->size_entries_used++] = pkt->size & 127; caf->packets++; + caf->total_duration += pkt->duration; } avio_write(s->pb, pkt->data, pkt->size); return 0; @@ -253,9 +255,14 @@ static int caf_write_trailer(AVFormatContext *s) avio_seek(pb, caf->data, SEEK_SET); avio_wb64(pb, file_size - caf->data - 8); if (!par->block_align) { - int packet_size = samples_per_packet(par); + unsigned packet_size = samples_per_packet(par); + int64_t valid_frames = (packet_size ? caf->packets * packet_size : caf->total_duration); + unsigned remainder_frames = valid_frames > caf->total_duration + ? valid_frames - caf->total_duration : 0; + valid_frames -= par->initial_padding; + valid_frames -= remainder_frames; if (!packet_size) { - packet_size = st->duration / (caf->packets - 1); + packet_size = caf->total_duration / (caf->packets - 1); avio_seek(pb, FRAME_SIZE_OFFSET, SEEK_SET); avio_wb32(pb, packet_size); } @@ -263,9 +270,9 @@ static int caf_write_trailer(AVFormatContext *s) ffio_wfourcc(pb, "pakt"); avio_wb64(pb, caf->size_entries_used + 24U); avio_wb64(pb, caf->packets); ///< mNumberPackets - avio_wb64(pb, caf->packets * packet_size); ///< mNumberValidFrames - avio_wb32(pb, 0); ///< mPrimingFrames - avio_wb32(pb, 0); ///< mRemainderFrames + avio_wb64(pb, valid_frames); ///< mNumberValidFrames + avio_wb32(pb, par->initial_padding); ///< mPrimingFrames + avio_wb32(pb, remainder_frames); ///< mRemainderFrames avio_write(pb, st->priv_data, caf->size_entries_used); } } diff --git a/tests/ref/fate/caf-alac-remux b/tests/ref/fate/caf-alac-remux index 2a1d24092b..63987239db 100644 --- a/tests/ref/fate/caf-alac-remux +++ b/tests/ref/fate/caf-alac-remux @@ -1,4 +1,4 @@ -9ef40186fb3e24789df03f8c08110486 *tests/data/fate/caf-alac-remux.caf +1f3ac6e905aa6bfee0d35c19a2400c26 *tests/data/fate/caf-alac-remux.caf 1292684 tests/data/fate/caf-alac-remux.caf #extradata 0: 36, 0x562b05d8 #tb 0: 1/44100 _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
