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