From 814c64cc52d4b6f1f9dbaa956354904966fb0e44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tronel?= Date: Mon, 31 Aug 2026 21:28:07 +0200 Subject: [PATCH] Fix a bug discovered by the synthetic video. --- src/tscut/cutting.py | 96 +++++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/src/tscut/cutting.py b/src/tscut/cutting.py index 0f9bb74..aa2f7e0 100644 --- a/src/tscut/cutting.py +++ b/src/tscut/cutting.py @@ -153,6 +153,8 @@ def cut_recording(media: PreparedMedia, options: ProcessingOptions, except InvalidMediaError: raise InvalidMediaError("Impossible to retrieve timestamp of final i-frame.") + assert head_iframe_ts <= tail_iframe_ts + checks.append(pos+head_iframe_ts-ts1) subparts = [] @@ -199,61 +201,63 @@ def cut_recording(media: PreparedMedia, options: ProcessingOptions, if h264_head_ts is not None: h264_ts.append(h264_head_ts) - # Creating MKV file that corresponds to current part between I-frames - # Internal video with all streams (video, audio and subtitles) - internal_mkv_name = f'part-{partnum:d}-internal.mkv' - # Internal video stream as a raw H264 stream - internal_h264_name = f'part-{partnum:d}-internal.h264' - # Internal video timestamps - internal_h264_ts_name = f'part-{partnum:d}-internal-ts.txt' - # Internal video with only audio and subtitles streams - internal_novideo_mkv_name = f'part-{partnum:d}-internal-novideo.mkv' + if head_iframe_ts < tail_iframe_ts: - try: - internal_mkv = open(internal_mkv_name, 'wb+') - except OSError as e: - raise TemporaryFileError(f"Impossible to create file: {internal_mkv_name}") from e + # Creating MKV file that corresponds to current part between I-frames + # Internal video with all streams (video, audio and subtitles) + internal_mkv_name = f'part-{partnum:d}-internal.mkv' + # Internal video stream as a raw H264 stream + internal_h264_name = f'part-{partnum:d}-internal.h264' + # Internal video timestamps + internal_h264_ts_name = f'part-{partnum:d}-internal-ts.txt' + # Internal video with only audio and subtitles streams + internal_novideo_mkv_name = f'part-{partnum:d}-internal-novideo.mkv' - try: - internal_novideo_mkv = open(internal_novideo_mkv_name, 'wb+') - except OSError as e: - raise TemporaryFileError(f"Impossible to create file: \ - {internal_novideo_mkv_name}") from e + try: + internal_mkv = open(internal_mkv_name, 'wb+') + except OSError as e: + raise TemporaryFileError(f"Impossible to create file: {internal_mkv_name}") from e - try: - internal_h264 = open(internal_h264_name, 'wb+') - except OSError as e: - raise TemporaryFileError(f"Impossible to create file: {internal_h264_name}") from e + try: + internal_novideo_mkv = open(internal_novideo_mkv_name, 'wb+') + except OSError as e: + raise TemporaryFileError(f"Impossible to create file: \ + {internal_novideo_mkv_name}") from e - try: - internal_h264_ts = open(internal_h264_ts_name, 'w+', encoding='utf8') - except OSError as e: - raise TemporaryFileError(f"Impossible to create file: {internal_h264_ts_name}") from e + try: + internal_h264 = open(internal_h264_name, 'wb+') + except OSError as e: + raise TemporaryFileError(f"Impossible to create file: {internal_h264_name}") from e - # logger.info('Merge header, middle and trailer subpart into: %s' % internal_mkv_name) - # Extract internal part of MKV - extract_mkv_part(mkvmerge_path=options.tools_paths['mkvmerge'], input_file=media.movie, - output_file=internal_mkv, begin=head_iframe_ts, end=tail_iframe_ts) + try: + internal_h264_ts = open(internal_h264_ts_name, 'w+', encoding='utf8') + except OSError as e: + raise TemporaryFileError(f"Impossible to create file: {internal_h264_ts_name}") from e - # Extract video stream of internal part as a raw H264 and its timestamps. - logger.info('Extract video track as raw H264 file.') - extract_track_from_mkv(mkvextract_path=options.tools_paths['mkvextract'], - input_file=internal_mkv, index=0, output_file=internal_h264, - timestamps=internal_h264_ts) + # logger.info('Merge header, middle and trailer subpart into: %s' % internal_mkv_name) + # Extract internal part of MKV + extract_mkv_part(mkvmerge_path=options.tools_paths['mkvmerge'], input_file=media.movie, + output_file=internal_mkv, begin=head_iframe_ts, end=tail_iframe_ts) - # Remove video track from internal part of MKV - logger.info('Remove video track from %s', internal_mkv_name) - remove_video_tracks_from_mkv(mkvmerge_path=options.tools_paths['mkvmerge'], - input_file=internal_mkv, output_file=internal_novideo_mkv) + # Extract video stream of internal part as a raw H264 and its timestamps. + logger.info('Extract video track as raw H264 file.') + extract_track_from_mkv(mkvextract_path=options.tools_paths['mkvextract'], + input_file=internal_mkv, index=0, output_file=internal_h264, + timestamps=internal_h264_ts) - temporaries.add(internal_mkv) - temporaries.add(internal_h264) - temporaries.add(internal_h264_ts) - temporaries.add(internal_novideo_mkv) + # Remove video track from internal part of MKV + logger.info('Remove video track from %s', internal_mkv_name) + remove_video_tracks_from_mkv(mkvmerge_path=options.tools_paths['mkvmerge'], + input_file=internal_mkv, output_file=internal_novideo_mkv) - h264parts.append(internal_h264) - h264_ts.append(internal_h264_ts) - subparts.append(internal_novideo_mkv) + temporaries.add(internal_mkv) + temporaries.add(internal_h264) + temporaries.add(internal_h264_ts) + temporaries.add(internal_novideo_mkv) + + h264parts.append(internal_h264) + h264_ts.append(internal_h264_ts) + subparts.append(internal_novideo_mkv) if (not options.coarse) and (nb_tail_frames > options.threshold): # We extract all frames between the I-frame (including it) upto the end.