fixed cues updater
This commit is contained in:
parent
ecacccd3c6
commit
458ee45e81
|
@ -950,7 +950,6 @@ void MatroskaContainer::internalMakeFile()
|
||||||
}
|
}
|
||||||
// write "Cues"-element
|
// write "Cues"-element
|
||||||
if(cuesPresent) {
|
if(cuesPresent) {
|
||||||
cuesUpdater.invalidateNotifications();
|
|
||||||
try {
|
try {
|
||||||
cuesUpdater.make(outputStream);
|
cuesUpdater.make(outputStream);
|
||||||
} catch(Failure &) {
|
} catch(Failure &) {
|
||||||
|
|
|
@ -153,7 +153,7 @@ bool MatroskaCuePositionUpdater::updateOffsets(uint64 originalOffset, uint64 new
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Sets the relative of the entries with the specified \a originalRelativeOffset and the specified \a referenceOffset to \a newRelativeOffset.
|
* \brief Sets the relative offset of the entries with the specified \a originalRelativeOffset and the specified \a referenceOffset to \a newRelativeOffset.
|
||||||
* \returns Returns whether the size of the "Cues"-element has been altered.
|
* \returns Returns whether the size of the "Cues"-element has been altered.
|
||||||
*/
|
*/
|
||||||
bool MatroskaCuePositionUpdater::updateRelativeOffsets(uint64 referenceOffset, uint64 originalRelativeOffset, uint64 newRelativeOffset)
|
bool MatroskaCuePositionUpdater::updateRelativeOffsets(uint64 referenceOffset, uint64 originalRelativeOffset, uint64 newRelativeOffset)
|
||||||
|
@ -174,22 +174,28 @@ bool MatroskaCuePositionUpdater::updateRelativeOffsets(uint64 referenceOffset, u
|
||||||
*/
|
*/
|
||||||
bool MatroskaCuePositionUpdater::updateSize(EbmlElement *element, int shift)
|
bool MatroskaCuePositionUpdater::updateSize(EbmlElement *element, int shift)
|
||||||
{
|
{
|
||||||
if(!element || shift == 0) {
|
if(!shift) {
|
||||||
return shift != 0;
|
// shift is gone
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!element) {
|
||||||
|
// there was no parent (shouldn't happen in a normal file structure since the Segment element should
|
||||||
|
// be parent of the Cues element)
|
||||||
|
return shift;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
// get size info
|
// get size info
|
||||||
auto &size = m_sizes[element];
|
uint64 &size = m_sizes.at(element);
|
||||||
// calculate new size
|
// calculate new size
|
||||||
uint64 newSize = shift > 0 ? size + static_cast<uint64>(shift) : size - static_cast<uint64>(shift);
|
uint64 newSize = shift > 0 ? size + static_cast<uint64>(shift) : size - static_cast<uint64>(-shift);
|
||||||
// shift parent
|
// shift parent
|
||||||
bool updated = updateSize(element->parent(), shift + static_cast<int>(EbmlElement::calculateSizeDenotationLength(newSize)) - static_cast<int>(EbmlElement::calculateSizeDenotationLength(size)));
|
bool updated = updateSize(element->parent(), shift + static_cast<int>(EbmlElement::calculateSizeDenotationLength(newSize)) - static_cast<int>(EbmlElement::calculateSizeDenotationLength(size)));
|
||||||
// apply new size
|
// apply new size
|
||||||
size = newSize;
|
size = newSize;
|
||||||
return updated;
|
return updated;
|
||||||
} catch(out_of_range &) {
|
} catch(out_of_range &) {
|
||||||
addNotification(NotificationType::Critical, "Size information for element is missing.", "updating index");
|
// the element is out of the scope of the cue position updater (likely the Segment element)
|
||||||
return false;
|
return shift;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue