all repos — mgba @ 8ec9ebf7d8b51a19155948e4b5aaf068fa334f32

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._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