static int vlclua_stream_add_filter( lua_State *L ) { vlc_object_t *p_this = vlclua_get_this( L ); /* Make sure that we have 1 argument (+ 1 object) */ lua_settop( L, 2 ); stream_t **pp_stream = (stream_t **)luaL_checkudata( L, 1, "stream" ); if( !*pp_stream ) return vlclua_error( L ); const char *psz_filter = NULL; if( lua_isstring( L, 2 ) ) psz_filter = lua_tostring( L, 2 ); if( !psz_filter || !*psz_filter ) { msg_Dbg( p_this, "adding all automatic stream filters" ); while( true ) { /* Add next automatic stream */ stream_t *p_filtered = stream_FilterNew( *pp_stream, NULL ); if( !p_filtered ) break; else { msg_Dbg( p_this, "inserted an automatic stream filter" ); *pp_stream = p_filtered; } } luaL_getmetatable( L, "stream" ); lua_setmetatable( L, 1 ); } else { /* Add a named filter */ stream_t *p_filter = stream_FilterNew( *pp_stream, psz_filter ); if( !p_filter ) msg_Dbg( p_this, "Unable to open requested stream filter '%s'", psz_filter ); else { *pp_stream = p_filter; luaL_getmetatable( L, "stream" ); lua_setmetatable( L, 1 ); } } return 1; }
/* Add automatic stream filter */ stream_t *stream_FilterAutoNew( stream_t *p_source ) { for( ;; ) { stream_t *p_filter = stream_FilterNew( p_source, NULL ); if( p_filter == NULL ) break; msg_Dbg( p_filter, "stream filter added to %p", (void *)p_source ); p_source = p_filter; } return p_source; }
/* Add specified stream filter(s) */ stream_t *stream_FilterChainNew( stream_t *p_source, const char *psz_chain ) { /* Add user stream filter */ char *chain = strdup( psz_chain ); if( unlikely(chain == NULL) ) return p_source; char *buf; for( const char *name = strtok_r( chain, ":", &buf ); name != NULL; name = strtok_r( NULL, ":", &buf ) ) { stream_t *p_filter = stream_FilterNew( p_source, name ); if( p_filter != NULL ) p_source = p_filter; else msg_Warn( p_source, "cannot insert stream filter %s", name ); } free( chain ); return p_source; }