From e03136e6814ec0aa6596134df6719b05b80be178 Mon Sep 17 00:00:00 2001 From: ireader Date: Sat, 7 Sep 2024 10:01:41 +0800 Subject: [PATCH] fix: #352 mov elst segment duration timescale --- libmov/source/mov-elst.c | 8 ++++---- libmov/source/mov-internal.h | 4 ++-- libmov/source/mov-reader.c | 2 +- libmov/source/mov-tfdt.c | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libmov/source/mov-elst.c b/libmov/source/mov-elst.c index e7497ce0..8e1c5802 100644 --- a/libmov/source/mov-elst.c +++ b/libmov/source/mov-elst.c @@ -105,7 +105,7 @@ size_t mov_write_elst(const struct mov_t* mov) return size; } -void mov_apply_elst(struct mov_track_t *track) +void mov_apply_elst(struct mov_track_t *track, uint32_t timescale) { size_t i; @@ -116,13 +116,13 @@ void mov_apply_elst(struct mov_track_t *track) { if (-1 == track->elst[i].media_time) { - track->samples[0].dts = track->elst[i].segment_duration; + track->samples[0].dts = track->elst[i].segment_duration * track->mdhd.timescale / timescale; // movie timescale -> track timescale track->samples[0].pts = track->samples[0].dts; } } } -void mov_apply_elst_tfdt(struct mov_track_t *track) +void mov_apply_elst_tfdt(struct mov_track_t *track, uint32_t timescale) { size_t i; @@ -130,7 +130,7 @@ void mov_apply_elst_tfdt(struct mov_track_t *track) { if (-1 == track->elst[i].media_time) { - track->tfdt_dts += track->elst[i].segment_duration; + track->tfdt_dts += track->elst[i].segment_duration * track->mdhd.timescale / timescale; // movie timescale -> track timescale } } } diff --git a/libmov/source/mov-internal.h b/libmov/source/mov-internal.h index 38f9c7fb..d8cbe423 100644 --- a/libmov/source/mov-internal.h +++ b/libmov/source/mov-internal.h @@ -307,11 +307,11 @@ uint32_t mov_build_stts(struct mov_track_t* track); uint32_t mov_build_ctts(struct mov_track_t* track); uint32_t mov_build_stco(struct mov_track_t* track); void mov_apply_stco(struct mov_track_t* track); -void mov_apply_elst(struct mov_track_t *track); +void mov_apply_elst(struct mov_track_t *track, uint32_t timescale); void mov_apply_stts(struct mov_track_t* track); void mov_apply_ctts(struct mov_track_t* track); void mov_apply_stss(struct mov_track_t* track); -void mov_apply_elst_tfdt(struct mov_track_t *track); +void mov_apply_elst_tfdt(struct mov_track_t *track, uint32_t timescale); void mov_write_size(const struct mov_t* mov, uint64_t offset, size_t size); diff --git a/libmov/source/mov-reader.c b/libmov/source/mov-reader.c index 7ade5a65..b558436b 100755 --- a/libmov/source/mov-reader.c +++ b/libmov/source/mov-reader.c @@ -103,7 +103,7 @@ static int mov_read_trak(struct mov_t* mov, const struct mov_box_t* box) if (mov->track->sample_count > 0) { mov_apply_stco(mov->track); - mov_apply_elst(mov->track); + mov_apply_elst(mov->track, mov->mvhd.timescale); mov_apply_stts(mov->track); mov_apply_ctts(mov->track); mov_apply_stss(mov->track); diff --git a/libmov/source/mov-tfdt.c b/libmov/source/mov-tfdt.c index 2ed4865a..994e1b75 100644 --- a/libmov/source/mov-tfdt.c +++ b/libmov/source/mov-tfdt.c @@ -17,7 +17,7 @@ int mov_read_tfdt(struct mov_t* mov, const struct mov_box_t* box) mov->track->tfdt_dts = mov_buffer_r32(&mov->io); /* baseMediaDecodeTime */ // baseMediaDecodeTime + ELST start offset - mov_apply_elst_tfdt(mov->track); + mov_apply_elst_tfdt(mov->track, mov->mvhd.timescale); (void)box; return mov_buffer_error(&mov->io);