#include "theme.h"
+#include <algorithm>
+#include <array>
#include <assert.h>
#include <bmusb/bmusb.h>
#include <epoxy/gl.h>
+#include <mutex>
#include <stdarg.h>
#include <lauxlib.h>
#include <lua.hpp>
+#include <math.h>
#include <movit/blur_effect.h>
#include <movit/deinterlace_effect.h>
#include <movit/effect.h>
#include <stdlib.h>
#include <cstddef>
#include <memory>
-#include <new>
+#include <string>
#include <utility>
+#include <vector>
#include "audio_mixer.h"
#include "defs.h"
+#include "input_mapping.h"
+#include "lua.h"
+#include "lualib.h"
+#include "shared/shared_defs.h"
+#include "tweaked_inputs.h"
#ifdef HAVE_CEF
#include "cef_capture.h"
#endif
#include "mainwindow.h"
#include "pbo_frame_allocator.h"
#include "scene.h"
+#include "shared/context.h"
class Mixer;
// An effect that does nothing.
class IdentityEffect : public Effect {
public:
- IdentityEffect() {}
- string effect_type_id() const override { return "IdentityEffect"; }
- string output_fragment_shader() override { return read_file("identity.frag"); }
+ IdentityEffect() {}
+ string effect_type_id() const override { return "IdentityEffect"; }
+ string output_fragment_shader() override { return read_file("identity.frag"); }
};
Effect *instantiate_effect(EffectChain *chain, EffectType effect_type)
return wrap_lua_object_nonowned<ImageInput>(L, "ImageInput", filename);
}
+} // namespace
+
+// Must be non-namespaced due to friend declaration.
int VideoInput_new(lua_State* L)
{
assert(lua_gettop(L) == 2);
print_warning(L, "Invalid enum %d used for video format, choosing Y'CbCr.\n", pixel_format);
pixel_format = bmusb::PixelFormat_8BitYCbCrPlanar;
}
- int ret = wrap_lua_object_nonowned<FFmpegCapture>(L, "VideoInput", filename, global_flags.width, global_flags.height);
+ Theme *theme = get_theme_updata(L);
+ int ret = wrap_lua_object_nonowned<FFmpegCapture>(L, "VideoInput", filename, global_flags.width, global_flags.height, create_surface_with_same_format(theme->surface));
if (ret == 1) {
FFmpegCapture **capture = (FFmpegCapture **)lua_touserdata(L, -1);
(*capture)->set_pixel_format(bmusb::PixelFormat(pixel_format));
- Theme *theme = get_theme_updata(L);
theme->register_video_input(*capture);
}
return ret;
}
+namespace {
+
int VideoInput_rewind(lua_State* L)
{
assert(lua_gettop(L) == 1);
return 0;
}
+int Nageru_schedule_cut(lua_State *L)
+{
+ if (global_mixer == nullptr) {
+ luaL_error(L, "Cuts can not be scheduled before the theme is done initializing.");
+ }
+ global_mixer->schedule_cut();
+ return 0;
+}
+
int Nageru_get_audio_bus_eq_level_db(lua_State *L)
{
if (global_audio_mixer == nullptr) {
return 0;
}
-Theme::Theme(const string &filename, const vector<string> &search_dirs, ResourcePool *resource_pool)
- : resource_pool(resource_pool), signal_to_card_mapping(global_flags.default_stream_mapping)
+Theme::Theme(const string &filename, const vector<string> &search_dirs, ResourcePool *resource_pool, QSurface *surface)
+ : resource_pool(resource_pool), signal_to_card_mapping(global_flags.default_stream_mapping), surface(surface)
{
// Defaults.
channel_names[0] = "Live";
channel_names[1] = "Preview";
L = luaL_newstate();
- luaL_openlibs(L);
+ luaL_openlibs(L);
// Search through all directories until we find a file that will load
// (as in, does not return LUA_ERRFILE); then run it. We store load errors
{
theme_menu.reset();
lua_close(L);
+ // Leak the surface.
}
void Theme::register_globals()
{ "get_audio_bus_mute", Nageru_get_audio_bus_mute },
{ "set_audio_bus_mute", Nageru_set_audio_bus_mute },
+ // Misc.
+ { "schedule_cut", Nageru_schedule_cut },
+
{ nullptr, nullptr }
};
lua_pushlightuserdata(L, this);
lua_pop(L, 1);
unsigned flags = 0;
- if (lua_objlen(L, -1) > 2) {
- lua_rawgeti(L, -1, 3);
+ if (lua_objlen(L, index) > 2) {
+ lua_rawgeti(L, index, 3);
flags = luaL_checknumber(L, -1);
lua_pop(L, 1);
}