Code to take into account the potential change of length field when modifying the EBML tree structure.

This commit is contained in:
Frédéric Tronel
2023-12-20 10:46:54 +01:00
parent 3681ff33f3
commit f23423ca8d

View File

@@ -377,20 +377,39 @@ def changeEBMLElementSize(inputFile, position, addendum):
logger.info('Found element at position: %d, size of type: %d size of data: %d maximal size: %d.' % (initialPosition, typeSize, sizeOfData, maxSize))
newSize = sizeOfData+addendum
delta = 0
if newSize > maxSize:
# TODO: we can reencode the header with a larger length field ...
logger.error('New size is too big to be encoded in actual size field.')
exit(-1)
# TODO: Test this code ...
newEncodedSize = getEBMLLength(newSize)
sizeOfNewEncodedSize = len(newEncodedSize)
if sizeOfNewEncodedSize <= sizeOfDataSize:
logger.error('New encoded size is smaller (%d) or equal than previous size (%d). This should not happen.' % (sizeOfNewEncodedSize, sizeOfDataSize))
exit(-1)
# The difference of length between old size field and new one.
delta = sizeOfNewEncodedSize - sizeOfDataSize
fileLength = fstat(infd).st_size
# We seek after actual length field
lseek(infd, position+sizeOfDataSize, SEEK_SET)
# We read the rest of file
tail = read(infd, fileLength-(position+sizeOfDataSize))
# We increase file length
ftruncate(infd, fileLength+delta)
# We go to the beginning of length field
lseek(infd, position, SEEK_SET)
# We write the new length field
write(infd, newEncodedSize)
# We overwrite the rest of file with its previous content that has been offset.
write(infd, tail)
else:
size = newSize + ((128>>(sizeOfDataSize-1))<<((sizeOfDataSize-1)*8))
newSizeBuf = (size).to_bytes(sizeOfDataSize, byteorder='big')
size = newSize + ((128>>(sizeOfDataSize-1))<<((sizeOfDataSize-1)*8))
newSizeBuf = (size).to_bytes(sizeOfDataSize, byteorder='big')
logger.info('Old encoded size: %s New encoded size: %s' % (hexdump.dump(oldSizeBuf,sep=':'), hexdump.dump(newSizeBuf, sep=':')))
lseek(infd, position, SEEK_SET)
write(infd, newSizeBuf)
logger.info('Old encoded size: %s New encoded size: %s' % (hexdump.dump(oldSizeBuf,sep=':'), hexdump.dump(newSizeBuf, sep=':')))
lseek(infd, position, SEEK_SET)
write(infd, newSizeBuf)
# TODO: we will return the increase of length of the modified element (if its new size does not fit the older one)
return 0
# We return the potential increase in size of the file if the length field had to be increased.
return delta
def changeCodecPrivateData(mkvinfo, inputFile, codecData):
logger = logging.getLogger(__name__)