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

Reply via email to