From: Steinar H. Gunderson Date: Wed, 7 Oct 2015 21:49:51 +0000 (+0200) Subject: Hook up the rest of the chains from Lua, too. X-Git-Tag: 1.0.0~282 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=9addf2b67e26eb7cb8d7d02a0b11a1f50e95b334;p=nageru Hook up the rest of the chains from Lua, too. --- diff --git a/mixer.cpp b/mixer.cpp index 4713702..83bb7a5 100644 --- a/mixer.cpp +++ b/mixer.cpp @@ -68,16 +68,6 @@ Mixer::Mixer(const QSurfaceFormat &format) inout_format.color_space = COLORSPACE_sRGB; inout_format.gamma_curve = GAMMA_sRGB; - YCbCrFormat input_ycbcr_format; - input_ycbcr_format.chroma_subsampling_x = 2; - input_ycbcr_format.chroma_subsampling_y = 1; - input_ycbcr_format.cb_x_position = 0.0; - input_ycbcr_format.cr_x_position = 0.0; - input_ycbcr_format.cb_y_position = 0.5; - input_ycbcr_format.cr_y_position = 0.5; - input_ycbcr_format.luma_coefficients = YCBCR_REC_601; - input_ycbcr_format.full_range = false; - // Display chain; shows the live output produced by the main chain (its RGBA version). display_chain.reset(new EffectChain(WIDTH, HEIGHT, resource_pool.get())); check_error(); @@ -87,23 +77,6 @@ Mixer::Mixer(const QSurfaceFormat &format) display_chain->set_dither_bits(0); // Don't bother. display_chain->finalize(); - // Preview chains (always shows just the inputs for now). - preview0_chain.reset(new EffectChain(WIDTH, HEIGHT, resource_pool.get())); - check_error(); - preview0_input = new YCbCrInput(inout_format, input_ycbcr_format, WIDTH, HEIGHT, YCBCR_INPUT_SPLIT_Y_AND_CBCR); - preview0_chain->add_input(preview0_input); - preview0_chain->add_output(inout_format, OUTPUT_ALPHA_FORMAT_POSTMULTIPLIED); - preview0_chain->set_dither_bits(0); // Don't bother. - preview0_chain->finalize(); - - preview1_chain.reset(new EffectChain(WIDTH, HEIGHT, resource_pool.get())); - check_error(); - preview1_input = new YCbCrInput(inout_format, input_ycbcr_format, WIDTH, HEIGHT, YCBCR_INPUT_SPLIT_Y_AND_CBCR); - preview1_chain->add_input(preview1_input); - preview1_chain->add_output(inout_format, OUTPUT_ALPHA_FORMAT_POSTMULTIPLIED); - preview1_chain->set_dither_bits(0); // Don't bother. - preview1_chain->finalize(); - h264_encoder.reset(new H264Encoder(h264_encoder_surface, WIDTH, HEIGHT, "test.mp4")); printf("Configuring first card...\n"); @@ -449,41 +422,16 @@ void Mixer::thread_func() live_frame.temp_textures = { rgba_tex }; output_channel[OUTPUT_LIVE].output_frame(live_frame); - // The preview frame shows the first input. Note that the textures - // are owned by the input frame, not the display frame. - if (bmusb_current_rendering_frame[0] != nullptr) { - const PBOFrameAllocator::Userdata *input0_userdata = (const PBOFrameAllocator::Userdata *)bmusb_current_rendering_frame[0]->userdata; - GLuint input0_y_tex = input0_userdata->tex_y; - GLuint input0_cbcr_tex = input0_userdata->tex_cbcr; - DisplayFrame preview0_frame; - preview0_frame.chain = preview0_chain.get(); - preview0_frame.setup_chain = [this, input0_y_tex, input0_cbcr_tex]{ - preview0_input->set_texture_num(0, input0_y_tex); - preview0_input->set_texture_num(1, input0_cbcr_tex); - }; - preview0_frame.ready_fence = fence; - preview0_frame.input_frames = { bmusb_current_rendering_frame[0] }; - preview0_frame.temp_textures = {}; - output_channel[OUTPUT_PREVIEW].output_frame(preview0_frame); - output_channel[OUTPUT_INPUT0].output_frame(preview0_frame); - } - - // Same for the other preview. - // TODO: Use a for loop. Gah. - if (bmusb_current_rendering_frame[1] != nullptr) { - const PBOFrameAllocator::Userdata *input1_userdata = (const PBOFrameAllocator::Userdata *)bmusb_current_rendering_frame[1]->userdata; - GLuint input1_y_tex = input1_userdata->tex_y; - GLuint input1_cbcr_tex = input1_userdata->tex_cbcr; - DisplayFrame preview1_frame; - preview1_frame.chain = preview1_chain.get(); - preview1_frame.setup_chain = [this, input1_y_tex, input1_cbcr_tex]{ - preview1_input->set_texture_num(0, input1_y_tex); - preview1_input->set_texture_num(1, input1_cbcr_tex); - }; - preview1_frame.ready_fence = fence; - preview1_frame.input_frames = { bmusb_current_rendering_frame[1] }; - preview1_frame.temp_textures = {}; - output_channel[OUTPUT_INPUT1].output_frame(preview1_frame); + // Set up non-live inputs. + for (unsigned i = 1; i < 4; ++i) { // FIXME: Don't lock to 4, ask Lua. + DisplayFrame display_frame; + pair> chain = theme->get_chain(i, frame / 60.0f, WIDTH, HEIGHT); // FIXME: dimensions + display_frame.chain = chain.first; + display_frame.setup_chain = chain.second; + display_frame.ready_fence = fence; + display_frame.input_frames = { bmusb_current_rendering_frame[0], bmusb_current_rendering_frame[1] }; // FIXME: possible to do better? + display_frame.temp_textures = {}; + output_channel[i].output_frame(display_frame); } clock_gettime(CLOCK_MONOTONIC, &now); diff --git a/mixer.h b/mixer.h index 96613f9..80d18ff 100644 --- a/mixer.h +++ b/mixer.h @@ -92,20 +92,12 @@ private: std::unique_ptr resource_pool; std::unique_ptr theme; std::unique_ptr display_chain; - std::unique_ptr preview0_chain; - std::unique_ptr preview1_chain; GLuint cbcr_program_num; // Owned by . std::unique_ptr h264_encoder; // Effects part of . Owned by . movit::FlatInput *display_input; - // Effects part of . Owned by . - movit::YCbCrInput *preview0_input; - - // Effects part of . Owned by . - movit::YCbCrInput *preview1_input; - Source current_source = SOURCE_INPUT1; int frame = 0; diff --git a/theme.lua b/theme.lua index d7e46d6..95a765b 100644 --- a/theme.lua +++ b/theme.lua @@ -8,16 +8,8 @@ -- C++ side and you generally just build chains. io.write("hello from lua\n"); --- A chain to show input 0 on screen. -local input0_chain = EffectChain.new(16, 9); ---input0_chain:add_input(Inputs.create(0)); -- TODO: We probably want something more fluid. -local preview_input0 = input0_chain:add_live_input(); -preview_input0:connect_signal(0); -- First input card. Can be changed whenever you want. -input0_chain:finalize(false); - -- The main live chain. Currently just about input 0 with some color correction. local main_chain = EffectChain.new(16, 9); --- local input0 = main_chain:add_input(Inputs.create(0)); local input0 = main_chain:add_live_input(); input0:connect_signal(0); local wb_effect = main_chain:add_effect(WhiteBalanceEffect.new(), input0); @@ -27,6 +19,12 @@ main_chain:finalize(true); -- local resample_effect = main_chain.add_effect(ResampleEffect.new(), input0); -- local padding_effect = main_chain.add_effect(IntegralPaddingEffect.new()); +-- A chain to show a single input on screen. +local simple_chain = EffectChain.new(16, 9); +local simple_chain_input = simple_chain:add_live_input(); +simple_chain_input:connect_signal(0); -- First input card. Can be changed whenever you want. +simple_chain:finalize(false); + -- 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() @@ -60,18 +58,30 @@ end -- 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) - if num == 0 then + if num == 0 then -- Live. prepare = function() - -- io.write("prepare is being called back\n"); input0:connect_signal(1); wb_effect:set_float("output_color_temperature", 3500.0 + t * 100.0); end return main_chain, prepare; end - if num == 1 then + if num == 1 then -- Preview. + prepare = function() + simple_chain_input:connect_signal(0); + end + return simple_chain, prepare; + end + if num == 2 then + prepare = function() + simple_chain_input:connect_signal(0); + end + return simple_chain, prepare; + end + if num == 3 then prepare = function() + simple_chain_input:connect_signal(1); end - return input0_chain, prepare; + return simple_chain, prepare; end end