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 = vlc_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 = vlc_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; }
int DoAcoustIdWebRequest( vlc_object_t *p_obj, acoustid_fingerprint_t *p_data ) { if ( !p_data->psz_fingerprint ) return VLC_SUCCESS; char *psz_url; if( unlikely(asprintf( &psz_url, "https://fingerprint.videolan.org/" "acoustid.php?meta=recordings+tracks+usermeta+" "releases&duration=%d&fingerprint=%s", p_data->i_duration, p_data->psz_fingerprint ) < 1 ) ) return VLC_EGENERIC; msg_Dbg( p_obj, "Querying AcoustID from %s", psz_url ); int i_saved_flags = p_obj->obj.flags; p_obj->obj.flags |= OBJECT_FLAGS_NOINTERACT; stream_t *p_stream = vlc_stream_NewURL( p_obj, psz_url ); free( psz_url ); p_obj->obj.flags = i_saved_flags; if ( p_stream == NULL ) return VLC_EGENERIC; stream_t *p_chain = vlc_stream_FilterNew( p_stream, "inflate" ); if( p_chain ) p_stream = p_chain; /* read answer */ char *p_buffer = NULL; int i_ret = 0; for( ;; ) { int i_read = 65536; if( i_ret >= INT_MAX - i_read ) break; p_buffer = realloc_or_free( p_buffer, 1 + i_ret + i_read ); if( unlikely(p_buffer == NULL) ) { vlc_stream_Delete( p_stream ); return VLC_ENOMEM; } i_read = vlc_stream_Read( p_stream, &p_buffer[i_ret], i_read ); if( i_read <= 0 ) break; i_ret += i_read; } vlc_stream_Delete( p_stream ); p_buffer[i_ret] = 0; if ( ParseJson( p_obj, p_buffer, & p_data->results ) ) msg_Dbg( p_obj, "results count == %d", p_data->results.count ); else msg_Dbg( p_obj, "No results" ); free( p_buffer ); return VLC_SUCCESS; }
/* Add automatic stream filter */ stream_t *stream_FilterAutoNew( stream_t *p_source ) { for( ;; ) { stream_t *p_filter = vlc_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; }
static stream_t * vlc_stream_NewURL_ND( addons_finder_t *p_obj, const char *psz_uri ) { stream_t *p_stream = vlc_stream_NewURL( p_obj, psz_uri ); if( p_stream ) { /* (non applicable everywhere) remove extra * compression, bad wine madness :YYY */ stream_t *p_chain = vlc_stream_FilterNew( p_stream, "inflate" ); if( p_chain ) p_stream = p_chain; } return p_stream; }
/* Add automatic stream filter */ stream_t *stream_FilterAutoNew( stream_t *p_source ) { /* Limit number of entries to avoid infinite recursion. */ for( unsigned i = 0; i < 16; i++ ) { stream_t *p_filter = vlc_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; }
static int vlclua_stream_new( lua_State *L ) { vlc_object_t * p_this = vlclua_get_this( L ); const char * psz_url = luaL_checkstring( L, 1 ); stream_t *p_stream = vlc_stream_NewURL( p_this, psz_url ); /* XXX: For hysterical raisins, append one inflate decompression stream * filter automatically (if applicable). */ if( p_stream != NULL ) { stream_t *inflated = vlc_stream_FilterNew( p_stream, "inflate" ); if( inflated != NULL ) p_stream = inflated; } return vlclua_stream_new_inner( L, p_stream ); }
/* 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 = vlc_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; }