Skip to content

Commit

Permalink
Merge pull request #59 from Firepal/array_schmarray
Browse files Browse the repository at this point in the history
Fix Python 3.10.10 'array' quirk
  • Loading branch information
ArdenButterfield authored Apr 3, 2023
2 parents c1b78ba + 7ba324f commit d73334d
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 25 deletions.
43 changes: 21 additions & 22 deletions decay_cache.py
Original file line number Diff line number Diff line change
@@ -1,57 +1,56 @@
import gc

class Frame:
frame: bytes = None
class DecayItem:
item = None
timer: int = 0

def __init__(self,
frame: bytes = None,
item = None,
timer: int = 0):
self.frame = frame
self.item = item
self.timer = timer

class DecayCache:
array: dict[Frame] = {}
items: dict[DecayItem] = {}
decay: int = 100
bad_frames = 0

def __init__(self,size: int):
for i in range(size):
self.array[i] = Frame()
self.items[i] = DecayItem()

def reinit(self):
self.__init__(len(self.array))
self.__init__(len(self.items))

def item_decayed(self, i: int):
return self.array[i].timer == 0
return self.items[i].timer == 0

def item_usable(self, i: int):
return self.array[i].frame != None
return self.items[i].item != None

def __set_timer(self,i: int,time: int):
self.array[i].timer = time
self.items[i].timer = time

def reset_timer(self,i: int):
self.__set_timer(i,self.decay)

def process(self):
self.decayed_frames = 0
for i in range(len(self.array)):
self.array[i].timer = max(0,self.array[i].timer-1)
self.decayed_items = 0
for i, _ in enumerate(self.items):
self.items[i].timer = max(0,self.items[i].timer-1)

if self.item_decayed(i):
self.decayed_frames += 1
self.array[i] = Frame()
self.decayed_items += 1
self.items[i] = DecayItem()

# free decayed items from memory
gc.collect()


def clear(self,frame_ids: list[int]):
for id in frame_ids:
if self.item_usable(id):
self.reset_timer(id)
def clear(self,ids: list[int]):
for item_id in ids:
if self.item_usable(item_id):
self.reset_timer(item_id)

def set_frame(self,i: int,frame: bytes,):
self.array[i] = Frame(frame,self.decay)
def set_item(self,i: int,item):
self.items[i] = DecayItem(item,self.decay)

8 changes: 5 additions & 3 deletions video_out.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ def grow_to_nondecayed(min,max):
self.cache.clear(new_frame_ids)
for idx in new_frame_ids:
frame_slice = VideoHandlerMem.__get_frame_slice(decoded_frames,idx-min_f)
self.cache.set_frame(idx,frame_slice)
self.cache.set_item(idx,frame_slice)

def get_frame(self,idx) -> io.BytesIO:
super().get_frame(idx)
Expand All @@ -202,7 +202,7 @@ def get_frame(self,idx) -> io.BytesIO:
else:
self.__cache_decayed_frames(idx)

frame = self.cache.array[idx].frame
frame = self.cache.items[idx].item
return io.BytesIO(frame)

def write_frame(self,idx,frame: io.BytesIO):
Expand All @@ -214,7 +214,7 @@ def write_frame(self,idx,frame: io.BytesIO):
def get_progress_strings(self):
strs = super().get_progress_strings()
strs.append(f"{self.cache_hits} cache hits")
strs.append(f"{self.framecount-self.cache.decayed_frames}/{self.framecount} cached frames")
strs.append(f"{self.framecount-self.cache.decayed_items}/{self.framecount} cached frames")
return strs

def __create_output_proc(self):
Expand All @@ -234,4 +234,6 @@ def __create_output_proc(self):

def complete(self):
super().complete()

# properly close ffmpeg
self.out_proc.communicate()

0 comments on commit d73334d

Please sign in to comment.