]> git.sesse.net Git - nageru/blobdiff - nageru/theme.cpp
Fix a Clang 19 warning.
[nageru] / nageru / theme.cpp
index 19c90d4783c9a695f1175cb6268740973d3d730f..192b27eabbe981581283cc6e111dddd7345134ff 100644 (file)
@@ -1,11 +1,15 @@
 #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
@@ -44,6 +54,7 @@
 #include "mainwindow.h"
 #include "pbo_frame_allocator.h"
 #include "scene.h"
+#include "shared/context.h"
 
 class Mixer;
 
@@ -113,9 +124,9 @@ InputStateInfo::InputStateInfo(const InputState &input_state)
 // 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)
@@ -440,6 +451,9 @@ int ImageInput_new(lua_State* L)
        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);
@@ -450,17 +464,19 @@ int VideoInput_new(lua_State* L)
                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);
@@ -1448,6 +1464,15 @@ int Nageru_set_audio_bus_mute(lua_State *L)
        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) {
@@ -1494,15 +1519,15 @@ int Nageru_set_audio_bus_eq_level_db(lua_State *L)
        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
@@ -1612,6 +1637,7 @@ Theme::~Theme()
 {
        theme_menu.reset();
        lua_close(L);
+       // Leak the surface.
 }
 
 void Theme::register_globals()
@@ -1660,6 +1686,9 @@ 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);