From 144a0501e855b6eceb342e9ca7a9928ba771977e Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 14 Mar 2018 23:30:30 +0100 Subject: [PATCH] A zillion bugfixes relating to SBS. --- nageru/ultimate.lua | 71 ++++++++++++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/nageru/ultimate.lua b/nageru/ultimate.lua index 16ce22f..a061fb0 100644 --- a/nageru/ultimate.lua +++ b/nageru/ultimate.lua @@ -183,14 +183,13 @@ local fade_chains = make_cartesian_product({ return make_fade_chain(input0_live, input0_deint, input0_scale, input1_live, input1_deint, input1_scale, has_overlay, hq) end) -function make_sbs_input(chain, signal, deint, overlay, hq) +function make_sbs_input(chain, signal, deint, has_overlay, hq) local input = chain:add_live_input(not deint, deint) -- Override bounce only if not deinterlacing. input:connect_signal(signal) - local overlay_effect = nil - if (overlay) then - local cef_effect = chain:add_html_input(cef_input) - overlay_effect = chain:add_effect(OverlayEffect.new(), input, cef_effect) + local overlay = nil + if has_overlay then + overlay = make_overlay(chain, input) end local resample_effect = nil @@ -209,7 +208,8 @@ function make_sbs_input(chain, signal, deint, overlay, hq) wb_effect = wb_effect, resample_effect = resample_effect, resize_effect = resize_effect, - padding_effect = padding_effect + padding_effect = padding_effect, + overlay = overlay } end @@ -218,7 +218,7 @@ function make_sbs_chain(input0_type, input0_overlay, input1_type, hq) local chain = EffectChain.new(16, 9) local input0 = make_sbs_input(chain, INPUT0_SIGNAL_NUM, input0_type == "livedeint", input0_overlay, hq) - local input1 = make_sbs_input(chain, INPUT1_SIGNAL_NUM, input1_type == "livedeint", false, 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) input1.padding_effect:set_vec4("border_color", 0.0, 0.0, 0.0, 0.0) @@ -229,7 +229,8 @@ function make_sbs_chain(input0_type, input0_overlay, input1_type, hq) return { chain = chain, input0 = input0, - input1 = input1 + input1 = input1, + overlay = input0.overlay -- May be nil. } end @@ -493,6 +494,15 @@ function in_transition(t) return t >= transition_start and t <= transition_end end +function is_sbs_participating_signal(signal_num) + return signal_num == INPUT0_SIGNAL_NUM or signal_num == INPUT4_SIGNAL_NUM +end + +function simple_signal_has_overlay(signal_num) + -- The commentator output has no overlay on it. + return signal_num ~= INPUT4_SIGNAL_NUM +end + -- API ENTRY POINT -- Called every frame. function get_transitions(t) @@ -525,9 +535,9 @@ function get_transitions(t) end -- Various zooms. - if live_signal_num == SBS_SIGNAL_NUM and is_plain_signal(preview_signal_num) then + if live_signal_num == SBS_SIGNAL_NUM and is_sbs_participating_signal(preview_signal_num) then return {"Cut", "Zoom in"} - elseif is_plain_signal(live_signal_num) and preview_signal_num == SBS_SIGNAL_NUM then + elseif is_sbs_participating_signal(live_signal_num) and preview_signal_num == SBS_SIGNAL_NUM then return {"Cut", "Zoom out"} end @@ -606,8 +616,8 @@ function transition_clicked(num, t) return end - if (live_signal_num == SBS_SIGNAL_NUM and is_plain_signal(preview_signal_num)) or - (preview_signal_num == SBS_SIGNAL_NUM and is_plain_signal(live_signal_num)) then + if (live_signal_num == SBS_SIGNAL_NUM and is_sbs_participating_signal(preview_signal_num)) or + (preview_signal_num == SBS_SIGNAL_NUM and is_sbs_participating_signal(live_signal_num)) then start_transition(ZOOM_TRANSITION, t, 1.0) end elseif num == 2 then @@ -652,7 +662,18 @@ function get_fade_chain(signals, t, width, height, input_resolution) chain.mix_effect:set_float("strength_first", 1.0 - tt) chain.mix_effect:set_float("strength_second", tt) - prepare_overlay_live(chain, t) + + -- The commentator output has no overlay on it. + local extra_alpha_factor = 1.0 + if not simple_signal_has_overlay(transition_src_signal) and + not simple_signal_has_overlay(transition_dst_signal) then + extra_alpha_factor = 0.0 + elseif not simple_signal_has_overlay(transition_src_signal) then + extra_alpha_factor = tt + elseif not simple_signal_has_overlay(transition_dst_signal) then + extra_alpha_factor = 1.0 - tt + end + prepare_overlay_live(chain, t, extra_alpha_factor) end return chain.chain, prepare end @@ -660,7 +681,7 @@ end -- SBS code (live_signal_num == SBS_SIGNAL_NUM, or in a transition to/from it). function get_sbs_chain(signals, t, width, height, input_resolution) local input0_type = get_input_type(signals, INPUT0_SIGNAL_NUM) - local input1_type = get_input_type(signals, INPUT1_SIGNAL_NUM) + local input1_type = get_input_type(signals, INPUT4_SIGNAL_NUM) return sbs_chains[input0_type][overlay_enabled][input1_type][true] end @@ -724,6 +745,7 @@ function get_chain(num, t, width, height, signals) local chain = get_sbs_chain(signals, t, width, height, input_resolution) prepare = function() prepare_sbs_chain(chain, calc_zoom_progress(t), transition_type, transition_src_signal, transition_dst_signal, width, height, input_resolution) + prepare_overlay_live(chain, t, 1.0) end return chain.chain, prepare elseif transition_type == NO_TRANSITION and live_signal_num == SBS_SIGNAL_NUM then @@ -731,6 +753,7 @@ function get_chain(num, t, width, height, signals) local chain = get_sbs_chain(signals, t, width, height, input_resolution) prepare = function() prepare_sbs_chain(chain, 0.0, NO_TRANSITION, 0, SBS_SIGNAL_NUM, width, height, input_resolution) + prepare_overlay_live(chain, t, 1.0) end return chain.chain, prepare elseif transition_type == FADE_TRANSITION then @@ -738,18 +761,19 @@ function get_chain(num, t, width, height, signals) elseif is_plain_signal(live_signal_num) then local input_type = get_input_type(signals, live_signal_num) local input_scale = needs_scale(signals, live_signal_num, width, height) - local chain = simple_chains[input_type][input_scale][overlay_enabled][true] + local overlay_really_enabled = overlay_enabled and simple_signal_has_overlay(live_signal_num) + local chain = simple_chains[input_type][input_scale][overlay_really_enabled][true] prepare = function() chain.input:connect_signal(live_signal_num) set_scale_parameters_if_needed(chain, width, height) set_neutral_color_from_signal(chain.wb_effect, live_signal_num) - prepare_overlay_live(chain, t) + prepare_overlay_live(chain, t, 1.0) end return chain.chain, prepare elseif live_signal_num == STATIC_SIGNAL_NUM then -- Static picture. local chain = static_chains[true] prepare = function() - prepare_overlay_live(chain, t) + prepare_overlay_live(chain, t, 1.0) -- FIXME: Should this ever be here? end return chain.chain, prepare else @@ -770,7 +794,7 @@ function get_chain(num, t, width, height, signals) end else num = preview_signal_num + 2 - show_overlay = overlay_enabled + show_overlay = overlay_enabled and simple_signal_has_overlay(preview_signal_num) end end @@ -790,7 +814,7 @@ function get_chain(num, t, width, height, signals) 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 input1_type = get_input_type(signals, INPUT4_SIGNAL_NUM) local chain = sbs_chains[input0_type][show_overlay][input1_type][false] prepare = function() prepare_sbs_chain(chain, 0.0, NO_TRANSITION, 0, SBS_SIGNAL_NUM, width, height, input_resolution) @@ -843,9 +867,9 @@ end function prepare_sbs_chain(chain, t, transition_type, src_signal, dst_signal, screen_width, screen_height, input_resolution) chain.input0.input:connect_signal(0) - chain.input1.input:connect_signal(1) + chain.input1.input:connect_signal(4) set_neutral_color(chain.input0.wb_effect, neutral_colors[1]) - set_neutral_color(chain.input1.wb_effect, neutral_colors[2]) + 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. @@ -872,7 +896,7 @@ function prepare_sbs_chain(chain, t, transition_type, src_signal, dst_signal, sc if signal == INPUT0_SIGNAL_NUM then affine_param = find_affine_param(pos0, lerp_pos(pos0, pos_fs, real_t)) - elseif signal == INPUT1_SIGNAL_NUM then + elseif signal == INPUT4_SIGNAL_NUM then affine_param = find_affine_param(pos1, lerp_pos(pos1, pos_fs, real_t)) end end @@ -993,10 +1017,11 @@ function place_rectangle(resample_effect, resize_effect, padding_effect, x0, y0, end end -function prepare_overlay_live(chain, t) +function prepare_overlay_live(chain, t, extra_alpha_factor) if chain.overlay then local tt = calc_fade_progress(t, overlay_transition_start, overlay_transition_end) overlay_alpha = overlay_alpha_src + tt * (overlay_alpha_dst - overlay_alpha_src) + overlay_alpha = overlay_alpha * extra_alpha_factor --print("overlay_alpha=" .. overlay_alpha .. " [" .. overlay_alpha_src .. "," .. overlay_alpha_dst .. "]@" .. tt) if t > overlay_transition_end and overlay_alpha_dst == 0.0 then overlay_enabled = false -- Takes effect next frame. -- 2.39.2