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._video_fifo = []
12
13 def yield_frames(self, skip=0, limit=None):
14 self.framebuffer = Image(*self.core.desired_video_dimensions())
15 self.core.set_video_buffer(self.framebuffer)
16 self.core.reset()
17 skip = (skip or 0) + 1
18 while skip > 0:
19 frame = self.core.frame_counter
20 self.framebuffer = Image(*self.core.desired_video_dimensions())
21 self.core.set_video_buffer(self.framebuffer)
22 self.core.run_frame()
23 skip -= 1
24 while frame <= self.core.frame_counter and limit != 0:
25 self._video_fifo.append(VideoFrame(self.framebuffer.to_pil()))
26 yield frame
27 frame = self.core.frame_counter
28 self.core.run_frame()
29 if limit is not None:
30 assert limit >= 0
31 limit -= 1
32
33 def video(self, generator=None, **kwargs):
34 if not generator:
35 generator = self.yield_frames(**kwargs)
36 try:
37 while True:
38 if self._video_fifo:
39 yield self._video_fifo.pop(0)
40 else:
41 next(generator)
42 except StopIteration:
43 return