diff options
author | Matthieu Bouron <matthieu.bouron@stupeflix.com> | 2016-06-23 17:52:14 +0200 |
---|---|---|
committer | Matthieu Bouron <matthieu.bouron@stupeflix.com> | 2016-06-23 17:52:14 +0200 |
commit | 4e7a9212820a56bc731c09b2f11ae1422d070837 (patch) | |
tree | d8f0cee855c36cdd7b032a86f42ae400cae98d0a /libavformat/movenc.c | |
parent | 625eb4108675b000626a493c36600062938aaa63 (diff) | |
parent | dbbaad32e36b9046cd19d6e3329e2ca7ab49b401 (diff) | |
download | ffmpeg-4e7a9212820a56bc731c09b2f11ae1422d070837.tar.gz |
Merge commit 'dbbaad32e36b9046cd19d6e3329e2ca7ab49b401'
* commit 'dbbaad32e36b9046cd19d6e3329e2ca7ab49b401':
movenc: Provide output bytestream markers for fragmented content
Merged-by: Matthieu Bouron <matthieu.bouron@stupeflix.com>
Diffstat (limited to 'libavformat/movenc.c')
-rw-r--r-- | libavformat/movenc.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 37f2b5f218..4e5f65f24b 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -4236,6 +4236,7 @@ static int mov_flush_fragment(AVFormatContext *s, int force) int i, first_track = -1; int64_t mdat_size = 0; int ret; + int has_video = 0, starts_with_key = 0, first_video_track = 1; if (!(mov->flags & FF_MOV_FLAG_FRAGMENT)) return 0; @@ -4283,6 +4284,7 @@ static int mov_flush_fragment(AVFormatContext *s, int force) for (i = 0; i < mov->nb_streams; i++) mov->tracks[i].data_offset = pos + moov_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); if ((ret = mov_write_moov_tag(s->pb, mov, s)) < 0) @@ -4338,6 +4340,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) @@ -4349,6 +4359,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; @@ -5807,8 +5821,10 @@ 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); } } |