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/lua/luainstance.h b/src/gui/lua/luainstance.h index 3a0a0ff71..f3aa9ad70 100644 --- a/src/gui/lua/luainstance.h +++ b/src/gui/lua/luainstance.h @@ -32,7 +32,7 @@ extern "C" { #if 0 #define LUA_API_VERSION_MAJOR 1 -#define LUA_API_VERSION_MINOR 35 +#define LUA_API_VERSION_MINOR 36 #endif void LuaInstRegisterFunctions(lua_State *L, bool fromThreads=false); diff --git a/src/gui/movieplayer.cpp b/src/gui/movieplayer.cpp index d54dded4a..a438bc3d2 100644 --- a/src/gui/movieplayer.cpp +++ b/src/gui/movieplayer.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -190,6 +191,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); @@ -309,6 +311,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; @@ -1725,14 +1728,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