def window_flip_and_save(): global dump_idx win = kivy.getWindow() glReadBuffer(GL_FRONT) data = glReadPixels(0, 0, win.width, win.height, GL_RGB, GL_UNSIGNED_BYTE) surface = pygame.image.fromstring(str(buffer(data)), win.size, 'RGB', True) filename = '%s%05d.%s' % (dump_prefix, dump_idx, dump_format) pygame.image.save(surface, filename) dump_idx += 1
def window_flip_and_save(): global img_current win = kivy.getWindow() with lock_current: if not connected: return sem_next.acquire() with lock_current: glReadBuffer(GL_FRONT) data = glReadPixels(0, 0, win.width, win.height, GL_RGB, GL_UNSIGNED_BYTE) img_current = str(buffer(data)) sem_current.release()
def _stream_video(self): global img_current lfps = [] dt = 0 frames = 0 fps_wanted = self.server.config.get('fps') if fps_wanted == '': fps_wanted = 0 fps_wanted = float(fps_wanted) if fps_wanted <= 1: fps_wanted = 0 else: fps_wanted = 1 / fps_wanted size = self.server.config.get('size') if size == '': size = None else: size = map(int, size.split('x')) Logger.info( 'MjpegServer: Client %s:%d connected' % self.client_address) self.send_response(200, 'OK') self.boundary = 'kivy-mjpegserver-boundary-%d' % (random.randint(1, 9999999)) self.send_header('Server', 'Kivy MjpegServer') self.send_header('Content-type', 'multipart/x-mixed-replace; boundary=%s' % self.boundary) self.end_headers() # don't accept connection until the window is created # XXX really needed ? while not kivy.getWindow(): time.sleep(0.1) win = kivy.getWindow() dt = dt_current = dt_old = time.time() while keep_running(): # SYNC START sem_current.acquire() with lock_current: im = Image.fromstring('RGB', win.size, img_current) img_current = None sem_next.release() # SYNC END buf = StringIO.StringIO() if size: im = im.resize(size) im = im.transpose(Image.FLIP_TOP_BOTTOM) im.save(buf, format='JPEG') jpeg = buf.getvalue() self.wfile.write('--%s\r\n' % self.boundary) self.wfile.write('Content-Type: image/jpeg\r\n') self.wfile.write('Content-Length: %d\r\n\r\n' % len(jpeg)) self.wfile.write(jpeg) dt_old = dt_current dt_current = time.time() d = dt_current - dt_old if d < fps_wanted: time.sleep(d) frames += 1 if dt_current - dt > 2.: fps = frames / (dt_current - dt) lfps.append(fps) x = sum(lfps) / len(lfps) msg = 'MjpegServer: Current FPS: %.1f, Average: %.1f' % (fps, x) Logger.debug(msg) dt = dt_current frames = 0