mirror of
https://github.com/Akascape/Datamosher-Pro.git
synced 2025-12-05 15:59:59 +01:00
36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
#Author: Akash Bora
|
|
import subprocess
|
|
def Datamosh(filename, outf, s, e, p, fps=30):
|
|
END_FRAME_HEX = b'00dc'
|
|
I_FRAME_HEX = b'\x00\x01\xb0'
|
|
def main(filename, effect_sec_list, p_frames_mult):
|
|
mosh(effect_sec_list, p_frames_mult)
|
|
def mosh(effect_sec_list, p_frames_mult):
|
|
with open(filename, 'rb') as in_file, open(outf, 'wb') as out_file:
|
|
frames = split_file(in_file, END_FRAME_HEX)
|
|
for index, frame in enumerate(frames):
|
|
if not is_need_effect_here(index / fps, effect_sec_list):
|
|
out_file.write(frame + END_FRAME_HEX)
|
|
continue
|
|
if not is_iframe(frame):
|
|
out_file.write((frame + END_FRAME_HEX) * p_frames_mult)
|
|
def split_file(fp, marker, blocksize=4096):
|
|
buffer = b''
|
|
for block in iter(lambda: fp.read(blocksize), b''):
|
|
buffer += block
|
|
while True:
|
|
markerpos = buffer.find(marker)
|
|
if markerpos == -1:
|
|
break
|
|
yield buffer[:markerpos]
|
|
buffer = buffer[markerpos + len(marker):]
|
|
yield buffer
|
|
def is_need_effect_here(curr_sec, effect_sec_list):
|
|
return any(start < curr_sec < end for start, end in effect_sec_list)
|
|
def is_iframe(frame):
|
|
return frame[5:8] == I_FRAME_HEX
|
|
start=s
|
|
end=e
|
|
pf=p
|
|
main(filename,[(start,end)],pf)
|