From 9ba511b7edf9d6875040a0b959d97bd7867ce159 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sun, 21 May 2017 13:30:22 +0200 Subject: [PATCH] Expose choosing video pixel format to Lua. --- mixer.cpp | 2 +- theme.cpp | 36 +++++++++++++++++++++++++++++++++--- theme.h | 1 + 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/mixer.cpp b/mixer.cpp index 261c8ee..421efea 100644 --- a/mixer.cpp +++ b/mixer.cpp @@ -427,7 +427,7 @@ void Mixer::configure_card(unsigned card_index, CaptureInterface *capture, CardT PixelFormat pixel_format; if (card_type == CardType::FFMPEG_INPUT) { - pixel_format = PixelFormat_8BitBGRA; + pixel_format = capture->get_current_pixel_format(); } else if (global_flags.ten_bit_input) { pixel_format = PixelFormat_10BitYCbCr; } else { diff --git a/theme.cpp b/theme.cpp index ce1389f..048abdd 100644 --- a/theme.cpp +++ b/theme.cpp @@ -222,7 +222,7 @@ int EffectChain_add_video_input(lua_State* L) // doesn't care about the object anymore. (If we change this, we'd need // to also unregister the signal connection on __gc.) int ret = wrap_lua_object_nonowned( - L, "LiveInputWrapper", theme, chain, bmusb::PixelFormat_8BitBGRA, + L, "LiveInputWrapper", theme, chain, (*capture)->get_current_pixel_format(), /*override_bounce=*/false, deinterlace); if (ret == 1) { Theme *theme = get_theme_updata(L); @@ -341,12 +341,21 @@ int ImageInput_new(lua_State* L) int VideoInput_new(lua_State* L) { - assert(lua_gettop(L) == 1); + assert(lua_gettop(L) == 2); string filename = checkstdstring(L, 1); + int pixel_format = luaL_checknumber(L, 2); + if (pixel_format != bmusb::PixelFormat_8BitYCbCrPlanar && + pixel_format != bmusb::PixelFormat_8BitBGRA) { + fprintf(stderr, "WARNING: Invalid enum %d used for video format, choosing Y'CbCr.\n", + pixel_format); + pixel_format = bmusb::PixelFormat_8BitYCbCrPlanar; + } int ret = wrap_lua_object_nonowned(L, "VideoInput", filename, global_flags.width, global_flags.height); if (ret == 1) { - Theme *theme = get_theme_updata(L); 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; @@ -892,6 +901,7 @@ Theme::Theme(const string &filename, const vector &search_dirs, Resource L = luaL_newstate(); luaL_openlibs(L); + register_constants(); register_class("EffectChain", EffectChain_funcs); register_class("LiveInputWrapper", LiveInputWrapper_funcs); register_class("ImageInput", ImageInput_funcs); @@ -949,6 +959,26 @@ Theme::~Theme() lua_close(L); } +void Theme::register_constants() +{ + // Set Nageru.VIDEO_FORMAT_BGRA = bmusb::PixelFormat_8BitBGRA, etc. + const vector> constants = { + { "VIDEO_FORMAT_BGRA", bmusb::PixelFormat_8BitBGRA }, + { "VIDEO_FORMAT_YCBCR", bmusb::PixelFormat_8BitYCbCrPlanar }, + }; + + lua_newtable(L); // t = {} + + for (const pair &constant : constants) { + lua_pushstring(L, constant.first.c_str()); + lua_pushinteger(L, constant.second); + lua_settable(L, 1); // t[key] = value + } + + lua_setglobal(L, "Nageru"); // Nageru = t + assert(lua_gettop(L) == 0); +} + void Theme::register_class(const char *class_name, const luaL_Reg *funcs) { assert(lua_gettop(L) == 0); diff --git a/theme.h b/theme.h index cc8765c..71e44bd 100644 --- a/theme.h +++ b/theme.h @@ -78,6 +78,7 @@ public: } private: + void register_constants(); void register_class(const char *class_name, const luaL_Reg *funcs); std::mutex m; -- 2.39.2