]> git.sesse.net Git - vlc/blobdiff - modules/misc/lua/demux.c
Merge branch 'master' of git://git.videolan.org/vlc
[vlc] / modules / misc / lua / demux.c
index 018779dfd7f799c3863ddc4d18eec88fa2bcdfc4..f924512a3d62cd16264ce0c548130320c053e0b6 100644 (file)
@@ -116,18 +116,46 @@ static const luaL_Reg p_reg_parse[] =
  * the script pointed by psz_filename.
  *****************************************************************************/
 static int probe_luascript( vlc_object_t *p_this, const char * psz_filename,
-                            lua_State * L, void * user_data )
+                            void * user_data )
 {
     VLC_UNUSED(user_data);
     demux_t * p_demux = (demux_t *)p_this;
 
     p_demux->p_sys->psz_filename = strdup(psz_filename);
 
-    /* In lua, setting a variable's value to nil is equivalent to deleting it */
-    lua_pushnil( L );
-    lua_pushnil( L );
-    lua_setglobal( L, "probe" );
-    lua_setglobal( L, "parse" );
+    /* Initialise Lua state structure */
+    lua_State *L = luaL_newstate();
+    if( !L )
+    {
+        msg_Err( p_demux, "Could not create new Lua State" );
+        goto error;
+    }
+    p_demux->p_sys->L = L;
+
+    /* Load Lua libraries */
+    luaL_openlibs( L ); /* FIXME: Don't open all the libs? */
+
+    vlclua_set_this( L, p_demux );
+    luaL_register( L, "vlc", p_reg );
+    luaopen_msg( L );
+    luaopen_strings( L );
+    luaopen_stream( L );
+    luaopen_xml( L );
+    luaopen_md5( L );
+    lua_pushstring( L, p_demux->psz_location );
+    lua_setfield( L, -2, "path" );
+    lua_pushstring( L, p_demux->psz_access );
+    lua_setfield( L, -2, "access" );
+
+    lua_pop( L, 1 );
+
+    /* Setup the module search path */
+    if( vlclua_add_modules_path( p_demux, L, psz_filename ) )
+    {
+        msg_Warn( p_demux, "Error while setting the module search path for %s",
+                  psz_filename );
+        goto error;
+    }
 
     /* Load and run the script(s) */
     if( luaL_dofile( L, psz_filename ) )
@@ -141,14 +169,14 @@ static int probe_luascript( vlc_object_t *p_this, const char * psz_filename,
 
     if( !lua_isfunction( L, -1 ) )
     {
-        msg_Warn( p_demux, "Error while runing script %s, "
+        msg_Warn( p_demux, "Error while running script %s, "
                   "function probe() not found", psz_filename );
         goto error;
     }
 
     if( lua_pcall( L, 0, 1, 0 ) )
     {
-        msg_Warn( p_demux, "Error while runing script %s, "
+        msg_Warn( p_demux, "Error while running script %s, "
                   "function probe(): %s", psz_filename,
                   lua_tostring( L, lua_gettop( L ) ) );
         goto error;
@@ -167,6 +195,8 @@ static int probe_luascript( vlc_object_t *p_this, const char * psz_filename,
 
 error:
     lua_pop( L, 1 );
+    lua_close( p_demux->p_sys->L );
+    p_demux->p_sys->L = NULL;
     FREENULL( p_demux->p_sys->psz_filename );
     return VLC_EGENERIC;
 }
@@ -177,47 +207,17 @@ error:
 int Import_LuaPlaylist( vlc_object_t *p_this )
 {
     demux_t *p_demux = (demux_t *)p_this;
-    lua_State *L;
     int ret;
 
-    p_demux->p_sys = (demux_sys_t*)malloc( sizeof( demux_sys_t ) );
+    p_demux->p_sys = calloc( 1, sizeof( demux_sys_t ) );
     if( !p_demux->p_sys )
-    {
         return VLC_ENOMEM;
-    }
-
-    p_demux->p_sys->psz_filename = NULL;
 
     p_demux->pf_control = Control;
     p_demux->pf_demux = Demux;
 
-    /* Initialise Lua state structure */
-    L = luaL_newstate();
-    if( !L )
-    {
-        msg_Err( p_demux, "Could not create new Lua State" );
-        free( p_demux->p_sys );
-        return VLC_EGENERIC;
-    }
-    p_demux->p_sys->L = L;
-
-    /* Load Lua libraries */
-    luaL_openlibs( L ); /* FIXME: Don't open all the libs? */
-
-    luaL_register( L, "vlc", p_reg );
-    luaopen_msg( L );
-    luaopen_strings( L );
-    lua_pushlightuserdata( L, p_demux );
-    lua_setfield( L, -2, "private" );
-    lua_pushstring( L, p_demux->psz_path );
-    lua_setfield( L, -2, "path" );
-    lua_pushstring( L, p_demux->psz_access );
-    lua_setfield( L, -2, "access" );
-
-    lua_pop( L, 1 );
-
     ret = vlclua_scripts_batch_execute( p_this, "playlist",
-                                        &probe_luascript, L, NULL );
+                                        &probe_luascript, NULL );
     if( ret )
         Close_LuaPlaylist( p_this );
     return ret;
@@ -230,7 +230,8 @@ int Import_LuaPlaylist( vlc_object_t *p_this )
 void Close_LuaPlaylist( vlc_object_t *p_this )
 {
     demux_t *p_demux = (demux_t *)p_this;
-    lua_close( p_demux->p_sys->L );
+    if( p_demux->p_sys->L )
+        lua_close( p_demux->p_sys->L );
     free( p_demux->p_sys->psz_filename );
     free( p_demux->p_sys );
 }
@@ -250,16 +251,18 @@ static int Demux( demux_t *p_demux )
 
     if( !lua_isfunction( L, -1 ) )
     {
-        msg_Warn( p_demux, "Error while runing script %s, "
+        msg_Warn( p_demux, "Error while running script %s, "
                   "function parse() not found", psz_filename );
+        vlc_object_release( p_input_thread );
         return VLC_EGENERIC;
     }
 
     if( lua_pcall( L, 0, 1, 0 ) )
     {
-        msg_Warn( p_demux, "Error while runing script %s, "
+        msg_Warn( p_demux, "Error while running script %s, "
                   "function parse(): %s", psz_filename,
                   lua_tostring( L, lua_gettop( L ) ) );
+        vlc_object_release( p_input_thread );
         return VLC_EGENERIC;
     }