mkvmerge: rerender track headers: handle required size > void and not data written yet

Fixes ##1485.
This commit is contained in:
Moritz Bunkus 2015-10-22 11:35:37 +02:00
parent 276f7e04a2
commit 9097f64d56
4 changed files with 20 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2015-10-22 Moritz Bunkus <moritz@bunkus.org>
* 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 <moritz@bunkus.org>
* Released v8.5.1.

View File

@ -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

View File

@ -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

View File

@ -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"