diff mbox series

[FFmpeg-devel] libavformat/mov: fix multiple trun per traf

Message ID 20200329212738.226876-1-jstebbins@jetheaddev.com
State Accepted
Commit 9f4054a0cb27503e535804ab8c2b58cc91c72591
Headers show
Series [FFmpeg-devel] libavformat/mov: fix multiple trun per traf | expand

Checks

Context Check Description
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

John Stebbins March 29, 2020, 9:27 p.m. UTC
dts would start over at the beginning of each trun when they should be
computed contiguously for each trun in a traf

Fixes ticket 8070
---
 libavformat/isom.h |  1 +
 libavformat/mov.c  | 12 +++++++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

Comments

Michael Niedermayer April 10, 2020, 10:13 p.m. UTC | #1
On Sun, Mar 29, 2020 at 02:27:38PM -0700, John Stebbins wrote:
> dts would start over at the beginning of each trun when they should be
> computed contiguously for each trun in a traf
> 
> Fixes ticket 8070
> ---
>  libavformat/isom.h |  1 +
>  libavformat/mov.c  | 12 +++++++++++-
>  2 files changed, 12 insertions(+), 1 deletion(-)

will apply tomorrow

fate tests for this and the previous fix might be a good idea
if someone has a small testcase

thx

[...]
diff mbox series

Patch

diff --git a/libavformat/isom.h b/libavformat/isom.h
index 4943b80ccf..41a9c64c11 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -129,6 +129,7 @@  typedef struct MOVFragmentStreamInfo {
     int64_t sidx_pts;
     int64_t first_tfra_pts;
     int64_t tfdt_dts;
+    int64_t next_trun_dts;
     int index_entry;
     MOVEncryptionIndex *encryption_index;
 } MOVFragmentStreamInfo;
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 8ed8b7f6e9..f96a7d8e39 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1335,6 +1335,7 @@  static int update_frag_index(MOVContext *c, int64_t offset)
         frag_stream_info[i].id = c->fc->streams[i]->id;
         frag_stream_info[i].sidx_pts = AV_NOPTS_VALUE;
         frag_stream_info[i].tfdt_dts = AV_NOPTS_VALUE;
+        frag_stream_info[i].next_trun_dts = AV_NOPTS_VALUE;
         frag_stream_info[i].first_tfra_pts = AV_NOPTS_VALUE;
         frag_stream_info[i].index_entry = -1;
         frag_stream_info[i].encryption_index = NULL;
@@ -4609,6 +4610,7 @@  static int mov_read_tfhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     MOVFragment *frag = &c->fragment;
     MOVTrackExt *trex = NULL;
     int flags, track_id, i;
+    MOVFragmentStreamInfo * frag_stream_info;
 
     avio_r8(pb); /* version */
     flags = avio_rb24(pb);
@@ -4642,6 +4644,10 @@  static int mov_read_tfhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
                      avio_rb32(pb) : trex->flags;
     av_log(c->fc, AV_LOG_TRACE, "frag flags 0x%x\n", frag->flags);
 
+    frag_stream_info = get_current_frag_stream_info(&c->frag_index);
+    if (frag_stream_info)
+        frag_stream_info->next_trun_dts = AV_NOPTS_VALUE;
+
     return 0;
 }
 
@@ -4795,7 +4801,9 @@  static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     frag_stream_info = get_current_frag_stream_info(&c->frag_index);
     if (frag_stream_info)
     {
-        if (frag_stream_info->first_tfra_pts != AV_NOPTS_VALUE &&
+        if (frag_stream_info->next_trun_dts != AV_NOPTS_VALUE) {
+            dts = frag_stream_info->next_trun_dts - sc->time_offset;
+        } else if (frag_stream_info->first_tfra_pts != AV_NOPTS_VALUE &&
             c->use_mfra_for == FF_MOV_FLAG_MFRA_PTS) {
             pts = frag_stream_info->first_tfra_pts;
             av_log(c->fc, AV_LOG_DEBUG, "found mfra time %"PRId64
@@ -4950,6 +4958,8 @@  static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
             sc->nb_frames_for_fps ++;
         }
     }
+    if (frag_stream_info)
+        frag_stream_info->next_trun_dts = dts + sc->time_offset;
     if (i < entries) {
         // EOF found before reading all entries.  Fix the hole this would
         // leave in index_entries and ctts_data