X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fultimate.lua;h=36b67b3a19b1d504a8344aca98ede1643e0a1962;hb=db25639b7c008663d2d12fa922633f01371230fe;hp=bafd8189b96818f9e33c29e0fd4919bf5928f9fa;hpb=5e3676c0b149c5bc342fedf54ac87a75fbae88dc;p=ultimatescore diff --git a/nageru/ultimate.lua b/nageru/ultimate.lua index bafd818..36b67b3 100644 --- a/nageru/ultimate.lua +++ b/nageru/ultimate.lua @@ -11,7 +11,8 @@ local neutral_colors = { {0.5, 0.5, 0.5}, -- Input 1. {0.5, 0.5, 0.5}, -- Input 2. {0.5, 0.5, 0.5}, -- Input 3. - {0.5, 0.5, 0.5} -- Input 4. + {0.5, 0.5, 0.5}, -- Input 4. + {0.5, 0.5, 0.5} -- Input 5. } local overlay_transition_start = -2.0 @@ -22,7 +23,7 @@ local overlay_enabled = false local live_signal_num = 0 local preview_signal_num = 1 -local NUM_CAMERAS = 5 -- Remember to update neutral_colors, too. +local NUM_CAMERAS = 6 -- Remember to update neutral_colors, too. -- Valid values for live_signal_num and preview_signal_num. local INPUT0_SIGNAL_NUM = 0 @@ -30,6 +31,7 @@ local INPUT1_SIGNAL_NUM = 1 local INPUT2_SIGNAL_NUM = 2 local INPUT3_SIGNAL_NUM = 3 local INPUT4_SIGNAL_NUM = 4 +local INPUT5_SIGNAL_NUM = 5 local SBS_SIGNAL_NUM = NUM_CAMERAS local STATIC_SIGNAL_NUM = NUM_CAMERAS + 1 @@ -51,6 +53,8 @@ local cef_path = Nageru.THEME_PATH:match("(.*)/nageru/") local cef_input = HTMLInput.new("file://" .. cef_path .. "/score.html") cef_input:execute_javascript_async("play()") +local bg_video = VideoInput.new(cef_path .. "/flow-720.mp4", Nageru.VIDEO_FORMAT_YCBCR) + function reload_cef() cef_input:reload() cef_input:execute_javascript_async("play()") @@ -101,7 +105,7 @@ function make_fade_input(chain, signal, live, deint, scale) input:connect_signal(signal) last = input else - input = chain:add_effect(ImageInput.new("tfk_pause.png")) + input = chain:add_effect(ImageInput.new(cef_path .. "/nageru/dsn-bg.png")) last = input end @@ -217,13 +221,16 @@ end function make_sbs_chain(input0_type, input0_overlay, input1_type, hq) local chain = EffectChain.new(16, 9) + local bg = chain:add_video_input(bg_video, false) + local input0 = make_sbs_input(chain, INPUT0_SIGNAL_NUM, input0_type == "livedeint", input0_overlay, hq) local input1 = make_sbs_input(chain, INPUT4_SIGNAL_NUM, input1_type == "livedeint", false, hq) - input0.padding_effect:set_vec4("border_color", 0.0, 0.0, 0.0, 1.0) + input0.padding_effect:set_vec4("border_color", 0.0, 0.0, 0.0, 0.0) input1.padding_effect:set_vec4("border_color", 0.0, 0.0, 0.0, 0.0) - chain:add_effect(OverlayEffect.new(), input0.padding_effect, input1.padding_effect) + local i0 = chain:add_effect(OverlayEffect.new(), bg, input0.padding_effect) + chain:add_effect(OverlayEffect.new(), i0, input1.padding_effect) chain:finalize(hq) return { @@ -287,12 +294,12 @@ local simple_chains = make_cartesian_product({ return make_simple_chain(input_deint, input_scale, has_overlay, hq) end) --- A chain to show a single static picture on screen. Never with CasparCG overlay. +-- A chain to show a single static picture on screen. Never with HTML overlay. local static_chains = make_cartesian_product({ {true, false} -- hq }, function(hq) local chain = EffectChain.new(16, 9) - local chain_input = chain:add_effect(ImageInput.new("tfk_pause.png")) + local chain_input = chain:add_effect(ImageInput.new(cef_path .. "/nageru/dsn-bg.png")) chain:finalize(hq) return { @@ -344,7 +351,7 @@ function num_channels() end function is_plain_signal(num) - return num >= INPUT0_SIGNAL_NUM and num <= INPUT4_SIGNAL_NUM + return num >= INPUT0_SIGNAL_NUM and num <= INPUT5_SIGNAL_NUM end -- Helper function to write e.g. “720p60”. The difference between this @@ -405,6 +412,8 @@ function channel_name(channel) return "Goal R (" .. get_channel_resolution(signal_num) .. ")" elseif signal_num == INPUT4_SIGNAL_NUM then return "Commentators (" .. get_channel_resolution(signal_num) .. ")" + elseif signal_num == INPUT5_SIGNAL_NUM then + return "Laptop (" .. get_channel_resolution(signal_num) .. ")" elseif signal_num == SBS_SIGNAL_NUM then return "Side-by-side" elseif signal_num == STATIC_SIGNAL_NUM then @@ -688,6 +697,8 @@ function get_sbs_chain(signals, t, width, height, input_resolution) return sbs_chains[input0_type][overlay_enabled][input1_type][true] end +local last_rate = 0.0 + -- API ENTRY POINT -- Called every frame. Get the chain for displaying at input , -- where 0 is live, 1 is preview, 2 is the first channel to display @@ -740,6 +751,21 @@ function get_chain(num, t, width, height, signals) end last_resolution = input_resolution + -- Save some CPU time if we're not having SBS on live. + local new_rate + if live_signal_num == SBS_SIGNAL_NUM or + preview_signal_num == SBS_SIGNAL_NUM or + transition_type == ZOOM_TRANSITION then + new_rate = 1.0 + else + new_rate = 0.0001 + end + if new_rate ~= last_rate then + -- Avoid waking up the video thread (which may be sleeping) if the rate is the same. + bg_video:change_rate(new_rate) + last_rate = new_rate + end + if num == 0 then -- Live. -- See if we're in a transition. finish_transitions(t) @@ -874,10 +900,9 @@ function prepare_sbs_chain(chain, t, transition_type, src_signal, dst_signal, sc set_neutral_color(chain.input0.wb_effect, neutral_colors[1]) set_neutral_color(chain.input1.wb_effect, neutral_colors[5]) - -- First input is positioned (16,48) from top-left. - -- Second input is positioned (16,48) from the bottom-right. - local pos0 = pos_from_top_left(16, 48, 848, 477, screen_width, screen_height) - local pos1 = pos_from_top_left(1280 - 384 - 16, 720 - 216 - 48, 384, 216, screen_width, screen_height) + -- Both inputs are the same size (true side-by-side). + local pos0 = pos_from_top_left(1280 - 616 - 16, 186, 616, 347, screen_width, screen_height) + local pos1 = pos_from_top_left(16, 186, 616, 347, screen_width, screen_height) local pos_fs = { x0 = 0, y0 = 0, x1 = screen_width, y1 = screen_height } local affine_param