segment_time and segment_times are defined as duration specifications, not timestamps, so calculation of segment duration must account for initial timestamp. Fixed. FATE ref for segment-mp4-to-ts changed on account of avoiding premature segment cut at the end of the first segment.
Showing the changes to libavformat (1 of 2 files). Show all
Unified · Split
| @@ -116,6 +116,7 @@ typedef struct SegmentContext { · 115 unmodified lines | ||
| 116 | 116 | int64_t initial_offset; ///< initial timestamps offset, expressed in microseconds |
| 117 | 117 | char *reference_stream_specifier; ///< reference stream specifier |
| 118 | 118 | int reference_stream_index; |
| 119 | + int64_t reference_stream_first_pts; ///< initial timestamp, expressed in microseconds | |
| 119 | 120 | int break_non_keyframes; |
| 120 | 121 | int write_empty; |
| 121 | 122 | |
| @@ -746,6 +747,8 @@ static int seg_init(AVFormatContext *s) · 624 unmodified lines | ||
| 746 | 747 | seg->reference_stream_index, |
| 747 | 748 | av_get_media_type_string(s->streams[seg->reference_stream_index]->codecpar->codec_type)); |
| 748 | 749 | |
| 750 | + seg->reference_stream_first_pts = AV_NOPTS_VALUE; | |
| 751 | + | |
| 749 | 752 | seg->oformat = av_guess_format(seg->format, s->url, NULL); |
| 750 | 753 | |
| 751 | 754 | if (!seg->oformat) |
| @@ -898,6 +901,18 @@ calc_times: · 146 unmodified lines | ||
| 898 | 901 | pkt->flags & AV_PKT_FLAG_KEY, |
| 899 | 902 | pkt->stream_index == seg->reference_stream_index ? seg->frame_count : -1); |
| 900 | 903 | |
| 904 | + if (seg->reference_stream_first_pts == AV_NOPTS_VALUE && | |
| 905 | + pkt->stream_index == seg->reference_stream_index && | |
| 906 | + pkt->pts != AV_NOPTS_VALUE) { | |
| 907 | + seg->reference_stream_first_pts = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q); | |
| 908 | + } | |
| 909 | + | |
| 910 | + if (seg->reference_stream_first_pts != AV_NOPTS_VALUE) { | |
| 911 | + end_pts += (INT64_MAX - end_pts >= seg->reference_stream_first_pts) ? | |
| 912 | + seg->reference_stream_first_pts : | |
| 913 | + INT64_MAX - end_pts; | |
| 914 | + } | |
| 915 | + | |
| 901 | 916 | if (pkt->pts != AV_NOPTS_VALUE) |
| 902 | 917 | pkt_pts_avtb = av_rescale_q(pkt->pts, st->time_base, AV_TIME_BASE_Q); |
| 903 | 918 | |