Code to take into account the potential change of length field when modifying the EBML tree structure.
This commit is contained in:
29
removeads.py
29
removeads.py
@@ -377,11 +377,30 @@ 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.')
|
||||
# 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')
|
||||
|
||||
@@ -389,8 +408,8 @@ def changeEBMLElementSize(inputFile, position, addendum):
|
||||
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__)
|
||||
|
||||
Reference in New Issue
Block a user