diff --git a/src/merge/timecode_factory.cpp b/src/merge/timecode_factory.cpp index 5b1fc8bf4..2a72ea00a 100644 --- a/src/merge/timecode_factory.cpp +++ b/src/merge/timecode_factory.cpp @@ -199,13 +199,15 @@ void timecode_factory_v2_c::parse(mm_io_c &in) { int line_no; string line; - double timecode; + double timecode, previous_timecode; map dur_map; map::const_iterator it; int64_t duration, dur_sum; + bool warning_printed = false; dur_sum = 0; line_no = 0; + previous_timecode = 0; while (in.getline2(line)) { line_no++; strip(line); @@ -214,6 +216,21 @@ timecode_factory_v2_c::parse(mm_io_c &in) { if (!parse_double(line.c_str(), timecode)) mxerror(_("The line %d of the timecode file '%s' does not contain a " "valid floating point number.\n"), line_no, file_name.c_str()); + if ((timecode < previous_timecode) && !warning_printed) { + mxwarn("The timecode v2 file '%s' contains timecodes that are not " + "ordered. Due to a bug in mkvmerge versions up to and including " + "v1.5.0 this was necessary if the track to which the timecode " + "file was applied contained B frames. Starting with v1.5.1 " + "mkvmerge now handles this correctly, and the timecodes in the " + "timecode file must be ordered normally. For example, the frame " + "sequence 'IPBBP...' at 25 FPS requires a timecode file with " + "the first timecodes being '0', '40', '80', '120' etc and not " + "'0', '120', '40', '80' etc. The current file will most " + "likely not work how you expect it to.\n", + in.get_file_name().c_str()); + warning_printed = true; + } + previous_timecode = timecode; timecodes.push_back((int64_t)(timecode * 1000000)); if (timecodes.size() > 1) { duration = timecodes[timecodes.size() - 1] -