diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-07-09 09:59:29 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-07-09 10:01:17 +0200 |
commit | 848295c2eeac23c07d9cb97a5200fa931bdd06f4 (patch) | |
tree | 68c05c1f1834e0d0da14099a41791d97baf5374e /libavformat | |
parent | 00b1401df6563e78c8616df4c62b8b5d6ac511a3 (diff) | |
parent | a87a0acf9b5d27aad032e61eef4973e62a4a6830 (diff) | |
download | ffmpeg-848295c2eeac23c07d9cb97a5200fa931bdd06f4.tar.gz |
Merge commit 'a87a0acf9b5d27aad032e61eef4973e62a4a6830'
* commit 'a87a0acf9b5d27aad032e61eef4973e62a4a6830':
movenc: Make sure the RTP hint tracks have nondecreasing DTS
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/movenchint.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/libavformat/movenchint.c b/libavformat/movenchint.c index 266c9be65d..81acc4642a 100644 --- a/libavformat/movenchint.c +++ b/libavformat/movenchint.c @@ -328,6 +328,7 @@ static int write_hint_packets(AVIOContext *out, const uint8_t *data, uint32_t packet_len = AV_RB32(data); uint16_t seq; uint32_t ts; + int32_t ts_diff; data += 4; size -= 4; @@ -350,8 +351,12 @@ static int write_hint_packets(AVIOContext *out, const uint8_t *data, trk->prev_rtp_ts = ts; /* Unwrap the 32-bit RTP timestamp that wraps around often * into a not (as often) wrapping 64-bit timestamp. */ - trk->cur_rtp_ts_unwrapped += (int32_t) (ts - trk->prev_rtp_ts); - trk->prev_rtp_ts = ts; + ts_diff = ts - trk->prev_rtp_ts; + if (ts_diff > 0) { + trk->cur_rtp_ts_unwrapped += ts_diff; + trk->prev_rtp_ts = ts; + ts_diff = 0; + } if (*pts == AV_NOPTS_VALUE) *pts = trk->cur_rtp_ts_unwrapped; @@ -360,9 +365,15 @@ static int write_hint_packets(AVIOContext *out, const uint8_t *data, avio_wb32(out, 0); /* relative_time */ avio_write(out, data, 2); /* RTP header */ avio_wb16(out, seq); /* RTPsequenceseed */ - avio_wb16(out, 0); /* reserved + flags */ + avio_wb16(out, ts_diff ? 4 : 0); /* reserved + flags (extra_flag) */ entries_pos = avio_tell(out); avio_wb16(out, 0); /* entry count */ + if (ts_diff) { /* if extra_flag is set */ + avio_wb32(out, 16); /* extra_information_length */ + avio_wb32(out, 12); /* rtpoffsetTLV box */ + avio_write(out, "rtpo", 4); + avio_wb32(out, ts_diff); + } data += 12; size -= 12; |