Code to take into account the potential change of length field when modifying the EBML tree structure.
This commit is contained in:
41
removeads.py
41
removeads.py
@@ -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))
|
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
|
newSize = sizeOfData+addendum
|
||||||
|
delta = 0
|
||||||
if newSize > maxSize:
|
if newSize > maxSize:
|
||||||
# TODO: we can reencode the header with a larger length field ...
|
# TODO: Test this code ...
|
||||||
logger.error('New size is too big to be encoded in actual size field.')
|
newEncodedSize = getEBMLLength(newSize)
|
||||||
exit(-1)
|
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))
|
logger.info('Old encoded size: %s New encoded size: %s' % (hexdump.dump(oldSizeBuf,sep=':'), hexdump.dump(newSizeBuf, sep=':')))
|
||||||
newSizeBuf = (size).to_bytes(sizeOfDataSize, byteorder='big')
|
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)
|
# We return the potential increase in size of the file if the length field had to be increased.
|
||||||
return 0
|
return delta
|
||||||
|
|
||||||
def changeCodecPrivateData(mkvinfo, inputFile, codecData):
|
def changeCodecPrivateData(mkvinfo, inputFile, codecData):
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|||||||
Reference in New Issue
Block a user