1#!/usr/bin/python3 2 3import sys 4import selectors 5import pykms 6import argparse 7import time 8 9parser = argparse.ArgumentParser() 10parser.add_argument("width", type=int) 11parser.add_argument("height", type=int) 12args = parser.parse_args() 13 14w = args.width 15h = args.height 16fmt = pykms.PixelFormat.YUYV 17 18print("Capturing in {}x{}".format(w, h)) 19 20card = pykms.Card() 21res = pykms.ResourceManager(card) 22conn = res.reserve_connector() 23crtc = res.reserve_crtc(conn) 24plane = res.reserve_overlay_plane(crtc, fmt) 25 26mode = conn.get_default_mode() 27modeb = mode.to_blob(card) 28 29req = pykms.AtomicReq(card) 30req.add(conn, "CRTC_ID", crtc.id) 31req.add(crtc, {"ACTIVE": 1, 32 "MODE_ID": modeb.id}) 33req.commit_sync(allow_modeset = True) 34 35NUM_BUFS = 5 36 37fbs = [] 38for i in range(NUM_BUFS): 39 fb = pykms.DumbFramebuffer(card, w, h, fmt) 40 fbs.append(fb) 41 42vidpath = pykms.VideoDevice.get_capture_devices()[0] 43 44vid = pykms.VideoDevice(vidpath) 45cap = vid.capture_streamer 46cap.set_port(0) 47cap.set_format(fmt, w, h) 48cap.set_queue_size(NUM_BUFS) 49 50for fb in fbs: 51 cap.queue(fb) 52 53cap.stream_on() 54 55 56def readvid(conn, mask): 57 fb = cap.dequeue() 58 59 if card.has_atomic: 60 plane.set_props({ 61 "FB_ID": fb.id, 62 "CRTC_ID": crtc.id, 63 "SRC_W": fb.width << 16, 64 "SRC_H": fb.height << 16, 65 "CRTC_W": fb.width, 66 "CRTC_H": fb.height, 67 }) 68 else: 69 crtc.set_plane(plane, fb, 0, 0, fb.width, fb.height, 70 0, 0, fb.width, fb.height) 71 72 cap.queue(fb) 73 74def readkey(conn, mask): 75 #print("KEY EVENT"); 76 sys.stdin.readline() 77 exit(0) 78 79sel = selectors.DefaultSelector() 80sel.register(cap.fd, selectors.EVENT_READ, readvid) 81sel.register(sys.stdin, selectors.EVENT_READ, readkey) 82 83while True: 84 events = sel.select() 85 for key, mask in events: 86 callback = key.data 87 callback(key.fileobj, mask) 88