]> git.sesse.net Git - ultimatescore/blobdiff - nageru/ultimate.lua
Check in some scripts based on OR-tools to try to generate good group schedules.
[ultimatescore] / nageru / ultimate.lua
index 57436cfc0dc50502f60d6b38763809e8177dc05d..8b2b7f1b42e27f33432ec2307e7284c390b3da4f 100644 (file)
@@ -1,5 +1,10 @@
 -- Nageru theme for TFK mini-tournament 2017, based on the default theme.
 
+local http_request = require("http.request")
+local cqueues = require("cqueues")
+local cq = cqueues.new()
+local futatabi_server = "http://gruessi.trd.sesse.net:9095"
+
 local state = {
        transition_start = -2.0,
        transition_end = -1.0,
@@ -27,12 +32,28 @@ local state = {
        stinger_frame = 0,
        stinger_src_signal = 0,
        stinger_dst_signal = 0,
+       stinger_save_overlay = false,
 
        live_signal_num = 0,
        preview_signal_num = 1
 }
 local NUM_CAMERAS = 6  -- Remember to update neutral_colors, too.
 
+-- Update the Futatabi status in the title.
+replay_title = "IPTV"
+cq:wrap(function()
+       while true do
+               local headers, stream = assert(http_request.new_from_uri(futatabi_server .. "/queue_status"):go())
+               replay_title = "IPTV"
+               if headers:get ":status" == "200" then
+                       local body = assert(stream:get_body_as_string())
+                       if body then
+                               replay_title = "IPTV (" .. body .. ")"
+                       end
+               end
+       end
+end)
+
 -- Valid values for live_signal_num and preview_signal_num.
 local INPUT0_SIGNAL_NUM = 0
 local INPUT1_SIGNAL_NUM = 1
@@ -66,7 +87,7 @@ cef_input:execute_javascript_async("play()")
 
 local bg_video = VideoInput.new(cef_path .. "/flow-720.mp4", Nageru.VIDEO_FORMAT_YCBCR)
 -- local iptv_video = VideoInput.new("http://10.34.129.69:9060/1/v.flv", Nageru.VIDEO_FORMAT_YCBCR)
-local iptv_video = VideoInput.new("http://home.samfundet.no/~sesse/videostuff", Nageru.VIDEO_FORMAT_YCBCR)
+local iptv_video = VideoInput.new(futatabi_server, Nageru.VIDEO_FORMAT_YCBCR)
 
 function reload_cef()
        cef_input:reload()
@@ -484,7 +505,8 @@ function channel_name(channel)
        elseif signal_num == STATIC_SIGNAL_NUM then
                return "Static picture"
        elseif signal_num == VIDEO_SIGNAL_NUM then
-               return "IPTV input"
+               -- return "IPTV input (" .. get_channel_resolution(iptv_video:get_signal_num()) .. ")"
+               return replay_title
        elseif signal_num == OVERLAY_SIGNAL_NUM then
                return "Overlay"
        end
@@ -707,7 +729,6 @@ function transition_clicked(num, t)
                                return
                        end
 
-                       io.write("Inserting stinger from " .. state.live_signal_num .. " to " .. state.live_signal_num .. "\n")
                        state.stinger_in_progress = true
                        state.stinger_frame = 0
                        state.stinger_src_signal = state.live_signal_num
@@ -796,6 +817,30 @@ function get_sbs_chain(state, signals)
        return sbs_chains[input0_type][state.overlay_enabled][input1_type][true]
 end
 
+function fetch_input_resolution(signals, signal_num)
+       local res = {
+               width = signals:get_width(signal_num),
+               height = signals:get_height(signal_num),
+               interlaced = signals:get_interlaced(signal_num),
+               has_signal = signals:get_has_signal(signal_num),
+               is_connected = signals:get_is_connected(signal_num),
+               frame_rate_nom = signals:get_frame_rate_nom(signal_num),
+               frame_rate_den = signals:get_frame_rate_den(signal_num)
+       }
+
+       if res.interlaced then
+               -- Convert height from frame height to field height.
+               -- (Needed for e.g. place_rectangle.)
+               res.height = res.height * 2
+
+               -- Show field rate instead of frame rate; really for cosmetics only
+               -- (and actually contrary to EBU recommendations, although in line
+               -- with typical user expectations).
+               res.frame_rate_nom = res.frame_rate_nom * 2
+       end
+       return res
+end
+
 local last_rate = 0.0
 
 -- API ENTRY POINT
@@ -823,31 +868,13 @@ local last_rate = 0.0
 -- NOTE: The chain returned must be finalized with the Y'CbCr flag
 -- if and only if num==0.
 function get_chain(num, t, width, height, signals)
+       cq:loop(0)
+
        local input_resolution = {}
        for signal_num=0,(NUM_CAMERAS-1) do
-               local res = {
-                       width = signals:get_width(signal_num),
-                       height = signals:get_height(signal_num),
-                       interlaced = signals:get_interlaced(signal_num),
-                       has_signal = signals:get_has_signal(signal_num),
-                       is_connected = signals:get_is_connected(signal_num),
-                       frame_rate_nom = signals:get_frame_rate_nom(signal_num),
-                       frame_rate_den = signals:get_frame_rate_den(signal_num)
-               }
-
-               if res.interlaced then
-                       -- Convert height from frame height to field height.
-                       -- (Needed for e.g. place_rectangle.)
-                       res.height = res.height * 2
-
-                       -- Show field rate instead of frame rate; really for cosmetics only
-                       -- (and actually contrary to EBU recommendations, although in line
-                       -- with typical user expectations).
-                       res.frame_rate_nom = res.frame_rate_nom * 2
-               end
-
-               input_resolution[signal_num] = res
+               input_resolution[signal_num] = fetch_input_resolution(signals, signal_num)
        end
+       input_resolution[iptv_video:get_signal_num()] = fetch_input_resolution(signals, iptv_video:get_signal_num())
        last_resolution = input_resolution
 
        -- Make a (semi-shallow) copy of the current state, so that the returned prepare function
@@ -908,6 +935,15 @@ function get_chain(num, t, width, height, signals)
                                        state.stinger_in_progress = false
                                        state.preview_signal_num = state.stinger_src_signal
                                        state.live_signal_num = state.stinger_dst_signal
+
+                                       if state.stinger_dst_signal == VIDEO_SIGNAL_NUM then
+                                               -- Turn off the overlay when playing video.
+                                               state.stinger_save_overlay = state.overlay_enabled
+                                               state.overlay_enabled = false
+                                       else
+                                               -- Restore the state.
+                                               state.overlay_enabled = state.stinger_save_overlay
+                                       end
                                end
                        else
                                chain = simple_chains[input_type][input_scale][overlay_really_enabled][true]