1 /*****************************************************************************
2 * demux.c : Lua playlist demux module
3 *****************************************************************************
4 * Copyright (C) 2007-2008 the VideoLAN team
7 * Authors: Antoine Cellerier <dionoea at videolan tod org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
37 /*****************************************************************************
39 *****************************************************************************/
40 static int Demux( demux_t
*p_demux
);
41 static int Control( demux_t
*p_demux
, int i_query
, va_list args
);
43 /*****************************************************************************
44 * Demux specific functions
45 *****************************************************************************/
52 static int vlclua_demux_peek( lua_State
*L
)
54 demux_t
*p_demux
= (demux_t
*)vlclua_get_this( L
);
55 int n
= luaL_checkint( L
, 1 );
56 const uint8_t *p_peek
;
58 int i_peek
= stream_Peek( p_demux
->s
, &p_peek
, n
);
60 lua_pushlstring( L
, (const char *)p_peek
, i_peek
);
66 static int vlclua_demux_read( lua_State
*L
)
68 demux_t
*p_demux
= (demux_t
*)vlclua_get_this( L
);
69 const uint8_t *p_read
;
70 int n
= luaL_checkint( L
, 1 );
71 int i_read
= stream_Peek( p_demux
->s
, &p_read
, n
);
75 lua_pushlstring( L
, (const char *)p_read
, i_read
);
76 int i_seek
= stream_Read( p_demux
->s
, NULL
, i_read
);
77 assert( i_read
== i_seek
);
85 static int vlclua_demux_readline( lua_State
*L
)
87 demux_t
*p_demux
= (demux_t
*)vlclua_get_this( L
);
88 char *psz_line
= stream_ReadLine( p_demux
->s
);
91 lua_pushstring( L
, psz_line
);
101 /*****************************************************************************
103 *****************************************************************************/
104 /* Functions to register */
105 static const luaL_Reg p_reg
[] =
107 { "peek", vlclua_demux_peek
},
111 /* Functions to register for parse() function call only */
112 static const luaL_Reg p_reg_parse
[] =
114 { "read", vlclua_demux_read
},
115 { "readline", vlclua_demux_readline
},
119 /*****************************************************************************
120 * Called through lua_scripts_batch_execute to call 'probe' on
121 * the script pointed by psz_filename.
122 *****************************************************************************/
123 static int probe_luascript( vlc_object_t
*p_this
, const char * psz_filename
,
124 const luabatch_context_t
*p_context
)
126 VLC_UNUSED(p_context
);
127 demux_t
* p_demux
= (demux_t
*)p_this
;
129 p_demux
->p_sys
->psz_filename
= strdup(psz_filename
);
131 /* Initialise Lua state structure */
132 lua_State
*L
= luaL_newstate();
135 msg_Err( p_demux
, "Could not create new Lua State" );
138 p_demux
->p_sys
->L
= L
;
140 /* Load Lua libraries */
141 luaL_openlibs( L
); /* FIXME: Don't open all the libs? */
143 vlclua_set_this( L
, p_demux
);
144 luaL_register( L
, "vlc", p_reg
);
146 luaopen_strings( L
);
148 luaopen_variables( L
);
150 lua_pushstring( L
, p_demux
->psz_location
);
151 lua_setfield( L
, -2, "path" );
152 lua_pushstring( L
, p_demux
->psz_access
);
153 lua_setfield( L
, -2, "access" );
157 /* Setup the module search path */
158 if( vlclua_add_modules_path( L
, psz_filename
) )
160 msg_Warn( p_demux
, "Error while setting the module search path for %s",
165 /* Load and run the script(s) */
166 if( vlclua_dofile( VLC_OBJECT(p_demux
), L
, psz_filename
) )
168 msg_Warn( p_demux
, "Error loading script %s: %s", psz_filename
,
169 lua_tostring( L
, lua_gettop( L
) ) );
173 lua_getglobal( L
, "probe" );
175 if( !lua_isfunction( L
, -1 ) )
177 msg_Warn( p_demux
, "Error while running script %s, "
178 "function probe() not found", psz_filename
);
182 if( lua_pcall( L
, 0, 1, 0 ) )
184 msg_Warn( p_demux
, "Error while running script %s, "
185 "function probe(): %s", psz_filename
,
186 lua_tostring( L
, lua_gettop( L
) ) );
190 if( lua_gettop( L
) )
192 if( lua_toboolean( L
, 1 ) )
194 msg_Dbg( p_demux
, "Lua playlist script %s's "
195 "probe() function was successful", psz_filename
);
203 lua_close( p_demux
->p_sys
->L
);
204 p_demux
->p_sys
->L
= NULL
;
205 FREENULL( p_demux
->p_sys
->psz_filename
);
209 /*****************************************************************************
210 * Import_LuaPlaylist: main import function
211 *****************************************************************************/
212 int Import_LuaPlaylist( vlc_object_t
*p_this
)
214 demux_t
*p_demux
= (demux_t
*)p_this
;
217 p_demux
->p_sys
= calloc( 1, sizeof( demux_sys_t
) );
218 if( !p_demux
->p_sys
)
221 p_demux
->pf_control
= Control
;
222 p_demux
->pf_demux
= Demux
;
224 ret
= vlclua_scripts_batch_execute( p_this
, "playlist",
225 &probe_luascript
, NULL
);
227 Close_LuaPlaylist( p_this
);
232 /*****************************************************************************
233 * Deactivate: frees unused data
234 *****************************************************************************/
235 void Close_LuaPlaylist( vlc_object_t
*p_this
)
237 demux_t
*p_demux
= (demux_t
*)p_this
;
238 if( p_demux
->p_sys
->L
)
239 lua_close( p_demux
->p_sys
->L
);
240 free( p_demux
->p_sys
->psz_filename
);
241 free( p_demux
->p_sys
);
244 static int Demux( demux_t
*p_demux
)
246 lua_State
*L
= p_demux
->p_sys
->L
;
247 char *psz_filename
= p_demux
->p_sys
->psz_filename
;
249 input_item_t
*p_current_input
= input_GetItem( p_demux
->p_input
);
251 luaL_register( L
, "vlc", p_reg_parse
);
253 lua_getglobal( L
, "parse" );
255 if( !lua_isfunction( L
, -1 ) )
257 msg_Warn( p_demux
, "Error while running script %s, "
258 "function parse() not found", psz_filename
);
262 if( lua_pcall( L
, 0, 1, 0 ) )
264 msg_Warn( p_demux
, "Error while running script %s, "
265 "function parse(): %s", psz_filename
,
266 lua_tostring( L
, lua_gettop( L
) ) );
270 if( lua_gettop( L
) )
271 vlclua_playlist_add_internal( p_demux
, L
, NULL
, p_current_input
, 0 );
273 msg_Err( p_demux
, "Script went completely foobar" );
275 return -1; /* Needed for correct operation of go back */
278 static int Control( demux_t
*p_demux
, int i_query
, va_list args
)
280 VLC_UNUSED(p_demux
); VLC_UNUSED(i_query
); VLC_UNUSED(args
);