#include <epoxy/gl.h>
#include <lauxlib.h>
#include <lua.hpp>
+#include <movit/deinterlace_effect.h>
#include <movit/effect.h>
#include <movit/effect_chain.h>
#include <movit/image_format.h>
+#include <movit/input.h>
#include <movit/mix_effect.h>
#include <movit/multiply_effect.h>
#include <movit/overlay_effect.h>
#include <utility>
#include "defs.h"
-#include "deinterlace_effect.h"
#include "ffmpeg_capture.h"
#include "flags.h"
#include "image_input.h"
-#include "input.h"
#include "input_state.h"
#include "pbo_frame_allocator.h"
}
signal_num = theme->map_signal(signal_num);
- connect_signal_raw(signal_num);
+ connect_signal_raw(signal_num, *theme->input_state);
}
-void LiveInputWrapper::connect_signal_raw(int signal_num)
+void LiveInputWrapper::connect_signal_raw(int signal_num, const InputState &input_state)
{
- BufferedFrame first_frame = theme->input_state->buffered_frames[signal_num][0];
+ BufferedFrame first_frame = input_state.buffered_frames[signal_num][0];
if (first_frame.frame == nullptr) {
// No data yet.
return;
height = userdata->last_height[first_frame.field_number];
}
- movit::YCbCrLumaCoefficients ycbcr_coefficients = theme->input_state->ycbcr_coefficients[signal_num];
- bool full_range = theme->input_state->full_range[signal_num];
+ movit::YCbCrLumaCoefficients ycbcr_coefficients = input_state.ycbcr_coefficients[signal_num];
+ bool full_range = input_state.full_range[signal_num];
- if (theme->input_state->ycbcr_coefficients_auto[signal_num]) {
+ if (input_state.ycbcr_coefficients_auto[signal_num]) {
full_range = false;
// The Blackmagic driver docs claim that the device outputs Y'CbCr
BufferedFrame last_good_frame = first_frame;
for (unsigned i = 0; i < max(ycbcr_inputs.size(), rgba_inputs.size()); ++i) {
- BufferedFrame frame = theme->input_state->buffered_frames[signal_num][i];
+ BufferedFrame frame = input_state.buffered_frames[signal_num][i];
if (frame.frame == nullptr) {
// Not enough data; reuse last frame (well, field).
// This is suboptimal, but we have nothing better.
}
if (deinterlace) {
- BufferedFrame frame = theme->input_state->buffered_frames[signal_num][0];
+ BufferedFrame frame = input_state.buffered_frames[signal_num][0];
CHECK(deinterlace_effect->set_int("current_field_position", frame.field_number));
}
}
chain.setup_chain = [this, funcref, input_state]{
unique_lock<mutex> lock(m);
+ assert(this->input_state == nullptr);
this->input_state = &input_state;
// Set up state, including connecting signals.
exit(1);
}
assert(lua_gettop(L) == 0);
+
+ this->input_state = nullptr;
};
// TODO: Can we do better, e.g. by running setup_chain() and seeing what it references?
// Actually, setup_chain does maybe hold all the references we need now anyway?
+ chain.input_frames.reserve(num_cards * FRAME_HISTORY_LENGTH);
for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
for (unsigned frame_num = 0; frame_num < FRAME_HISTORY_LENGTH; ++frame_num) {
chain.input_frames.push_back(input_state.buffered_frames[card_index][frame_num].frame);