diff options
Diffstat (limited to 'py')
-rwxr-xr-x | py/tests/wb-m2m-crop.py | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/py/tests/wb-m2m-crop.py b/py/tests/wb-m2m-crop.py new file mode 100755 index 0000000..6c4225d --- /dev/null +++ b/py/tests/wb-m2m-crop.py @@ -0,0 +1,123 @@ +#!/usr/bin/python3 + +import sys +import selectors +import pykms +import argparse +import time + +iw = 640 +ih = 480 +ifmt = pykms.PixelFormat.XRGB8888 + +ow = 640 +oh = 480 +ofmt = pykms.PixelFormat.XRGB8888 + +card = pykms.Card() +res = pykms.ResourceManager(card) +conn = res.reserve_connector() +crtc = res.reserve_crtc(conn) +plane1 = res.reserve_overlay_plane(crtc, ifmt) +plane2 = res.reserve_overlay_plane(crtc, ofmt) + +print("{}, {}".format(plane1.id, plane2.id)) + +mode = conn.get_default_mode() +modeb = mode.to_blob(card) + +card.disable_planes() + +req = pykms.AtomicReq(card) +req.add(conn, "CRTC_ID", crtc.id) +req.add(crtc, {"ACTIVE": 1, + "MODE_ID": modeb.id}) +req.commit_sync(allow_modeset = True) + +NUM_BUFS = 4 + +src_fbs = [] +dst_fbs = [] + +for i in range(NUM_BUFS): + fb = pykms.DumbFramebuffer(card, iw, ih, ifmt) + pykms.draw_test_pattern(fb); + pykms.draw_text(fb, iw // 2, 2, str(i), pykms.white); + src_fbs.append(fb) + + fb = pykms.DumbFramebuffer(card, ow, oh, ofmt) + dst_fbs.append(fb) + +# put the planes on the screen, so that WB doesn't take them +req = pykms.AtomicReq(card) +req.add_plane(plane1, src_fbs[0], crtc, dst=(0, 0, 400, 480)) +req.add_plane(plane2, dst_fbs[1], crtc, dst=(400, 0, 400, 480)) +r = req.commit_sync(allow_modeset = True) +assert r == 0 + +vid = pykms.VideoDevice("/dev/video10") + +src_streamer = vid.output_streamer +dst_streamer = vid.capture_streamer + +src_streamer.set_format(ifmt, iw, ih) +(left, top, width, height) = src_streamer.get_selection() +print("get: crop -> {},{}-{}x{}".format(left, top, width, height)) +(left, top, width, height) = src_streamer.set_selection(160, 0, 320, 240) +print("set: crop -> {},{}-{}x{}".format(left, top, width, height)) + +dst_streamer.set_format(ofmt, ow, oh) + +src_streamer.set_queue_size(NUM_BUFS) +dst_streamer.set_queue_size(NUM_BUFS) + +for fb in src_fbs: + src_streamer.queue(fb) + +for fb in dst_fbs: + dst_streamer.queue(fb) + +input("press enter\n") + +src_streamer.stream_on() +dst_streamer.stream_on() + +loop_count = 0 + +def readvid(conn, mask): + global loop_count + print("VID EVENT"); + + ifb = src_streamer.dequeue() + ofb = dst_streamer.dequeue() + + req = pykms.AtomicReq(card) + req.add_plane(plane1, ifb, crtc, dst=(0, 0, 400, 480)) + req.add_plane(plane2, ofb, crtc, dst=(400, 0, 400, 480)) + req.commit_sync(allow_modeset = True) + time.sleep(1) + loop_count += 1 + if loop_count >= 10: + exit(0) + print("loop #", loop_count) + src_streamer.queue(ifb) + dst_streamer.queue(ofb) + + +def readkey(conn, mask): + print("KEY EVENT"); + sys.stdin.readline() + exit(0) + +sel = selectors.PollSelector() +sel.register(vid.fd, selectors.EVENT_READ, readvid) +sel.register(sys.stdin, selectors.EVENT_READ, readkey) + +while True: + events = sel.select() + for key, mask in events: + callback = key.data + callback(key.fileobj, mask) + +print("done"); +exit(0) |