xref: /aosp_15_r20/external/libkmsxx/py/tests/cam.py (revision f0687c8a10b3e371dbe09214db6664e37c283cca)
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