1#!/usr/local/bin/python3.8 2# -*- coding: utf-8 -*- 3 4# Import required modules 5import mlt 6import time 7import sys 8import tornado.ioloop 9import tornado.web 10 11# Start the mlt system 12mlt.mlt_log_set_level(40) # verbose 13mlt.Factory.init() 14 15# Establish a pipeline 16profile = mlt.Profile("atsc_1080i_5994") 17profile.set_explicit(1) 18tractor = mlt.Tractor() 19tractor.set("eof", "loop") 20fg_resource = "decklink:0" 21bg_resource = "decklink:1" 22if len(sys.argv) > 2: 23 fg_resource = sys.argv[1] 24 bg_resource = sys.argv[2] 25fg = mlt.Producer(profile, fg_resource) 26bg = mlt.Producer(profile, bg_resource) 27tractor.set_track(bg, 0) 28tractor.set_track(fg, 1) 29composite = mlt.Transition(profile, "composite") 30composite.set("fill", 1) 31tractor.plant_transition(composite) 32 33# Setup the consumer 34consumer = "decklink:2" 35if len(sys.argv) > 3: 36 consumer = sys.argv[3] 37consumer = mlt.Consumer(profile, consumer) 38consumer.connect(tractor) 39consumer.set("real_time", -2) 40consumer.start() 41 42flip_flop = False 43def switch(): 44 global composite, flip_flop 45 frame = fg.frame() + 2 46 if flip_flop: 47 s = "0=20%%/0:100%%x80%%; %d=20%%/0:100%%x80%%; %d=0/0:100%%x100%%" % (frame, frame + 30) 48 composite.set("geometry", s) 49 else: 50 s = "0=0/0:100%%x100%%; %d=0/0:100%%x100%%; %d=20%%/0:100%%x80%%" % (frame, frame + 30) 51 composite.set("geometry", s) 52 flip_flop = not flip_flop 53 54 55def output_form(handler): 56 handler.write('<form action="/" method="post"><input type="submit" value="Switch"></form>') 57 58class SwitchHandler(tornado.web.RequestHandler): 59 def get(self): 60 switch() 61 62class MainHandler(tornado.web.RequestHandler): 63 def get(self): 64 output_form(self) 65 66 def post(self): 67 switch() 68 output_form(self) 69 70application = tornado.web.Application([ 71 (r"/", MainHandler), 72 (r"/switch", SwitchHandler) 73]) 74 75application.listen(8888) 76tornado.ioloop.IOLoop.instance().start() 77