You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
2.7 KiB
124 lines
2.7 KiB
7 months ago
|
#!/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)
|