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