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