all repos — mgba @ 50cbf732b51ada4e6ce2a8f425540e701f7721dd

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
 7class Tracer(object):
 8    def __init__(self, core):
 9        self.core = core
10        self.fb = Image(*core.desiredVideoDimensions())
11        self.core.setVideoBuffer(self.fb)
12        self._videoFifo = []
13
14    def yieldFrames(self, skip=0, limit=None):
15        self.core.reset()
16        skip = (skip or 0) + 1
17        while skip > 0:
18            frame = self.core.frameCounter
19            self.core.runFrame()
20            skip -= 1
21        while frame <= self.core.frameCounter and limit != 0:
22            self._videoFifo.append(VideoFrame(self.fb.toPIL()))
23            yield frame
24            frame = self.core.frameCounter
25            self.core.runFrame()
26            if limit is not None:
27                assert limit >= 0
28                limit -= 1
29
30    def video(self, generator=None, **kwargs):
31        if not generator:
32            generator = self.yieldFrames(**kwargs)
33        try:
34            while True:
35                if self._videoFifo:
36                    result = self._videoFifo[0]
37                    self._videoFifo = self._videoFifo[1:]
38                    yield result
39                else:
40                    next(generator)
41        except StopIteration:
42            return
43
44    def output(self, **kwargs):
45        generator = self.yieldFrames(**kwargs)
46
47        return mCoreOutput(video=self.video(generator=generator, **kwargs))