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