src/platform/python/cinema/movie.py (view raw)
1from mgba.image import Image
2from collections import namedtuple
3from . import VideoFrame
4
5Output = namedtuple('Output', ['video'])
6
7
8class Tracer(object):
9 def __init__(self, core):
10 self.core = core
11 self.framebuffer = Image(*core.desired_video_dimensions())
12 self.core.set_video_buffer(self.framebuffer)
13 self._video_fifo = []
14
15 def yield_frames(self, skip=0, limit=None):
16 self.core.reset()
17 skip = (skip or 0) + 1
18 while skip > 0:
19 frame = self.core.frame_counter
20 self.core.run_frame()
21 skip -= 1
22 while frame <= self.core.frame_counter and limit != 0:
23 self._video_fifo.append(VideoFrame(self.framebuffer.to_pil()))
24 yield frame
25 frame = self.core.frame_counter
26 self.core.run_frame()
27 if limit is not None:
28 assert limit >= 0
29 limit -= 1
30
31 def video(self, generator=None, **kwargs):
32 if not generator:
33 generator = self.yield_frames(**kwargs)
34 try:
35 while True:
36 if self._video_fifo:
37 yield self._video_fifo.pop(0)
38 else:
39 next(generator)
40 except StopIteration:
41 return