diff --git a/removeads.py b/removeads.py index 457719b..cab5920 100755 --- a/removeads.py +++ b/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)) 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__)