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]

Reply via email to