---
libavformat/movenc.c | 22 +++++++++++++++-------
1 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index fa6e957..a8c68af 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1464,10 +1464,15 @@ static int mov_write_edts_tag(AVIOContext *pb, MOVTrack
*track)
track->timescale, AV_ROUND_UP);
int version = duration < INT32_MAX ? 0 : 1;
int entry_size, entry_count, size;
- int64_t delay, start_ct = track->cluster[0].cts;
- delay = av_rescale_rnd(track->cluster[0].dts + start_ct, MOV_TIMESCALE,
- track->timescale, AV_ROUND_DOWN);
- version |= delay < INT32_MAX ? 0 : 1;
+ int64_t delay, trim = 0;
+ delay = av_rescale_rnd(track->cluster[0].dts + track->cluster[0].cts,
+ MOV_TIMESCALE, track->timescale, AV_ROUND_DOWN);
+ if (track->cluster[0].cts) {
+ trim = track->cluster[0].cts;
+ } else if (track->cluster[0].dts < 0) {
+ trim = -track->cluster[0].dts;
+ }
+ version |= delay < INT32_MAX && trim < INT32_MAX ? 0 : 1;
entry_size = (version == 1) ? 20 : 12;
entry_count = 1 + (delay > 0);
@@ -1496,10 +1501,10 @@ static int mov_write_edts_tag(AVIOContext *pb, MOVTrack
*track)
/* duration */
if (version == 1) {
avio_wb64(pb, duration);
- avio_wb64(pb, start_ct);
+ avio_wb64(pb, trim);
} else {
avio_wb32(pb, duration);
- avio_wb32(pb, start_ct);
+ avio_wb32(pb, trim);
}
avio_wb32(pb, 0x00010000);
return size;
@@ -2882,8 +2887,11 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket
*pkt)
* of this packet to be what the previous packets duration implies. */
trk->cluster[trk->entry].dts = trk->start_dts + trk->track_duration;
}
- if (trk->start_dts == AV_NOPTS_VALUE)
+ if (trk->start_dts == AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE) {
trk->start_dts = pkt->dts;
+ if (trk->start_dts < 0 && pkt->pts == pkt->dts)
+ trk->start_dts = 0;
+ }
trk->track_duration = pkt->dts - trk->start_dts + pkt->duration;
if (pkt->pts == AV_NOPTS_VALUE) {
--
1.7.7.3
I'm not 100% happy with this but it seems to solve 99% of the problem. In
particular I don't like the pts == dts check and the equivalent
track->cluster[0].cts check.
For video files with delay we still see, e.g.
ct = 1, dt = -1, trim = 1, empty edit = 0
and with intentional additional output delay
ct= 1, dt = 47, trim = 1, empty edit = 48
For audio we used to see:
ct = 0, dt = -1024, trim = 0, empty edit = 0
and with intentional additional output delay:
ct = 0, dt = 94976, trim = 0, empty edit = 94976.
We now see:
ct = 0, dt = -1024, trim = 1024, empty edit = 0
and with intentional additional output delay:
ct = 0, dt = 94976, trim = 0, empty edit = 94976
The video case seems nicer in that we preserve codec delay independently of
presentation delay.
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel