all repos — mgba @ cce4b0fcd433a99411fa73c99a7a62017461e3e2

mGBA Game Boy Advance Emulator

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