[FFmpeg-cvslog] movenc: Provide output bytestream markers for fragmented content

Martin Storsjö git at videolan.org
Thu Jun 23 17:56:41 CEST 2016


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Wed May  4 22:18:18 2016 +0300| [dbbaad32e36b9046cd19d6e3329e2ca7ab49b401] | committer: Martin Storsjö

movenc: Provide output bytestream markers for fragmented content

Signed-off-by: Martin Storsjö <martin at martin.st>

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

 libavformat/movenc.c |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 202c720..d8022dc 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -3183,6 +3183,7 @@ static int mov_flush_fragment(AVFormatContext *s, int force)
     MOVMuxContext *mov = s->priv_data;
     int i, first_track = -1;
     int64_t mdat_size = 0;
+    int has_video = 0, starts_with_key = 0, first_video_track = 1;
 
     if (!(mov->flags & FF_MOV_FLAG_FRAGMENT))
         return 0;
@@ -3235,6 +3236,7 @@ static int mov_flush_fragment(AVFormatContext *s, int force)
         for (i = 0; i < mov->nb_streams; i++)
             mov->tracks[i].data_offset = pos + buf_size + 8;
 
+        avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_HEADER);
         if (mov->flags & FF_MOV_FLAG_DELAY_MOOV)
             mov_write_identification(s->pb, s);
         mov_write_moov_tag(s->pb, mov, s);
@@ -3289,6 +3291,14 @@ static int mov_flush_fragment(AVFormatContext *s, int force)
             track->data_offset = 0;
         else
             track->data_offset = mdat_size;
+        if (track->par->codec_type == AVMEDIA_TYPE_VIDEO) {
+            has_video = 1;
+            if (first_video_track) {
+                if (track->entry)
+                    starts_with_key = track->cluster[0].flags & MOV_SYNC_SAMPLE;
+                first_video_track = 0;
+            }
+        }
         if (!track->entry)
             continue;
         if (track->mdat_buf)
@@ -3300,6 +3310,10 @@ static int mov_flush_fragment(AVFormatContext *s, int force)
     if (!mdat_size)
         return 0;
 
+    avio_write_marker(s->pb,
+                      av_rescale(mov->tracks[first_track].cluster[0].dts, AV_TIME_BASE, mov->tracks[first_track].timescale),
+                      (has_video ? starts_with_key : mov->tracks[first_track].cluster[0].flags & MOV_SYNC_SAMPLE) ? AVIO_DATA_MARKER_SYNC_POINT : AVIO_DATA_MARKER_BOUNDARY_POINT);
+
     for (i = 0; i < mov->nb_streams; i++) {
         MOVTrack *track = &mov->tracks[i];
         int buf_size, write_moof = 1, moof_tracks = -1;
@@ -4284,9 +4298,11 @@ static int mov_write_trailer(AVFormatContext *s)
                 avio_seek(pb, mov->reserved_header_pos, SEEK_SET);
                 mov_write_sidx_tags(pb, mov, -1, 0);
                 avio_seek(pb, end, SEEK_SET);
+                avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_TRAILER);
                 mov_write_mfra_tag(pb, mov);
             }
         } else {
+            avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_TRAILER);
             mov_write_mfra_tag(pb, mov);
         }
     }



More information about the ffmpeg-cvslog mailing list