xref: /aosp_15_r20/external/libkmsxx/py/tests/wb-m2m-crop.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 Tennetiiw = 640
10*f0687c8aSRaman Tennetiih = 480
11*f0687c8aSRaman Tennetiifmt = pykms.PixelFormat.XRGB8888
12*f0687c8aSRaman Tenneti
13*f0687c8aSRaman Tennetiow = 640
14*f0687c8aSRaman Tennetioh = 480
15*f0687c8aSRaman Tennetiofmt = pykms.PixelFormat.XRGB8888
16*f0687c8aSRaman Tenneti
17*f0687c8aSRaman Tenneticard = pykms.Card()
18*f0687c8aSRaman Tennetires = pykms.ResourceManager(card)
19*f0687c8aSRaman Tenneticonn = res.reserve_connector()
20*f0687c8aSRaman Tenneticrtc = res.reserve_crtc(conn)
21*f0687c8aSRaman Tennetiplane1 = res.reserve_overlay_plane(crtc, ifmt)
22*f0687c8aSRaman Tennetiplane2 = res.reserve_overlay_plane(crtc, ofmt)
23*f0687c8aSRaman Tenneti
24*f0687c8aSRaman Tennetiprint("{}, {}".format(plane1.id, plane2.id))
25*f0687c8aSRaman Tenneti
26*f0687c8aSRaman Tennetimode = conn.get_default_mode()
27*f0687c8aSRaman Tennetimodeb = mode.to_blob(card)
28*f0687c8aSRaman Tenneti
29*f0687c8aSRaman Tenneticard.disable_planes()
30*f0687c8aSRaman Tenneti
31*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card)
32*f0687c8aSRaman Tennetireq.add(conn, "CRTC_ID", crtc.id)
33*f0687c8aSRaman Tennetireq.add(crtc, {"ACTIVE": 1,
34*f0687c8aSRaman Tenneti		"MODE_ID": modeb.id})
35*f0687c8aSRaman Tennetireq.commit_sync(allow_modeset = True)
36*f0687c8aSRaman Tenneti
37*f0687c8aSRaman TennetiNUM_BUFS = 4
38*f0687c8aSRaman Tenneti
39*f0687c8aSRaman Tennetisrc_fbs = []
40*f0687c8aSRaman Tennetidst_fbs = []
41*f0687c8aSRaman Tenneti
42*f0687c8aSRaman Tennetifor i in range(NUM_BUFS):
43*f0687c8aSRaman Tenneti	fb = pykms.DumbFramebuffer(card, iw, ih, ifmt)
44*f0687c8aSRaman Tenneti	pykms.draw_test_pattern(fb);
45*f0687c8aSRaman Tenneti	pykms.draw_text(fb, iw // 2, 2, str(i), pykms.white);
46*f0687c8aSRaman Tenneti	src_fbs.append(fb)
47*f0687c8aSRaman Tenneti
48*f0687c8aSRaman Tenneti	fb = pykms.DumbFramebuffer(card, ow, oh, ofmt)
49*f0687c8aSRaman Tenneti	dst_fbs.append(fb)
50*f0687c8aSRaman Tenneti
51*f0687c8aSRaman Tenneti# put the planes on the screen, so that WB doesn't take them
52*f0687c8aSRaman Tennetireq = pykms.AtomicReq(card)
53*f0687c8aSRaman Tennetireq.add_plane(plane1, src_fbs[0], crtc, dst=(0, 0, 400, 480))
54*f0687c8aSRaman Tennetireq.add_plane(plane2, dst_fbs[1], crtc, dst=(400, 0, 400, 480))
55*f0687c8aSRaman Tennetir = req.commit_sync(allow_modeset = True)
56*f0687c8aSRaman Tennetiassert r == 0
57*f0687c8aSRaman Tenneti
58*f0687c8aSRaman Tennetivid = pykms.VideoDevice("/dev/video10")
59*f0687c8aSRaman Tenneti
60*f0687c8aSRaman Tennetisrc_streamer = vid.output_streamer
61*f0687c8aSRaman Tennetidst_streamer = vid.capture_streamer
62*f0687c8aSRaman Tenneti
63*f0687c8aSRaman Tennetisrc_streamer.set_format(ifmt, iw, ih)
64*f0687c8aSRaman Tenneti(left, top, width, height) = src_streamer.get_selection()
65*f0687c8aSRaman Tennetiprint("get: crop -> {},{}-{}x{}".format(left, top, width, height))
66*f0687c8aSRaman Tenneti(left, top, width, height) = src_streamer.set_selection(160, 0, 320, 240)
67*f0687c8aSRaman Tennetiprint("set: crop -> {},{}-{}x{}".format(left, top, width, height))
68*f0687c8aSRaman Tenneti
69*f0687c8aSRaman Tennetidst_streamer.set_format(ofmt, ow, oh)
70*f0687c8aSRaman Tenneti
71*f0687c8aSRaman Tennetisrc_streamer.set_queue_size(NUM_BUFS)
72*f0687c8aSRaman Tennetidst_streamer.set_queue_size(NUM_BUFS)
73*f0687c8aSRaman Tenneti
74*f0687c8aSRaman Tennetifor fb in src_fbs:
75*f0687c8aSRaman Tenneti	src_streamer.queue(fb)
76*f0687c8aSRaman Tenneti
77*f0687c8aSRaman Tennetifor fb in dst_fbs:
78*f0687c8aSRaman Tenneti	dst_streamer.queue(fb)
79*f0687c8aSRaman Tenneti
80*f0687c8aSRaman Tennetiinput("press enter\n")
81*f0687c8aSRaman Tenneti
82*f0687c8aSRaman Tennetisrc_streamer.stream_on()
83*f0687c8aSRaman Tennetidst_streamer.stream_on()
84*f0687c8aSRaman Tenneti
85*f0687c8aSRaman Tennetiloop_count = 0
86*f0687c8aSRaman Tenneti
87*f0687c8aSRaman Tennetidef readvid(conn, mask):
88*f0687c8aSRaman Tenneti	global loop_count
89*f0687c8aSRaman Tenneti	print("VID EVENT");
90*f0687c8aSRaman Tenneti
91*f0687c8aSRaman Tenneti	ifb = src_streamer.dequeue()
92*f0687c8aSRaman Tenneti	ofb = dst_streamer.dequeue()
93*f0687c8aSRaman Tenneti
94*f0687c8aSRaman Tenneti	req = pykms.AtomicReq(card)
95*f0687c8aSRaman Tenneti	req.add_plane(plane1, ifb, crtc, dst=(0, 0, 400, 480))
96*f0687c8aSRaman Tenneti	req.add_plane(plane2, ofb, crtc, dst=(400, 0, 400, 480))
97*f0687c8aSRaman Tenneti	req.commit_sync(allow_modeset = True)
98*f0687c8aSRaman Tenneti	time.sleep(1)
99*f0687c8aSRaman Tenneti	loop_count += 1
100*f0687c8aSRaman Tenneti	if loop_count >= 10:
101*f0687c8aSRaman Tenneti		exit(0)
102*f0687c8aSRaman Tenneti	print("loop #", loop_count)
103*f0687c8aSRaman Tenneti	src_streamer.queue(ifb)
104*f0687c8aSRaman Tenneti	dst_streamer.queue(ofb)
105*f0687c8aSRaman Tenneti
106*f0687c8aSRaman Tenneti
107*f0687c8aSRaman Tennetidef readkey(conn, mask):
108*f0687c8aSRaman Tenneti	print("KEY EVENT");
109*f0687c8aSRaman Tenneti	sys.stdin.readline()
110*f0687c8aSRaman Tenneti	exit(0)
111*f0687c8aSRaman Tenneti
112*f0687c8aSRaman Tennetisel = selectors.PollSelector()
113*f0687c8aSRaman Tennetisel.register(vid.fd, selectors.EVENT_READ, readvid)
114*f0687c8aSRaman Tennetisel.register(sys.stdin, selectors.EVENT_READ, readkey)
115*f0687c8aSRaman Tenneti
116*f0687c8aSRaman Tennetiwhile True:
117*f0687c8aSRaman Tenneti	events = sel.select()
118*f0687c8aSRaman Tenneti	for key, mask in events:
119*f0687c8aSRaman Tenneti		callback = key.data
120*f0687c8aSRaman Tenneti		callback(key.fileobj, mask)
121*f0687c8aSRaman Tenneti
122*f0687c8aSRaman Tennetiprint("done");
123*f0687c8aSRaman Tennetiexit(0)
124