We only care about the prft timestamp of the first sample in each chunk, so
no need to store every single one within each MOVIentry.

Should reduce memory usage.

Signed-off-by: James Almer <jamr...@gmail.com>
---
 libavformat/movenc.c | 23 +++++++++++++----------
 libavformat/movenc.h |  3 ++-
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 85df5d1374..b748b92314 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -4675,11 +4675,11 @@ static int mov_write_prft_tag(AVIOContext *pb, 
MOVMuxContext *mov, int tracks)
     }
 
     if (mov->write_prft == MOV_PRFT_SRC_WALLCLOCK) {
-        if (first_track->cluster[0].prft.wallclock) {
+        if (first_track->prft.wallclock) {
             /* Round the NTP time to whole milliseconds. */
-            ntp_ts = 
ff_get_formatted_ntp_time((first_track->cluster[0].prft.wallclock / 1000) * 
1000 +
+            ntp_ts = ff_get_formatted_ntp_time((first_track->prft.wallclock / 
1000) * 1000 +
                                                NTP_OFFSET_US);
-            flags = first_track->cluster[0].prft.flags;
+            flags = first_track->prft.flags;
         } else
             ntp_ts = ff_get_formatted_ntp_time(ff_ntp_time());
     } else if (mov->write_prft == MOV_PRFT_SRC_PTS) {
@@ -5391,10 +5391,8 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket 
*pkt)
     AVIOContext *pb = s->pb;
     MOVTrack *trk = &mov->tracks[pkt->stream_index];
     AVCodecParameters *par = trk->par;
-    AVProducerReferenceTime *prft;
     unsigned int samples_in_chunk = 0;
     int size = pkt->size, ret = 0, offset = 0;
-    int prft_size;
     uint8_t *reformatted_data = NULL;
 
     ret = check_pkt(s, pkt);
@@ -5675,11 +5673,16 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket 
*pkt)
         trk->has_disposable++;
     }
 
-    prft = (AVProducerReferenceTime *)av_packet_get_side_data(pkt, 
AV_PKT_DATA_PRFT, &prft_size);
-    if (prft && prft_size == sizeof(AVProducerReferenceTime))
-        memcpy(&trk->cluster[trk->entry].prft, prft, prft_size);
-    else
-        memset(&trk->cluster[trk->entry].prft, 0, 
sizeof(AVProducerReferenceTime));
+    if (!trk->entry) {
+        /* We only want the prft for the first sample in a chunk */
+        int prft_size;
+        AVProducerReferenceTime *prft =
+            (AVProducerReferenceTime *)av_packet_get_side_data(pkt, 
AV_PKT_DATA_PRFT, &prft_size);
+        if (prft && prft_size == sizeof(trk->prft))
+            memcpy(&trk->prft, prft, prft_size);
+        else
+            memset(&trk->prft, 0, sizeof(trk->prft));
+    }
 
     trk->entry++;
     trk->sample_count += samples_in_chunk;
diff --git a/libavformat/movenc.h b/libavformat/movenc.h
index 997b2d61c0..d394bf757f 100644
--- a/libavformat/movenc.h
+++ b/libavformat/movenc.h
@@ -56,7 +56,6 @@ typedef struct MOVIentry {
 #define MOV_PARTIAL_SYNC_SAMPLE 0x0002
 #define MOV_DISPOSABLE_SAMPLE   0x0004
     uint32_t     flags;
-    AVProducerReferenceTime prft;
 } MOVIentry;
 
 typedef struct HintSample {
@@ -160,6 +159,8 @@ typedef struct MOVTrack {
 
     MOVMuxCencContext cenc;
 
+    AVProducerReferenceTime prft;
+
     uint32_t palette[AVPALETTE_COUNT];
     int pal_done;
 
-- 
2.25.2

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to