| #!/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) |