diff --git a/src/gui/lua/lua_api_version.h b/src/gui/lua/lua_api_version.h index ad6df3c94..04b3f6681 100644 --- a/src/gui/lua/lua_api_version.h +++ b/src/gui/lua/lua_api_version.h @@ -4,4 +4,4 @@ * to luainstance.h changes */ #define LUA_API_VERSION_MAJOR 1 -#define LUA_API_VERSION_MINOR 35 +#define LUA_API_VERSION_MINOR 36 diff --git a/src/gui/lua/lua_video.cpp b/src/gui/lua/lua_video.cpp index 5dc3e26cf..b0e604847 100644 --- a/src/gui/lua/lua_video.cpp +++ b/src/gui/lua/lua_video.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -58,6 +59,7 @@ void CLuaInstVideo::LuaVideoRegister(lua_State *L) { "ShowPicture", CLuaInstVideo::ShowPicture }, { "StopPicture", CLuaInstVideo::StopPicture }, { "PlayFile", CLuaInstVideo::PlayFile }, + { "setInfoFunc", CLuaInstVideo::setInfoFunc }, { "zapitStopPlayBack", CLuaInstVideo::zapitStopPlayBack }, { "channelRezap", CLuaInstVideo::channelRezap }, { "createChannelIDfromUrl", CLuaInstVideo::createChannelIDfromUrl }, @@ -170,13 +172,56 @@ int CLuaInstVideo::PlayFile(lua_State *L) std::string si1(info1); std::string si2(info2); std::string sf(fname); + if (D != NULL && !D->infoFunc.empty()) + CMoviePlayerGui::getInstance().setLuaInfoFunc(L, true); CMoviePlayerGui::getInstance().SetFile(st, sf, si1, si2); CMoviePlayerGui::getInstance().exec(NULL, "http_lua"); + CMoviePlayerGui::getInstance().setLuaInfoFunc(L, false); int ret = CMoviePlayerGui::getInstance().getKeyPressed(); lua_pushinteger(L, ret); return 1; } +int CLuaInstVideo::setInfoFunc(lua_State *L) +{ + CLuaVideo *D = VideoCheckData(L, 1); + if (!D) return 0; + + int numargs = lua_gettop(L); + if (numargs < 2) { + printf("CLuaInstVideo::%s: not enough arguments (%d, expected 1)\n", __func__, numargs-1); + return 0; + } + + D->infoFunc = luaL_checkstring(L, 2); + return 0; +} + +bool CLuaInstVideo::execLuaInfoFunc(lua_State *L, int xres, int yres, int aspectRatio, int framerate) +{ + CLuaVideo *D = VideoCheckData(L, 1); + if (!D) return false; + + lua_getglobal(L, D->infoFunc.c_str()); + lua_pushinteger(L, (lua_Integer)xres); + lua_pushinteger(L, (lua_Integer)yres); + lua_pushinteger(L, (lua_Integer)aspectRatio); + lua_pushinteger(L, (lua_Integer)framerate); + int status = lua_pcall(L, 4, 0, 0); + if (status) { + char msg[1024]; + lua_Debug ar; + lua_getstack(L, 1, &ar); + lua_getinfo(L, "Sl", &ar); + memset(msg, '\0', sizeof(msg)); + snprintf(msg, sizeof(msg)-1, "[%s:%d] error running function '%s': %s", ar.short_src, ar.currentline, D->infoFunc.c_str(), lua_tostring(L, -1)); + fprintf(stderr, "[CLuaInstVideo::%s:%d] %s\n", __func__, __LINE__, msg); + DisplayErrorMessage(msg); + return false; + } + return true; +} + int CLuaInstVideo::zapitStopPlayBack(lua_State *L) { /* workaround for deprecated functions */ diff --git a/src/gui/lua/lua_video.h b/src/gui/lua/lua_video.h index 6668f3a5b..da0128950 100644 --- a/src/gui/lua/lua_video.h +++ b/src/gui/lua/lua_video.h @@ -24,7 +24,8 @@ class CLuaVideo { public: bool singlePlay; - CLuaVideo() { singlePlay=false; }; + std::string infoFunc; + CLuaVideo() { singlePlay=false; infoFunc=""; }; ~CLuaVideo() {}; }; @@ -36,6 +37,7 @@ class CLuaInstVideo static CLuaInstVideo* getInstance(); static void LuaVideoRegister(lua_State *L); static int channelRezap(lua_State *L); + static bool execLuaInfoFunc(lua_State *L, int xres, int yres, int aspectRatio, int framerate); /* deprecated functions */ static int setBlank_old(lua_State *L); @@ -53,6 +55,7 @@ class CLuaInstVideo static int ShowPicture(lua_State *L); static int StopPicture(lua_State *L); static int PlayFile(lua_State *L); + static int setInfoFunc(lua_State *L); static int zapitStopPlayBack(lua_State *L); static int createChannelIDfromUrl(lua_State *L); static int getNeutrinoMode(lua_State *L); diff --git a/src/gui/movieplayer.cpp b/src/gui/movieplayer.cpp index 7c2b344ce..2c2be6090 100644 --- a/src/gui/movieplayer.cpp +++ b/src/gui/movieplayer.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -206,6 +207,7 @@ void CMoviePlayerGui::Init(void) filelist_it = filelist.end(); keyPressed = CMoviePlayerGui::PLUGIN_PLAYSTATE_NORMAL; isLuaPlay = false; + haveLuaInfoFunc = false; blockedFromPlugin = false; m_screensaver = false; m_idletime = time(NULL); @@ -337,6 +339,7 @@ int CMoviePlayerGui::exec(CMenuTarget * parent, const std::string & actionKey) isLuaPlay = true; is_file_player = true; PlayFile(); + haveLuaInfoFunc = false; } else { return menu_return::RETURN_REPAINT; @@ -1758,14 +1761,25 @@ void CMoviePlayerGui::handleMovieBrowser(neutrino_msg_t msg, int /*position*/) cMovieInfo.saveMovieInfo(*p_movie_info); /* save immediately in xml file */ } } - } else if (msg == NeutrinoMessages::SHOW_EPG && p_movie_info) { + } else if (msg == NeutrinoMessages::SHOW_EPG && (p_movie_info || (isLuaPlay && haveLuaInfoFunc))) { CTimeOSD::mode m_mode = FileTime.getMode(); bool restore = FileTime.IsVisible(); if (restore) FileTime.kill(); InfoClock->enableInfoClock(false); - cMovieInfo.showMovieInfo(*p_movie_info); + if (isLuaPlay && haveLuaInfoFunc) { + int xres = 0, yres = 0, aspectRatio = 0, framerate = -1; + if (!videoDecoder->getBlank()) { + videoDecoder->getPictureInfo(xres, yres, framerate); + if (yres == 1088) + yres = 1080; + aspectRatio = videoDecoder->getAspectRatio(); + } + CLuaInstVideo::getInstance()->execLuaInfoFunc(luaState, xres, yres, aspectRatio, framerate); + } + else if (p_movie_info) + cMovieInfo.showMovieInfo(*p_movie_info); InfoClock->enableInfoClock(true); if (restore) { diff --git a/src/gui/movieplayer.h b/src/gui/movieplayer.h index fcef1ea6f..aa558cc24 100644 --- a/src/gui/movieplayer.h +++ b/src/gui/movieplayer.h @@ -53,6 +53,12 @@ #include #include +extern "C" { +#include +#include +#include +} + class CMoviePlayerGui : public CMenuTarget { public: @@ -91,6 +97,8 @@ class CMoviePlayerGui : public CMenuTarget CMoviePlayerGui::state playstate; int keyPressed; bool isLuaPlay; + bool haveLuaInfoFunc; + lua_State* luaState; bool blockedFromPlugin; int speed; int startposition; @@ -230,6 +238,7 @@ class CMoviePlayerGui : public CMenuTarget void restoreNeutrino(); void setBlockedFromPlugin(bool b) { blockedFromPlugin = b; }; bool getBlockedFromPlugin() { return blockedFromPlugin; }; + void setLuaInfoFunc(lua_State* L, bool func) { luaState = L; haveLuaInfoFunc = func; }; }; #endif diff --git a/src/gui/screensaver.cpp b/src/gui/screensaver.cpp index c6fe0d0f2..0235a9358 100644 --- a/src/gui/screensaver.cpp +++ b/src/gui/screensaver.cpp @@ -111,7 +111,7 @@ void CScreenSaver::Start() if(!thrScreenSaver) { - //printf("[%s] %s: starting thread\n", __FILE__, __FUNCTION__); + //printf("[%s] %s: starting thread\n", __file__, __FUNCTION__); pthread_create(&thrScreenSaver, NULL, ScreenSaverPrg, (void*) this); pthread_detach(thrScreenSaver); } @@ -290,12 +290,12 @@ void CScreenSaver::paint() do { clr.i_color = rand(); brightness = (unsigned int)clr.uc_color.r * 19595 + (unsigned int)clr.uc_color.g * 38469 + (unsigned int)clr.uc_color.b * 7471; - //printf("[%s] %s: brightness: %d\n", __FILE__, __FUNCTION__, brightness>> 16); + //printf("[%s] %s: brightness: %d\n", __file__, __FUNCTION__, brightness>> 16); } while(brightness >> 16 < 80); clr.i_color &= 0x00FFFFFF; - //printf("[%s] %s: clr.i_color: r %02x g %02x b %02x a %02x\n", __FILE__, __FUNCTION__, clr.uc_color.r, clr.uc_color.g, clr.uc_color.b, clr.uc_color.a); + //printf("[%s] %s: clr.i_color: r %02x g %02x b %02x a %02x\n", __file__, __FUNCTION__, clr.uc_color.r, clr.uc_color.g, clr.uc_color.b, clr.uc_color.a); } else clr.i_color = COL_DARK_GRAY;