From: Masaki Tanaka <maki.r...@gmail.com> Seems to fix mistaken cases of discontinuity handling in MPEG-TS when program structure changes.
Additional changes to patch from its original state by Jan Ekström. --- Had been meaning to post this for comments/discussion for a while, as this seems to make timestamps continuously rising in at least one of my samples where the program structure changes mid-stream. The original version of this patch can be found at: https://github.com/jeeb/ffmpeg/commit/6117366eaadbaf48bbd88eb2a353dfc852ff3400 The sample for which this helped is available at: https://kuroko.fushizen.eu/samples/pid_switch_sample.ts The difference of timestamps received from libavformat can be seen with: https://kuroko.fushizen.eu/screenshots/ffmpeg/blue_vanilla-orange_patched.png Jan libavformat/utils.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index 7afef545fe..0efb1aae9c 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -815,8 +815,41 @@ static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_in while (program) { if (program->pts_wrap_reference != pts_wrap_reference) { for (i = 0; i<program->nb_stream_indexes; i++) { - s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference; - s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior; + int64_t *stream_pts_wrap_reference = &(s->streams[program->stream_index[i]]->pts_wrap_reference); + int *stream_pts_wrap_behavior = &(s->streams[program->stream_index[i]]->pts_wrap_behavior); + + if (*stream_pts_wrap_reference != AV_NOPTS_VALUE && + (*stream_pts_wrap_reference - pts_wrap_reference > 1ULL << (st->pts_wrap_bits - 3) || + *stream_pts_wrap_reference < pts_wrap_reference)) { + /* + * If we find a defined wrap reference that is + * considerably larger, or that is smaller than the + * current default wrap reference, we update + * the default to current stream's wrap reference. + */ + av_log(s, AV_LOG_DEBUG, + "Updating default PTS wrap reference " + "%"PRId64" and PTS wrap behavior %d to " + "stream PTS wrap reference %"PRId64" and " + "PTS wrap behavior %d (program: %d, stream:%d, " + "stream_id: %d)\n", pts_wrap_reference, + pts_wrap_behavior, + *stream_pts_wrap_reference, + *stream_pts_wrap_behavior, + program->id, program->stream_index[i], + s->streams[program->stream_index[i]]->id); + + pts_wrap_reference = *stream_pts_wrap_reference; + pts_wrap_behavior = *stream_pts_wrap_behavior; + } else { + /* + * Otherwise, we just utilize and override the + * stream's wrap-around reference with the default + * wrap-around reference. + */ + *stream_pts_wrap_reference = pts_wrap_reference; + *stream_pts_wrap_behavior = pts_wrap_behavior; + } } program->pts_wrap_reference = pts_wrap_reference; -- 2.20.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel