It is possible that the actual audio data only occupy part of the last audio 
frame. This can be signaled by duration in the "trun" atom. We should respect 
the metadata of file and set the duration correctly.
---
 libavformat/mov.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 45eca74d1d..caea36b495 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -5700,11 +5700,16 @@ static int mov_read_trun(MOVContext *c, AVIOContext 
*pb, MOVAtom atom)
 
         sc->ctts_data[index_entry_pos].count = 1;
         sc->ctts_data[index_entry_pos].duration = ctts_duration;
+        if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
+            sc->ctts_data[index_entry_pos].duration = sample_duration;
+        } else {
+            sc->ctts_data[index_entry_pos].duration = ctts_duration;
+        }
         index_entry_pos++;
 
         av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset 
%"PRIx64", dts %"PRId64", "
-                "size %u, distance %d, keyframe %d\n", st->index,
-                index_entry_pos, offset, dts, sample_size, distance, keyframe);
+                "size %u, distance %d, keyframe %d duration %d\n", st->index,
+                index_entry_pos, offset, dts, sample_size, distance, keyframe, 
sc->ctts_data[index_entry_pos-1].duration);
         distance++;
         if (av_sat_add64(dts, sample_duration) != dts + 
(uint64_t)sample_duration)
             return AVERROR_INVALIDDATA;
@@ -9894,6 +9899,9 @@ static int mov_finalize_packet(AVFormatContext *s, 
AVStream *st, AVIndexEntry *s
     }
     if (sc->ctts_data && sc->ctts_index < sc->ctts_count) {
         pkt->pts = av_sat_add64(pkt->dts, av_sat_add64(sc->dts_shift, 
sc->ctts_data[sc->ctts_index].duration));
+        if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
+            pkt->duration = sc->ctts_data[sc->ctts_index].duration;
+        }
         /* update ctts context */
         sc->ctts_sample++;
         if (sc->ctts_index < sc->ctts_count &&
-- 
2.45.1.288.g0e0cd299f1-goog

_______________________________________________
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