diff --git a/ChangeLog b/ChangeLog index 839bee9c1..9f612030a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-10-22 Moritz Bunkus + + * mkvmerge: bug fix: fixed an endless loop when updating track + headers caused by the fix for "Re-rendering track headers: + data_size != 0 not implemented yet". Fixes #1485. + 2015-10-21 Moritz Bunkus * Released v8.5.1. diff --git a/src/merge/output_control.cpp b/src/merge/output_control.cpp index baabfb20b..926ea0a48 100644 --- a/src/merge/output_control.cpp +++ b/src/merge/output_control.cpp @@ -778,12 +778,12 @@ shrink_void_and_rerender_track_headers(int64_t new_void_size) { auto old_void_pos = s_void_after_track_headers->GetElementPosition(); auto projected_new_void_pos = g_kax_tracks->GetElementPosition() + g_kax_tracks->ElementSize(); - s_out->save_pos(g_kax_tracks->GetElementPosition()); + s_out->setFilePointer(g_kax_tracks->GetElementPosition()); g_kax_tracks->Render(*s_out, false); render_void(new_void_size); - s_out->restore_pos(); + s_out->setFilePointer(0, seek_end); mxdebug_if(s_debug_rerender_track_headers, boost::format("[rerender] Normal case, only shrinking void down to %1%, new position %2% projected %9% new full size %3% new end %4% s_out size %5% old void start pos %6% tracks pos %7% tracks size %8%\n") @@ -810,15 +810,17 @@ rerender_track_headers() { auto new_tracks_end_pos = g_kax_tracks->GetElementPosition() + g_kax_tracks->ElementSize(); auto data_start_pos = s_void_after_track_headers->GetElementPosition() + s_void_after_track_headers->ElementSize(true); auto data_size = s_out->get_size() - data_start_pos; + auto new_void_size = data_start_pos >= (new_tracks_end_pos + 4) ? data_start_pos - new_tracks_end_pos : 1024; - if (data_size && (new_tracks_end_pos >= (data_start_pos - 3))) { + if (data_size && (new_tracks_end_pos >= (data_start_pos - 3))) { auto delta = 1024 + new_tracks_end_pos - data_start_pos; data_start_pos += delta; + new_void_size = 1024; relocate_written_data(data_start_pos - delta, delta); } - shrink_void_and_rerender_track_headers(data_start_pos - new_tracks_end_pos); + shrink_void_and_rerender_track_headers(new_void_size); } /** \brief Render all attachments into the output file at the current position diff --git a/tests/results.txt b/tests/results.txt index ca390f73d..f45c5dc3e 100644 --- a/tests/results.txt +++ b/tests/results.txt @@ -352,3 +352,4 @@ T_503pcm_in_mkv_varying_samples_per_packet:81c000712108e2a604c8a30b7677606f:pass T_504dts_96_24_identification:1837ab5b411944e143f9dae6fe6436d8-bb7c41b5aa1b57f18741b792897b0b59-90994a65c6f828ecfead9bd6473453a2:passed:20151006-223804:2.278995107 T_505cisco_talos_can_0036:bf0fedc494cf99a0920d7a6e69edf952-6ef415b0f84d3e5dd435244362a37584:passed:20151020-161153:0.071686357 T_506cisco_talos_can_0037:5461288548eac976164cd13f01bc9426-ed695caee29b1456da8629d38321ec9c-92b7169fc05ddf54c46816869c108f31-54a55a6d87bd4c08269891efb03980b3-fef3d018523c7d1fbed763f6666c1ae2-ac584cc44854f9396739df6e93d78acc-b415b2ef2a6dddf5d89733446fae2970-dd53fee23372c569d35e0b2918d86239:passed:20151020-161234:0.319298931 +T_507rerender_track_headers:7b16f08b7858a1d332516a6fb25a184b-ac9514a1f09f26ac0cb2f527ec2de0b7:passed:20151022-104930:2.573204876 diff --git a/tests/test-507rerender_track_headers.rb b/tests/test-507rerender_track_headers.rb new file mode 100755 index 000000000..21c4841bf --- /dev/null +++ b/tests/test-507rerender_track_headers.rb @@ -0,0 +1,7 @@ +#!/usr/bin/ruby -w + +# T_507rerender_track_headers +describe "mkvmerge / rerender track headers" + +test_merge "data/h265/rerender-track-headers-broken.hevc" +test_merge "data/mkv/complex.mkv", :args => "--debug textsubs_force_rerender=8:16"