[FFmpeg-cvslog] avformat/mov: parse sdtp atom and set the pkt disposable flag accordingly

Matthieu Bouron git at videolan.org
Sat Oct 12 15:38:59 EEST 2019


ffmpeg | branch: master | Matthieu Bouron <matthieu.bouron at gmail.com> | Fri Sep 27 14:57:09 2019 +0200| [1921f866ecf27b8b2b2764c24450d85577ff96c7] | committer: Matthieu Bouron

avformat/mov: parse sdtp atom and set the pkt disposable flag accordingly

Allows the creation of the sdtp atom while remuxing MP4 to MP4. This
atom is required by Apple devices (iPhone, Apple TV) in order to accept
2160p medias.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=1921f866ecf27b8b2b2764c24450d85577ff96c7
---

 libavformat/isom.h                                 |  2 ++
 libavformat/mov.c                                  | 41 ++++++++++++++++++++++
 .../ref/fate/hapqa-extract-snappy1-to-hapalphaonly |  2 +-
 tests/ref/fate/hapqa-extract-snappy1-to-hapq       |  2 +-
 .../fate/hapqa-extract-snappy16-to-hapalphaonly    |  2 +-
 tests/ref/fate/hapqa-extract-snappy16-to-hapq      |  2 +-
 6 files changed, 47 insertions(+), 4 deletions(-)

diff --git a/libavformat/isom.h b/libavformat/isom.h
index 69452cae8e..4943b80ccf 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -163,6 +163,8 @@ typedef struct MOVStreamContext {
     int64_t *chunk_offsets;
     unsigned int stts_count;
     MOVStts *stts_data;
+    unsigned int sdtp_count;
+    uint8_t *sdtp_data;
     unsigned int ctts_count;
     unsigned int ctts_allocated_size;
     MOVStts *ctts_data;
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 8e916a28c6..4f69664eaf 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -2959,6 +2959,40 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     return 0;
 }
 
+static int mov_read_sdtp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
+{
+    AVStream *st;
+    MOVStreamContext *sc;
+    int64_t i, entries;
+
+    if (c->fc->nb_streams < 1)
+        return 0;
+    st = c->fc->streams[c->fc->nb_streams - 1];
+    sc = st->priv_data;
+
+    avio_r8(pb); /* version */
+    avio_rb24(pb); /* flags */
+    entries = atom.size - 4;
+
+    av_log(c->fc, AV_LOG_TRACE, "track[%u].sdtp.entries = %" PRId64 "\n",
+           c->fc->nb_streams - 1, entries);
+
+    if (sc->sdtp_data)
+        av_log(c->fc, AV_LOG_WARNING, "Duplicated SDTP atom\n");
+    av_freep(&sc->sdtp_data);
+    sc->sdtp_count = 0;
+
+    sc->sdtp_data = av_mallocz(entries);
+    if (!sc->sdtp_data)
+        return AVERROR(ENOMEM);
+
+    for (i = 0; i < entries && !pb->eof_reached; i++)
+        sc->sdtp_data[i] = avio_r8(pb);
+    sc->sdtp_count = i;
+
+    return 0;
+}
+
 static void mov_update_dts_shift(MOVStreamContext *sc, int duration)
 {
     if (duration < 0) {
@@ -6767,6 +6801,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
 { MKTAG('s','t','s','z'), mov_read_stsz }, /* sample size */
 { MKTAG('s','t','t','s'), mov_read_stts },
 { MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */
+{ MKTAG('s','d','t','p'), mov_read_sdtp }, /* independent and disposable samples */
 { MKTAG('t','k','h','d'), mov_read_tkhd }, /* track header */
 { MKTAG('t','f','d','t'), mov_read_tfdt },
 { MKTAG('t','f','h','d'), mov_read_tfhd }, /* track fragment header */
@@ -7231,6 +7266,7 @@ static int mov_read_close(AVFormatContext *s)
         av_freep(&sc->sample_sizes);
         av_freep(&sc->keyframes);
         av_freep(&sc->stts_data);
+        av_freep(&sc->sdtp_data);
         av_freep(&sc->stps_data);
         av_freep(&sc->elst_data);
         av_freep(&sc->rap_group);
@@ -7820,6 +7856,11 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
     }
     if (st->discard == AVDISCARD_ALL)
         goto retry;
+    if (sc->sdtp_data && sc->current_sample <= sc->sdtp_count) {
+        uint8_t sample_flags = sc->sdtp_data[sc->current_sample - 1];
+        uint8_t sample_is_depended_on = (sample_flags >> 2) & 0x3;
+        pkt->flags |= sample_is_depended_on == MOV_SAMPLE_DEPENDENCY_NO ? AV_PKT_FLAG_DISPOSABLE : 0;
+    }
     pkt->flags |= sample->flags & AVINDEX_KEYFRAME ? AV_PKT_FLAG_KEY : 0;
     pkt->pos = sample->pos;
 
diff --git a/tests/ref/fate/hapqa-extract-snappy1-to-hapalphaonly b/tests/ref/fate/hapqa-extract-snappy1-to-hapalphaonly
index 9ab123f09d..7edd5fa65b 100644
--- a/tests/ref/fate/hapqa-extract-snappy1-to-hapalphaonly
+++ b/tests/ref/fate/hapqa-extract-snappy1-to-hapalphaonly
@@ -3,4 +3,4 @@
 #codec_id 0: hap
 #dimensions 0: 127x71
 #sar 0: 1/1
-0,          0,          0,        1,     3044, 0xcaf6ddd0
+0,          0,          0,        1,     3044, 0xcaf6ddd0, F=0x11
diff --git a/tests/ref/fate/hapqa-extract-snappy1-to-hapq b/tests/ref/fate/hapqa-extract-snappy1-to-hapq
index f658b1c0b4..1340f77bf5 100644
--- a/tests/ref/fate/hapqa-extract-snappy1-to-hapq
+++ b/tests/ref/fate/hapqa-extract-snappy1-to-hapq
@@ -3,4 +3,4 @@
 #codec_id 0: hap
 #dimensions 0: 127x71
 #sar 0: 1/1
-0,          0,          0,        1,     8217, 0x04271f0f
+0,          0,          0,        1,     8217, 0x04271f0f, F=0x11
diff --git a/tests/ref/fate/hapqa-extract-snappy16-to-hapalphaonly b/tests/ref/fate/hapqa-extract-snappy16-to-hapalphaonly
index 1bd920699a..e6adc004d9 100644
--- a/tests/ref/fate/hapqa-extract-snappy16-to-hapalphaonly
+++ b/tests/ref/fate/hapqa-extract-snappy16-to-hapalphaonly
@@ -3,4 +3,4 @@
 #codec_id 0: hap
 #dimensions 0: 127x71
 #sar 0: 1/1
-0,          0,          0,        1,     3513, 0x69c7014f
+0,          0,          0,        1,     3513, 0x69c7014f, F=0x11
diff --git a/tests/ref/fate/hapqa-extract-snappy16-to-hapq b/tests/ref/fate/hapqa-extract-snappy16-to-hapq
index 8334d53d61..f356301501 100644
--- a/tests/ref/fate/hapqa-extract-snappy16-to-hapq
+++ b/tests/ref/fate/hapqa-extract-snappy16-to-hapq
@@ -3,4 +3,4 @@
 #codec_id 0: hap
 #dimensions 0: 127x71
 #sar 0: 1/1
-0,          0,          0,        1,     8726, 0xf889691c
+0,          0,          0,        1,     8726, 0xf889691c, F=0x11



More information about the ffmpeg-cvslog mailing list