mkvmuxer: Fix MoveCuesBeforeClustersHelper recursive call.

The third parameter of the MoveCuesBeforeClustersHelper recursive function
should always be the size of the cues element without the master element's size
(i.e.) it should be the sum of size of all Cue Points. This way, the changes in
the Length of the master element itself will be computed correctly.

Change-Id: I05ff1606fb74168f80ffed81fd3c0de3f237c579
This commit is contained in:
Vignesh Venkatasubramanian
2015-02-02 18:34:18 -08:00
parent 27bb7476dd
commit f06e152abd
2 changed files with 14 additions and 12 deletions

View File

@@ -2055,7 +2055,6 @@ Segment::~Segment() {
void Segment::MoveCuesBeforeClustersHelper(uint64 diff, int32 index, void Segment::MoveCuesBeforeClustersHelper(uint64 diff, int32 index,
uint64* cues_size) { uint64* cues_size) {
const uint64 old_cues_size = *cues_size;
CuePoint* const cue_point = cues_.GetCueByIndex(index); CuePoint* const cue_point = cues_.GetCueByIndex(index);
if (cue_point == NULL) if (cue_point == NULL)
return; return;
@@ -2063,18 +2062,19 @@ void Segment::MoveCuesBeforeClustersHelper(uint64 diff, int32 index,
const uint64 cluster_pos = cue_point->cluster_pos() + diff; const uint64 cluster_pos = cue_point->cluster_pos() + diff;
cue_point->set_cluster_pos(cluster_pos); // update the new cluster position cue_point->set_cluster_pos(cluster_pos); // update the new cluster position
// New size of the cue is computed as follows // New size of the cue is computed as follows
// Let a = current size of Cues Element // Let a = current sum of size of all CuePoints
// Let b = Difference in Cue Point's size after this pass // Let b = Increase in Cue Point's size due to this iteration
// Let c = Difference in length of Cues Element's size // Let c = Increase in size of Cues Element's length due to this iteration
// (This is computed as CodedSize(a + b) - CodedSize(a) // (This is computed as CodedSize(a + b) - CodedSize(a))
// Let d = a + b + c. Now d is the new size of the Cues element which is // Let d = b + c. Now d is the |diff| passed to the next recursive call.
// passed on to the next recursive call. // Let e = a + b. Now e is the |cues_size| passed to the next recursive
// call.
const uint64 cue_point_size_diff = cue_point->Size() - old_cue_point_size; const uint64 cue_point_size_diff = cue_point->Size() - old_cue_point_size;
const uint64 cue_size_diff = const uint64 cue_size_diff =
GetCodedUIntSize(*cues_size + cue_point_size_diff) - GetCodedUIntSize(*cues_size + cue_point_size_diff) -
GetCodedUIntSize(*cues_size); GetCodedUIntSize(*cues_size);
*cues_size += cue_point_size_diff + cue_size_diff; *cues_size += cue_point_size_diff;
diff = *cues_size - old_cues_size; diff = cue_size_diff + cue_point_size_diff;
if (diff > 0) { if (diff > 0) {
for (int32 i = 0; i < cues_.cue_entries_size(); ++i) { for (int32 i = 0; i < cues_.cue_entries_size(); ++i) {
MoveCuesBeforeClustersHelper(diff, i, cues_size); MoveCuesBeforeClustersHelper(diff, i, cues_size);
@@ -2084,8 +2084,10 @@ void Segment::MoveCuesBeforeClustersHelper(uint64 diff, int32 index,
void Segment::MoveCuesBeforeClusters() { void Segment::MoveCuesBeforeClusters() {
const uint64 current_cue_size = cues_.Size(); const uint64 current_cue_size = cues_.Size();
uint64 cue_size = current_cue_size; uint64 cue_size = 0;
for (int32 i = 0; i < cues_.cue_entries_size(); i++) for (int32 i = 0; i < cues_.cue_entries_size(); ++i)
cue_size += cues_.GetCueByIndex(i)->Size();
for (int32 i = 0; i < cues_.cue_entries_size(); ++i)
MoveCuesBeforeClustersHelper(current_cue_size, i, &cue_size); MoveCuesBeforeClustersHelper(current_cue_size, i, &cue_size);
// Adjust the Seek Entry to reflect the change in position // Adjust the Seek Entry to reflect the change in position

View File

@@ -1255,7 +1255,7 @@ class Segment {
// diff - indicates the difference in size of the Cues element that needs to // diff - indicates the difference in size of the Cues element that needs to
// accounted for. // accounted for.
// index - index in the list of Cues which is currently being adjusted. // index - index in the list of Cues which is currently being adjusted.
// cue_size - size of the Cues element. // cue_size - sum of size of all the CuePoint elements.
void MoveCuesBeforeClustersHelper(uint64 diff, int index, uint64* cue_size); void MoveCuesBeforeClustersHelper(uint64 diff, int index, uint64* cue_size);
// Seeds the random number generator used to make UIDs. // Seeds the random number generator used to make UIDs.