]> git.sesse.net Git - nageru/commitdiff
Expose choosing video pixel format to Lua.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 21 May 2017 11:30:22 +0000 (13:30 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 28 May 2017 14:12:21 +0000 (16:12 +0200)
mixer.cpp
theme.cpp
theme.h

index 261c8eec810ce27cf7d67fb2cf89d4b1f5c29923..421efea9f13a096a16b8460ae42152ead88fa164 100644 (file)
--- 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 {
index ce1389f7cc4ea635ec0c2fbe4a295c8a8c3832fc..048abddcff168843f4cd9ab8fde751df1e896101 100644 (file)
--- 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<LiveInputWrapper>(
-               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<FFmpegCapture>(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<string> &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<pair<string, int>> constants = {
+               { "VIDEO_FORMAT_BGRA", bmusb::PixelFormat_8BitBGRA },
+               { "VIDEO_FORMAT_YCBCR", bmusb::PixelFormat_8BitYCbCrPlanar },
+       };
+
+       lua_newtable(L);  // t = {}
+
+       for (const pair<string, int> &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 cc8765c8e5e055d6e77eb9eced8da43b8e3e44e7..71e44bd42cac49b4b9691f358c8f85f545f7addf 100644 (file)
--- 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;