X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=theme.lua;h=a7fc812533c28d3789f6143773ab81d99ba54b8b;hb=5546fa27f69dad8ec5872b9cc3eac0a0b043e369;hp=130e74173598d4fbe49712144d3bec7c49747235;hpb=f35c59e57e973cd2fc7a02aac0413cf00c934d80;p=nageru diff --git a/theme.lua b/theme.lua index 130e741..a7fc812 100644 --- a/theme.lua +++ b/theme.lua @@ -33,71 +33,73 @@ local STATIC_SIGNAL_NUM = 3 -- to the next. local FADE_SIGNAL_NUM = 4 --- The main live chain. -function make_sbs_chain(hq) - local chain = EffectChain.new(16, 9) - local input0 = chain:add_live_input(true) - input0:connect_signal(0) - local input0_wb_effect = chain:add_effect(WhiteBalanceEffect.new()) - local input1 = chain:add_live_input(true) - input1:connect_signal(1) - local input1_wb_effect = chain:add_effect(WhiteBalanceEffect.new()) +function make_sbs_input(chain, signal, deint, hq) + local input = chain:add_live_input(not deint, deint) -- Override bounce only if not deinterlacing. + input:connect_signal(signal) + local wb_effect = chain:add_effect(WhiteBalanceEffect.new()) local resample_effect = nil local resize_effect = nil if (hq) then - resample_effect = chain:add_effect(ResampleEffect.new(), input0_wb_effect) + resample_effect = chain:add_effect(ResampleEffect.new()) else - resize_effect = chain:add_effect(ResizeEffect.new(), input0_wb_effect) + resize_effect = chain:add_effect(ResizeEffect.new()) end local padding_effect = chain:add_effect(IntegralPaddingEffect.new()) - padding_effect:set_vec4("border_color", 0.0, 0.0, 0.0, 1.0) - local resample2_effect = nil - local resize2_effect = nil - if (hq) then - resample2_effect = chain:add_effect(ResampleEffect.new(), input1_wb_effect) - else - resize2_effect = chain:add_effect(ResizeEffect.new(), input1_wb_effect) - end - local padding2_effect = chain:add_effect(IntegralPaddingEffect.new()) + return { + input = input, + wb_effect = wb_effect, + resample_effect = resample_effect, + resize_effect = resize_effect, + padding_effect = padding_effect + } +end + +-- The main live chain. +function make_sbs_chain(input0_deint, input1_deint, hq) + local chain = EffectChain.new(16, 9) + + local input0 = make_sbs_input(chain, INPUT0_SIGNAL_NUM, input0_deint, hq) + local input1 = make_sbs_input(chain, INPUT1_SIGNAL_NUM, input1_deint, hq) + + input0.padding_effect:set_vec4("border_color", 0.0, 0.0, 0.0, 1.0) + input1.padding_effect:set_vec4("border_color", 0.0, 0.0, 0.0, 0.0) - chain:add_effect(OverlayEffect.new(), padding_effect, padding2_effect) + chain:add_effect(OverlayEffect.new(), input0.padding_effect, input1.padding_effect) chain:finalize(hq) return { chain = chain, - input0 = { - input = input0, - white_balance_effect = input0_wb_effect, - resample_effect = resample_effect, - resize_effect = resize_effect, - padding_effect = padding_effect - }, - input1 = { - input = input1, - white_balance_effect = input1_wb_effect, - resample_effect = resample2_effect, - resize_effect = resize2_effect, - padding_effect = padding2_effect - } + input0 = input0, + input1 = input1 } end -local main_chain_hq = make_sbs_chain(true) -local main_chain_lq = make_sbs_chain(false) +-- Make all possible combinations of side-by-side chains. +local sbs_chains = {} +for input0_type, input0_deint in pairs({live = false, livedeint = true}) do + sbs_chains[input0_type] = {} + for input1_type, input1_deint in pairs({live = false, livedeint = true}) do + sbs_chains[input0_type][input1_type] = {} + for _, hq in pairs({true, false}) do + sbs_chains[input0_type][input1_type][hq] = + make_sbs_chain(input0_deint, input1_deint, hq) + end + end +end -- A chain to fade between two inputs, of which either can be a picture -- or a live input. In practice only used live, but we still support the -- hq parameter. -function make_fade_chain(input0_live, input1_live, hq) +function make_fade_chain(input0_live, input0_deint, input1_live, input1_deint, hq) local chain = EffectChain.new(16, 9) local input0, wb0_effect, input0_last, input1, wb1_effect, input1_last if input0_live then - input0 = chain:add_live_input(true) + input0 = chain:add_live_input(false, input0_deint) wb0_effect = chain:add_effect(WhiteBalanceEffect.new()) input0:connect_signal(0) input0_last = wb0_effect @@ -107,7 +109,7 @@ function make_fade_chain(input0_live, input1_live, hq) end if input1_live then - input1 = chain:add_live_input(true) + input1 = chain:add_live_input(false, input1_deint) wb1_effect = chain:add_effect(WhiteBalanceEffect.new()) input1:connect_signal(1) input1_last = wb1_effect @@ -123,11 +125,11 @@ function make_fade_chain(input0_live, input1_live, hq) chain = chain, input0 = { input = input0, - white_balance_effect = wb0_effect + wb_effect = wb0_effect }, input1 = { input = input1, - white_balance_effect = wb1_effect + wb_effect = wb1_effect }, mix_effect = mix_effect } @@ -135,29 +137,43 @@ end -- Chains to fade between two inputs, in various configurations. local fade_chains = {} -for input0_type, input0_live in pairs({static = false, live = true}) do +for input0_type, input0_live in pairs({static = false, live = true, livedeint = true}) do + local input0_deint = (input0_live == "livedeint") fade_chains[input0_type] = {} - for input1_type, input1_live in pairs({static = false, live = true}) do + for input1_type, input1_live in pairs({static = false, live = true, livedeint = true}) do + local input1_deint = (input1_live == "livedeint") fade_chains[input0_type][input1_type] = {} for _, hq in pairs({true, false}) do - fade_chains[input0_type][input1_type][hq] = make_fade_chain(input0_live, input1_live, hq) + fade_chains[input0_type][input1_type][hq] = + make_fade_chain(input0_live, input0_deint, input1_live, input1_deint, hq) end end end --- A chain to show a single input on screen (HQ version). -local simple_chain_hq = EffectChain.new(16, 9) -local simple_chain_hq_input = simple_chain_hq:add_live_input(true) -simple_chain_hq_input:connect_signal(0) -- First input card. Can be changed whenever you want. -local simple_chain_hq_wb_effect = simple_chain_hq:add_effect(WhiteBalanceEffect.new()) -simple_chain_hq:finalize(true) +-- A chain to show a single input on screen. +function make_simple_chain(input_deint, hq) + local chain = EffectChain.new(16, 9) + + local input = chain:add_live_input(false, input_deint) + input:connect_signal(0) -- First input card. Can be changed whenever you want. + local wb_effect = chain:add_effect(WhiteBalanceEffect.new()) + chain:finalize(hq) --- A chain to show a single input on screen (LQ version). -local simple_chain_lq = EffectChain.new(16, 9) -local simple_chain_lq_input = simple_chain_lq:add_live_input(true) -simple_chain_lq_input:connect_signal(0) -- First input card. Can be changed whenever you want. -local simple_chain_lq_wb_effect = simple_chain_lq:add_effect(WhiteBalanceEffect.new()) -simple_chain_lq:finalize(false) + return { + chain = chain, + input = input, + wb_effect = wb_effect + } +end + +-- Make all possible combinations of single-input chains. +local simple_chains = {} +for input_type, input_deint in pairs({live = false, livedeint = true}) do + simple_chains[input_type] = {} + for _, hq in pairs({true, false}) do + simple_chains[input_type][hq] = make_simple_chain(input_deint, hq) + end +end -- A chain to show a single static picture on screen (HQ version). local static_chain_hq = EffectChain.new(16, 9) @@ -169,6 +185,17 @@ local static_chain_lq = EffectChain.new(16, 9) local static_chain_lq_input = static_chain_lq:add_effect(ImageInput.new("bg.jpeg")) static_chain_lq:finalize(false) +-- Used for indexing into the tables of chains. +function get_input_type(signals, signal_num) + if signal_num == STATIC_SIGNAL_NUM then + return "static" + elseif signals:get_interlaced(signal_num) then + return "livedeint" + else + return "live" + end +end + -- Returns the number of outputs in addition to the live (0) and preview (1). -- Called only once, at the start of the program. function num_channels() @@ -363,27 +390,29 @@ end function get_chain(num, t, width, height, signals) if num == 0 then -- Live. if live_signal_num == INPUT0_SIGNAL_NUM or live_signal_num == INPUT1_SIGNAL_NUM then -- Plain input. + local input_type = get_input_type(signals, live_signal_num) + local chain = simple_chains[input_type][true] prepare = function() - simple_chain_hq_input:connect_signal(live_signal_num) - set_neutral_color_from_signal(simple_chain_hq_wb_effect, live_signal_num) + chain.input:connect_signal(live_signal_num) + set_neutral_color_from_signal(chain.wb_effect, live_signal_num) end - return simple_chain_hq, prepare + return chain.chain, prepare elseif live_signal_num == STATIC_SIGNAL_NUM then -- Static picture. prepare = function() end return static_chain_hq, prepare elseif live_signal_num == FADE_SIGNAL_NUM then -- Fade. - local input0_type = (fade_src_signal == STATIC_SIGNAL_NUM) and "static" or "live" - local input1_type = (fade_dst_signal == STATIC_SIGNAL_NUM) and "static" or "live" + local input0_type = get_input_type(signals, fade_src_signal) + local input1_type = get_input_type(signals, fade_dst_signal) local chain = fade_chains[input0_type][input1_type][true] prepare = function() if input0_type == "live" then chain.input0.input:connect_signal(fade_src_signal) - set_neutral_color_from_signal(chain.input0.white_balance_effect, fade_src_signal) + set_neutral_color_from_signal(chain.input0.wb_effect, fade_src_signal) end if input1_type == "live" then chain.input1.input:connect_signal(fade_dst_signal) - set_neutral_color_from_signal(chain.input1.white_balance_effect, fade_dst_signal) + set_neutral_color_from_signal(chain.input1.wb_effect, fade_dst_signal) end local tt = calc_fade_progress(t, transition_start, transition_end) @@ -394,50 +423,63 @@ function get_chain(num, t, width, height, signals) end -- SBS code (live_signal_num == SBS_SIGNAL_NUM). + local input0_type = get_input_type(signals, INPUT0_SIGNAL_NUM) + local input1_type = get_input_type(signals, INPUT1_SIGNAL_NUM) if t > transition_end and zoom_dst == 1.0 then -- Special case: Show only the single image on screen. + local chain = simple_chains[input0_type][true] prepare = function() - simple_chain_hq_input:connect_signal(INPUT0_SIGNAL_NUM) - set_neutral_color(simple_chain_hq_wb_effect, input0_neutral_color) + chain.input:connect_signal(INPUT0_SIGNAL_NUM) + set_neutral_color(chain.wb_effect, input0_neutral_color) end - return simple_chain_hq, prepare + return chain.chain, prepare end + local chain = sbs_chains[input0_type][input1_type][true] prepare = function() if t < transition_start then - prepare_sbs_chain(main_chain_hq, zoom_src, width, height) + prepare_sbs_chain(chain, zoom_src, width, height) elseif t > transition_end then - prepare_sbs_chain(main_chain_hq, zoom_dst, width, height) + prepare_sbs_chain(chain, zoom_dst, width, height) else local tt = (t - transition_start) / (transition_end - transition_start) -- Smooth it a bit. tt = math.sin(tt * 3.14159265358 * 0.5) - prepare_sbs_chain(main_chain_hq, zoom_src + (zoom_dst - zoom_src) * tt, width, height) + prepare_sbs_chain(chain, zoom_src + (zoom_dst - zoom_src) * tt, width, height) end end - return main_chain_hq.chain, prepare + return chain.chain, prepare end if num == 1 then -- Preview. num = preview_signal_num + 2 end + + -- Individual preview inputs. if num == INPUT0_SIGNAL_NUM + 2 then + local input_type = get_input_type(signals, INPUT0_SIGNAL_NUM) + local chain = simple_chains[input_type][false] prepare = function() - simple_chain_lq_input:connect_signal(0) - set_neutral_color(simple_chain_lq_wb_effect, input0_neutral_color) + chain.input:connect_signal(INPUT0_SIGNAL_NUM) + set_neutral_color(chain.wb_effect, input0_neutral_color) end - return simple_chain_lq, prepare + return chain.chain, prepare end if num == INPUT1_SIGNAL_NUM + 2 then + local input_type = get_input_type(signals, INPUT1_SIGNAL_NUM) + local chain = simple_chains[input_type][false] prepare = function() - simple_chain_lq_input:connect_signal(1) - set_neutral_color(simple_chain_lq_wb_effect, input1_neutral_color) + chain.input:connect_signal(INPUT1_SIGNAL_NUM) + set_neutral_color(chain.wb_effect, input1_neutral_color) end - return simple_chain_lq, prepare + return chain.chain, prepare end if num == SBS_SIGNAL_NUM + 2 then + local input0_type = get_input_type(signals, INPUT0_SIGNAL_NUM) + local input1_type = get_input_type(signals, INPUT1_SIGNAL_NUM) + local chain = sbs_chains[input0_type][input1_type][false] prepare = function() - prepare_sbs_chain(main_chain_lq, 0.0, width, height) + prepare_sbs_chain(chain, 0.0, width, height) end - return main_chain_lq.chain, prepare + return chain.chain, prepare end if num == STATIC_SIGNAL_NUM + 2 then prepare = function() @@ -540,8 +582,8 @@ end function prepare_sbs_chain(chain, t, screen_width, screen_height) chain.input0.input:connect_signal(0) chain.input1.input:connect_signal(1) - set_neutral_color(chain.input0.white_balance_effect, input0_neutral_color) - set_neutral_color(chain.input1.white_balance_effect, input1_neutral_color) + set_neutral_color(chain.input0.wb_effect, input0_neutral_color) + set_neutral_color(chain.input1.wb_effect, input1_neutral_color) -- First input is positioned (16,48) from top-left. local width0 = round(848 * screen_width/1280.0)