X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=theme.cpp;h=ca4de4fdb22029037438bcedde53769ae03276c6;hb=6ffaabac0a523617b686f40c154a25cb548cc561;hp=0fa4d1d5ea3702936ef3aa44cdbc60fe50b01689;hpb=fc8fb149109f0c12964d53b0dc2dc0f42ef1fc3a;p=nageru diff --git a/theme.cpp b/theme.cpp index 0fa4d1d..ca4de4f 100644 --- a/theme.cpp +++ b/theme.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -219,6 +220,7 @@ Effect *get_effect(lua_State *L, int idx) luaL_testudata(L, idx, "ResizeEffect") || luaL_testudata(L, idx, "MultiplyEffect") || luaL_testudata(L, idx, "MixEffect") || + luaL_testudata(L, idx, "LiftGammaGainEffect") || luaL_testudata(L, idx, "ImageInput")) { return *(Effect **)lua_touserdata(L, idx); } @@ -276,7 +278,7 @@ int EffectChain_add_live_input(lua_State* L) bmusb::PixelFormat pixel_format = global_flags.ten_bit_input ? bmusb::PixelFormat_10BitYCbCr : bmusb::PixelFormat_8BitYCbCr; // Needs to be nonowned to match add_video_input (see below). - return wrap_lua_object_nonowned(L, "LiveInputWrapper", theme, chain, pixel_format, override_bounce, deinterlace); + return wrap_lua_object_nonowned(L, "LiveInputWrapper", theme, chain, pixel_format, override_bounce, deinterlace, /*user_connectable=*/true); } int EffectChain_add_video_input(lua_State* L) @@ -293,7 +295,7 @@ int EffectChain_add_video_input(lua_State* L) // to also unregister the signal connection on __gc.) int ret = wrap_lua_object_nonowned( L, "LiveInputWrapper", theme, chain, (*capture)->get_current_pixel_format(), - /*override_bounce=*/false, deinterlace); + /*override_bounce=*/false, deinterlace, /*user_connectable=*/false); if (ret == 1) { Theme *theme = get_theme_updata(L); LiveInputWrapper **live_input = (LiveInputWrapper **)lua_touserdata(L, -1); @@ -316,7 +318,7 @@ int EffectChain_add_html_input(lua_State* L) // to also unregister the signal connection on __gc.) int ret = wrap_lua_object_nonowned( L, "LiveInputWrapper", theme, chain, (*capture)->get_current_pixel_format(), - /*override_bounce=*/false, /*deinterlace=*/false); + /*override_bounce=*/false, /*deinterlace=*/false, /*user_connectable=*/false); if (ret == 1) { Theme *theme = get_theme_updata(L); LiveInputWrapper **live_input = (LiveInputWrapper **)lua_touserdata(L, -1); @@ -422,7 +424,14 @@ int LiveInputWrapper_connect_signal(lua_State* L) assert(lua_gettop(L) == 2); LiveInputWrapper **input = (LiveInputWrapper **)luaL_checkudata(L, 1, "LiveInputWrapper"); int signal_num = luaL_checknumber(L, 2); - (*input)->connect_signal(signal_num); + bool success = (*input)->connect_signal(signal_num); + if (!success) { + lua_Debug ar; + lua_getstack(L, 1, &ar); + lua_getinfo(L, "nSl", &ar); + fprintf(stderr, "ERROR: %s:%d: Calling connect_signal() on a video or HTML input. Ignoring.\n", + ar.source, ar.currentline); + } return 0; } @@ -610,6 +619,12 @@ int MixEffect_new(lua_State* L) return wrap_lua_object_nonowned(L, "MixEffect"); } +int LiftGammaGainEffect_new(lua_State* L) +{ + assert(lua_gettop(L) == 0); + return wrap_lua_object_nonowned(L, "LiftGammaGainEffect"); +} + int InputStateInfo_get_width(lua_State* L) { assert(lua_gettop(L) == 2); @@ -858,6 +873,15 @@ const luaL_Reg MixEffect_funcs[] = { { NULL, NULL } }; +const luaL_Reg LiftGammaGainEffect_funcs[] = { + { "new", LiftGammaGainEffect_new }, + { "set_float", Effect_set_float }, + { "set_int", Effect_set_int }, + { "set_vec3", Effect_set_vec3 }, + { "set_vec4", Effect_set_vec4 }, + { NULL, NULL } +}; + const luaL_Reg InputStateInfo_funcs[] = { { "get_width", InputStateInfo_get_width }, { "get_height", InputStateInfo_get_height }, @@ -876,10 +900,17 @@ const luaL_Reg ThemeMenu_funcs[] = { } // namespace -LiveInputWrapper::LiveInputWrapper(Theme *theme, EffectChain *chain, bmusb::PixelFormat pixel_format, bool override_bounce, bool deinterlace) +LiveInputWrapper::LiveInputWrapper( + Theme *theme, + EffectChain *chain, + bmusb::PixelFormat pixel_format, + bool override_bounce, + bool deinterlace, + bool user_connectable) : theme(theme), pixel_format(pixel_format), - deinterlace(deinterlace) + deinterlace(deinterlace), + user_connectable(user_connectable) { ImageFormat inout_format; inout_format.color_space = COLORSPACE_sRGB; @@ -965,15 +996,20 @@ LiveInputWrapper::LiveInputWrapper(Theme *theme, EffectChain *chain, bmusb::Pixe } } -void LiveInputWrapper::connect_signal(int signal_num) +bool LiveInputWrapper::connect_signal(int signal_num) { + if (!user_connectable) { + return false; + } + if (global_mixer == nullptr) { // No data yet. - return; + return true; } signal_num = theme->map_signal(signal_num); connect_signal_raw(signal_num, *theme->input_state); + return true; } void LiveInputWrapper::connect_signal_raw(int signal_num, const InputState &input_state) @@ -988,6 +1024,9 @@ void LiveInputWrapper::connect_signal_raw(int signal_num, const InputState &inpu const PBOFrameAllocator::Userdata *userdata = (const PBOFrameAllocator::Userdata *)first_frame.frame->userdata; width = userdata->last_width[first_frame.field_number]; height = userdata->last_height[first_frame.field_number]; + if (userdata->last_interlaced) { + height *= 2; + } } movit::YCbCrLumaCoefficients ycbcr_coefficients = input_state.ycbcr_coefficients[signal_num]; @@ -1177,6 +1216,7 @@ Theme::Theme(const string &filename, const vector &search_dirs, Resource register_class("ResizeEffect", ResizeEffect_funcs); register_class("MultiplyEffect", MultiplyEffect_funcs); register_class("MixEffect", MixEffect_funcs); + register_class("LiftGammaGainEffect", LiftGammaGainEffect_funcs); register_class("InputStateInfo", InputStateInfo_funcs); register_class("ThemeMenu", ThemeMenu_funcs);