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))