X-Git-Url: https://git.sesse.net/?p=nageru;a=blobdiff_plain;f=theme.cpp;h=55088ef8bf3c01100ff9665c3225ed691c645909;hp=0fa4d1d5ea3702936ef3aa44cdbc60fe50b01689;hb=refs%2Fheads%2Fffmpeg-audio-only;hpb=fc8fb149109f0c12964d53b0dc2dc0f42ef1fc3a diff --git a/theme.cpp b/theme.cpp index 0fa4d1d..55088ef 100644 --- a/theme.cpp +++ b/theme.cpp @@ -276,7 +276,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 +293,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 +316,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 +422,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; } @@ -876,10 +883,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 +979,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 +1007,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];