[FFmpeg-devel,3/3] avformat/movenc: use iso6 major brand when signed CTS offsets are used in trun boxes

Submitted by James Almer on Dec. 2, 2019, 4:18 p.m.

Details

Message ID 20191202161838.1746-3-jamrial@gmail.com
State New
Headers show

Commit Message

James Almer Dec. 2, 2019, 4:18 p.m.
Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavformat/movenc.c  | 15 +++++++++++----
 tests/ref/fate/movenc |  8 ++++----
 2 files changed, 15 insertions(+), 8 deletions(-)

Patch hide | download patch | download mbox

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index a632882ab2..bffd56644a 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -4756,6 +4756,9 @@  static void mov_write_ftyp_tag_internal(AVIOContext *pb, AVFormatContext *s,
         minor =     has_h264 ? 0x20000 : 0x10000;
     } else if (mov->mode == MODE_PSP)
         ffio_wfourcc(pb, "MSNV");
+    else if (mov->mode == MODE_MP4 && mov->flags & FF_MOV_FLAG_FRAGMENT &&
+                                      mov->flags & FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS)
+        ffio_wfourcc(pb, "iso6"); // Required when using signed CTS offsets in trun boxes
     else if (mov->mode == MODE_MP4 && mov->flags & FF_MOV_FLAG_DEFAULT_BASE_MOOF)
         ffio_wfourcc(pb, "iso5"); // Required when using default-base-is-moof
     else if (mov->mode == MODE_MP4 && mov->flags & FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS)
@@ -4806,10 +4809,14 @@  static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s)
         ffio_wfourcc(pb, "piff");
     } else if (mov->mode != MODE_MOV) {
         // We add tfdt atoms when fragmenting, signal this with the iso6 compatible
-        // brand. This is compatible with users that don't understand tfdt.
-        if (mov->flags & FF_MOV_FLAG_FRAGMENT)
-            ffio_wfourcc(pb, "iso6");
-        if (mov->mode != MODE_MP4) {
+        // brand, if not already the major brand. This is compatible with users that
+        // don't understand tfdt.
+        if (mov->mode == MODE_MP4) {
+            if (mov->flags & FF_MOV_FLAG_FRAGMENT && !(mov->flags & FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS))
+                ffio_wfourcc(pb, "iso6");
+        } else {
+            if (mov->flags & FF_MOV_FLAG_FRAGMENT)
+                ffio_wfourcc(pb, "iso6");
             if (mov->flags & FF_MOV_FLAG_DEFAULT_BASE_MOOF)
                 ffio_wfourcc(pb, "iso5");
             else if (mov->flags & FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS)
diff --git a/tests/ref/fate/movenc b/tests/ref/fate/movenc
index 68ce3f6cd9..5c6a054c1a 100644
--- a/tests/ref/fate/movenc
+++ b/tests/ref/fate/movenc
@@ -140,14 +140,14 @@  write_data len 668, time 1566667, type sync atom moof
 write_data len 440, time 2233333, type boundary atom moof
 write_data len 262, time nopts, type trailer atom -
 47cc2460c4b18390c67991cf3251409b 4209 vfr-noduration-interleave
-write_data len 1235, time nopts, type header atom ftyp
+write_data len 1231, time nopts, type header atom ftyp
 write_data len 916, time 0, type sync atom moof
 write_data len 908, time 1000000, type sync atom moof
 write_data len 148, time nopts, type trailer atom -
-c272739705fb78f9d9bffd4c6376c8ce 3207 delay-moov-elst-neg-cts
-write_data len 40, time nopts, type header atom ftyp
+c200a345c365dd35a31e7e62a9ae6c10 3203 delay-moov-elst-neg-cts
+write_data len 36, time nopts, type header atom ftyp
 write_data len 1123, time nopts, type header atom -
 write_data len 1188, time 0, type sync atom moof
 write_data len 908, time 1033333, type sync atom moof
 write_data len 148, time nopts, type trailer atom -
-26c05cd931471319def6f3d5257a6a7a 3407 empty-moov-neg-cts
+38a287dc98272ba9da0a0bf8feb72fef 3403 empty-moov-neg-cts