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".