/***************************************************************************** * Close: frees unused data *****************************************************************************/ static void Close( vlc_object_t * p_this ) { demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys = p_demux->p_sys; if( p_sys->p_current_block ) block_Release( p_sys->p_current_block ); for( int i = 0; i < p_sys->i_seekpoint; i++ ) free(p_sys->seekpoint[i]); TAB_CLEAN( p_sys->i_seekpoint, p_sys->seekpoint ); for( int i = 0; i < p_sys->i_attachments; i++ ) vlc_input_attachment_Delete( p_sys->attachments[i] ); TAB_CLEAN( p_sys->i_attachments, p_sys->attachments); for( int i = 0; i < p_sys->i_title_seekpoints; i++ ) vlc_seekpoint_Delete( p_sys->pp_title_seekpoints[i] ); TAB_CLEAN( p_sys->i_title_seekpoints, p_sys->pp_title_seekpoints ); /* Delete the decoder */ if( p_sys->p_packetizer ) demux_PacketizerDestroy( p_sys->p_packetizer ); if( p_sys->p_meta ) vlc_meta_Delete( p_sys->p_meta ); free( p_sys ); }
void input_item_Release( input_item_t *p_item ) { input_item_owner_t *owner = item_owner(p_item); if( atomic_fetch_sub(&owner->refs, 1) != 1 ) return; vlc_event_manager_fini( &p_item->event_manager ); free( p_item->psz_name ); free( p_item->psz_uri ); if( p_item->p_stats != NULL ) { vlc_mutex_destroy( &p_item->p_stats->lock ); free( p_item->p_stats ); } if( p_item->p_meta != NULL ) vlc_meta_Delete( p_item->p_meta ); for( input_item_opaque_t *o = p_item->opaques, *next; o != NULL; o = next ) { next = o->next; free( o ); } for( int i = 0; i < p_item->i_options; i++ ) free( p_item->ppsz_options[i] ); TAB_CLEAN( p_item->i_options, p_item->ppsz_options ); free( p_item->optflagv ); for( int i = 0; i < p_item->i_es; i++ ) { es_format_Clean( p_item->es[i] ); free( p_item->es[i] ); } TAB_CLEAN( p_item->i_es, p_item->es ); for( int i = 0; i < p_item->i_epg; i++ ) vlc_epg_Delete( p_item->pp_epg[i] ); TAB_CLEAN( p_item->i_epg, p_item->pp_epg ); for( int i = 0; i < p_item->i_categories; i++ ) info_category_Delete( p_item->pp_categories[i] ); TAB_CLEAN( p_item->i_categories, p_item->pp_categories ); for( int i = 0; i < p_item->i_slaves; i++ ) input_item_slave_Delete( p_item->pp_slaves[i] ); TAB_CLEAN( p_item->i_slaves, p_item->pp_slaves ); vlc_mutex_destroy( &p_item->lock ); free( owner ); }
static inline void input_item_Clean( input_item_t *p_i ) { int i; vlc_event_manager_fini( &p_i->event_manager ); free( p_i->psz_name ); free( p_i->psz_uri ); if( p_i->p_stats ) { vlc_mutex_destroy( &p_i->p_stats->lock ); free( p_i->p_stats ); } if( p_i->p_meta ) vlc_meta_Delete( p_i->p_meta ); for( i = 0; i < p_i->i_options; i++ ) free( p_i->ppsz_options[i] ); TAB_CLEAN( p_i->i_options, p_i->ppsz_options ); free( p_i->optflagv); for( i = 0; i < p_i->i_es; i++ ) { es_format_Clean( p_i->es[i] ); free( p_i->es[i] ); } TAB_CLEAN( p_i->i_es, p_i->es ); for( i = 0; i < p_i->i_categories; i++ ) { info_category_t *p_category = p_i->pp_categories[i]; int j; for( j = 0; j < p_category->i_infos; j++ ) { struct info_t *p_info = p_category->pp_infos[j]; free( p_info->psz_name); free( p_info->psz_value ); free( p_info ); } TAB_CLEAN( p_category->i_infos, p_category->pp_infos ); free( p_category->psz_name ); free( p_category ); } TAB_CLEAN( p_i->i_categories, p_i->pp_categories ); vlc_mutex_destroy( &p_i->lock ); }
static vlm_media_instance_t *libvlc_vlm_get_media_instance( libvlc_instance_t *p_instance, char *psz_name, int i_minstance_idx, libvlc_exception_t *p_exception ) { #ifdef ENABLE_VLM vlm_t *p_vlm; vlm_media_instance_t **pp_minstance; vlm_media_instance_t *p_minstance; int i_minstance; int64_t id; VLM_RET(p_vlm, NULL); if( vlm_Control( p_vlm, VLM_GET_MEDIA_ID, psz_name, &id ) || vlm_Control( p_vlm, VLM_GET_MEDIA_INSTANCES, id, &pp_minstance, &i_minstance ) ) { libvlc_exception_raise( p_exception, "Unable to get %s instances", psz_name ); return NULL; } p_minstance = NULL; if( i_minstance_idx >= 0 && i_minstance_idx < i_minstance ) { p_minstance = pp_minstance[i_minstance_idx]; TAB_REMOVE( i_minstance, pp_minstance, p_minstance ); } while( i_minstance > 0 ) vlm_media_instance_Delete( pp_minstance[--i_minstance] ); TAB_CLEAN( i_minstance, pp_minstance ); return p_minstance; #else libvlc_exception_raise( p_exception, "VLM has been disabled in this libvlc." ); return VLC_EGENERIC; #endif }
/***************************************************************************** * Close: *****************************************************************************/ static void Close( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys = p_demux->p_sys; int i; for( i = 0; i < PS_TK_COUNT; i++ ) { ps_track_t *tk = &p_sys->tk[i]; if( tk->b_seen ) { es_format_Clean( &tk->fmt ); if( tk->es ) es_out_Del( p_demux->out, tk->es ); } } /* Free the array of titles */ for( int i = 0; i < p_sys->i_titles; i++ ) vlc_input_title_Delete( p_sys->titles[i] ); TAB_CLEAN( p_sys->i_titles, p_sys->titles ); /* Close libdvdread */ if( p_sys->p_title ) DVDCloseFile( p_sys->p_title ); if( p_sys->p_vts_file ) ifoClose( p_sys->p_vts_file ); if( p_sys->p_vmg_file ) ifoClose( p_sys->p_vmg_file ); DVDClose( p_sys->p_dvdread ); free( p_sys ); }
static vlm_media_instance_t * libvlc_vlm_get_media_instance( libvlc_instance_t *p_instance, const char *psz_name, int i_minstance_idx ) { vlm_t *p_vlm; vlm_media_instance_t **pp_minstance; vlm_media_instance_t *p_minstance; int i_minstance; int64_t id; VLM_RET(p_vlm, NULL); if( vlm_Control( p_vlm, VLM_GET_MEDIA_ID, psz_name, &id ) || vlm_Control( p_vlm, VLM_GET_MEDIA_INSTANCES, id, &pp_minstance, &i_minstance ) ) { libvlc_printerr( "%s: media instances not found", psz_name ); return NULL; } p_minstance = NULL; if( i_minstance_idx >= 0 && i_minstance_idx < i_minstance ) { p_minstance = pp_minstance[i_minstance_idx]; TAB_REMOVE( i_minstance, pp_minstance, p_minstance ); } while( i_minstance > 0 ) vlm_media_instance_Delete( pp_minstance[--i_minstance] ); TAB_CLEAN( i_minstance, pp_minstance ); return p_minstance; }
/***************************************************************************** * Close *****************************************************************************/ void avformat_CloseDemux( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys = p_demux->p_sys; free( p_sys->tracks ); if( p_sys->ic ) { if( p_sys->ic->pb ) { av_free( p_sys->ic->pb->buffer ); av_free( p_sys->ic->pb ); } avformat_close_input( &p_sys->ic ); } for( int i = 0; i < p_sys->i_attachments; i++ ) vlc_input_attachment_Delete( p_sys->attachments[i] ); TAB_CLEAN( p_sys->i_attachments, p_sys->attachments); if( p_sys->p_title ) vlc_input_title_Delete( p_sys->p_title ); free( p_sys ); }
static void vlc_epg_Clean( vlc_epg_t *p_epg ) { size_t i; for( i = 0; i < p_epg->i_event; i++ ) vlc_epg_event_Delete( p_epg->pp_event[i] ); TAB_CLEAN( p_epg->i_event, p_epg->pp_event ); free( p_epg->psz_name ); }
void scan_Clean( scan_t *p_scan ) { if( p_scan->p_dialog != NULL ) dialog_ProgressDestroy( p_scan->p_dialog ); for( int i = 0; i < p_scan->i_service; i++ ) scan_service_Delete( p_scan->pp_service[i] ); TAB_CLEAN( p_scan->i_service, p_scan->pp_service ); }
void libvlc_renderer_discoverer_stop( libvlc_renderer_discoverer_t *p_lrd ) { if( p_lrd->p_rd != NULL ) vlc_rd_release( p_lrd->p_rd ); for( int i = 0; i < p_lrd->i_items; ++i ) vlc_renderer_item_release( p_lrd->pp_items[i] ); TAB_CLEAN( p_lrd->i_items, p_lrd->pp_items ); }
/***************************************************************************** * Close: frees unused data *****************************************************************************/ static void Close( vlc_object_t * p_this ) { demux_t *p_demux = (demux_t*)p_this; demux_sys_t *p_sys = p_demux->p_sys; TAB_CLEAN( p_sys->i_seekpoint, p_sys->seekpoint ); int i; for( i = 0; i < p_sys->i_attachments; i++ ) free( p_sys->attachments[i] ); TAB_CLEAN( p_sys->i_attachments, p_sys->attachments); /* Delete the decoder */ demux_PacketizerDestroy( p_sys->p_packetizer ); if( p_sys->p_meta ) vlc_meta_Delete( p_sys->p_meta ); free( p_sys ); }
static inline void input_item_Clean( input_item_t *p_i ) { int i; vlc_event_manager_fini( &p_i->event_manager ); free( p_i->psz_name ); free( p_i->psz_uri ); if( p_i->p_stats ) { vlc_mutex_destroy( &p_i->p_stats->lock ); free( p_i->p_stats ); } if( p_i->p_meta ) vlc_meta_Delete( p_i->p_meta ); for( i = 0; i < p_i->i_options; i++ ) free( p_i->ppsz_options[i] ); TAB_CLEAN( p_i->i_options, p_i->ppsz_options ); free( p_i->optflagv); for( i = 0; i < p_i->i_es; i++ ) { es_format_Clean( p_i->es[i] ); free( p_i->es[i] ); } TAB_CLEAN( p_i->i_es, p_i->es ); for( i = 0; i < p_i->i_tracks; i++ ) input_item_track_Delete( p_i->tracks[i] ); TAB_CLEAN( p_i->tracks, p_i->tracks ); for( i = 0; i < p_i->i_epg; i++ ) vlc_epg_Delete( p_i->pp_epg[i] ); TAB_CLEAN( p_i->i_epg, p_i->pp_epg ); for( i = 0; i < p_i->i_categories; i++ ) info_category_Delete( p_i->pp_categories[i] ); TAB_CLEAN( p_i->i_categories, p_i->pp_categories ); vlc_mutex_destroy( &p_i->lock ); }
void libvlc_media_slaves_clear( libvlc_media_t *p_md ) { assert( p_md ); input_item_t *p_input_item = p_md->p_input_item; vlc_mutex_lock( &p_input_item->lock ); for( int i = 0; i < p_input_item->i_slaves; i++ ) input_item_slave_Delete( p_input_item->pp_slaves[i] ); TAB_CLEAN( p_input_item->i_slaves, p_input_item->pp_slaves ); vlc_mutex_unlock( &p_input_item->lock ); }
/***************************************************************************** * CloseDecoder: clean up the decoder *****************************************************************************/ static void CloseDecoder( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t *)p_this; decoder_sys_t *p_sys = p_dec->p_sys; if( p_sys->iconv_handle != (vlc_iconv_t)-1 ) vlc_iconv_close( p_sys->iconv_handle ); if( p_sys->pp_ssa_styles ) { int i; for( i = 0; i < p_sys->i_ssa_styles; i++ ) { if( !p_sys->pp_ssa_styles[i] ) continue; free( p_sys->pp_ssa_styles[i]->psz_stylename ); free( p_sys->pp_ssa_styles[i]->font_style.psz_fontname ); free( p_sys->pp_ssa_styles[i] ); } TAB_CLEAN( p_sys->i_ssa_styles, p_sys->pp_ssa_styles ); } if( p_sys->pp_images ) { int i; for( i = 0; i < p_sys->i_images; i++ ) { if( !p_sys->pp_images[i] ) continue; if( p_sys->pp_images[i]->p_pic ) picture_Release( p_sys->pp_images[i]->p_pic ); free( p_sys->pp_images[i]->psz_filename ); free( p_sys->pp_images[i] ); } TAB_CLEAN( p_sys->i_images, p_sys->pp_images ); } free( p_sys ); }
/***************************************************************************** * Close: *****************************************************************************/ static void Close( vlc_object_t * p_this ) { sout_stream_t *p_stream = (sout_stream_t*)p_this; sout_stream_sys_t *p_sys = p_stream->p_sys; if( p_sys->p_out ) sout_StreamChainDelete( p_sys->p_out, p_sys->p_out ); TAB_CLEAN( p_sys->i_id, p_sys->id ); free( p_sys->psz_prefix ); free( p_sys ); }
/***************************************************************************** * CloseDecoder: clean up the decoder *****************************************************************************/ static void CloseDecoder( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t *)p_this; decoder_sys_t *p_sys = p_dec->p_sys; if( p_sys->pp_ssa_styles ) { int i; for( i = 0; i < p_sys->i_ssa_styles; i++ ) { if( !p_sys->pp_ssa_styles[i] ) continue; free( p_sys->pp_ssa_styles[i]->psz_stylename ); //FIXME: Make font_style a pointer and use text_style_* functions free( p_sys->pp_ssa_styles[i]->font_style.psz_fontname ); free( p_sys->pp_ssa_styles[i] ); } TAB_CLEAN( p_sys->i_ssa_styles, p_sys->pp_ssa_styles ); } if( p_sys->pp_images ) { int i; for( i = 0; i < p_sys->i_images; i++ ) { if( !p_sys->pp_images[i] ) continue; if( p_sys->pp_images[i]->p_pic ) picture_Release( p_sys->pp_images[i]->p_pic ); free( p_sys->pp_images[i]->psz_filename ); free( p_sys->pp_images[i] ); } TAB_CLEAN( p_sys->i_images, p_sys->pp_images ); } free( p_sys ); }
/***************************************************************************** * CloseDecoder: clean up the decoder *****************************************************************************/ static void CloseDecoder( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t *)p_this; decoder_sys_t *p_sys = p_dec->p_sys; if( p_sys->pp_ssa_styles ) { for( int i = 0; i < p_sys->i_ssa_styles; i++ ) { if( !p_sys->pp_ssa_styles[i] ) continue; free( p_sys->pp_ssa_styles[i]->psz_stylename ); text_style_Delete( p_sys->pp_ssa_styles[i]->p_style ); free( p_sys->pp_ssa_styles[i] ); } TAB_CLEAN( p_sys->i_ssa_styles, p_sys->pp_ssa_styles ); } if( p_sys->pp_images ) { for( int i = 0; i < p_sys->i_images; i++ ) { if( !p_sys->pp_images[i] ) continue; if( p_sys->pp_images[i]->p_pic ) picture_Release( p_sys->pp_images[i]->p_pic ); free( p_sys->pp_images[i]->psz_filename ); free( p_sys->pp_images[i] ); } TAB_CLEAN( p_sys->i_images, p_sys->pp_images ); } free( p_sys ); }
/***************************************************************************** * Close files and free resources *****************************************************************************/ static void Close( vlc_object_t * p_this ) { access_t *p_access = (access_t*)p_this; access_sys_t *p_sys = p_access->p_sys; if( p_sys->fd != -1 ) vlc_close( p_sys->fd ); ARRAY_RESET( p_sys->file_sizes ); if( p_sys->p_meta ) vlc_meta_Delete( p_sys->p_meta ); size_t count = p_sys->p_marks->i_seekpoint; TAB_CLEAN( count, p_sys->offsets ); vlc_input_title_Delete( p_sys->p_marks ); }
/***************************************************************************** * Close: cleanup *****************************************************************************/ void Close_LuaSD( vlc_object_t *p_this ) { services_discovery_t *p_sd = ( services_discovery_t * )p_this; services_discovery_sys_t *p_sys = p_sd->p_sys; vlc_cancel( p_sys->thread ); vlc_join( p_sys->thread, NULL ); for( int i = 0; i < p_sys->i_query; i++ ) free( p_sys->ppsz_query[i] ); TAB_CLEAN( p_sys->i_query, p_sys->ppsz_query ); vlc_cond_destroy( &p_sys->cond ); vlc_mutex_destroy( &p_sys->lock ); free( p_sys->psz_filename ); lua_close( p_sys->L ); free( p_sys ); }
/***************************************************************************** * Close: *****************************************************************************/ static void Close( vlc_object_t * p_this ) { sout_stream_t *p_stream = (sout_stream_t*)p_this; sout_stream_sys_t *p_sys = p_stream->p_sys; int i; for( i = 0; i < p_sys->i_id; i++ ) { sout_stream_id_sys_t *id = p_sys->id[i]; sout_StreamIdDel( p_stream->p_next, id->id ); es_format_Clean( &id->fmt ); free( id ); } TAB_CLEAN( p_sys->i_id, p_sys->id ); free( p_sys ); }
void access_fsdir_finish(struct access_fsdir *p_fsdir, bool b_success) { if (b_success) { fsdir_attach_slaves(p_fsdir); fsdir_sort(p_fsdir); } free(p_fsdir->psz_ignored_exts); free(p_fsdir->psz_sort); /* Remove unmatched slaves */ for (unsigned int i = 0; i < p_fsdir->i_slaves; i++) { struct fsdir_slave *p_fsdir_slave = p_fsdir->pp_slaves[i]; if (p_fsdir_slave != NULL) { input_item_slave_Delete(p_fsdir_slave->p_slave); free(p_fsdir_slave->psz_filename); free(p_fsdir_slave); } } TAB_CLEAN(p_fsdir->i_slaves, p_fsdir->pp_slaves); }
void input_item_MergeInfos( input_item_t *p_item, info_category_t *p_cat ) { vlc_mutex_lock( &p_item->lock ); info_category_t *p_old = InputItemFindCat( p_item, NULL, p_cat->psz_name ); if( p_old ) { for( int i = 0; i < p_cat->i_infos; i++ ) info_category_ReplaceInfo( p_old, p_cat->pp_infos[i] ); TAB_CLEAN( p_cat->i_infos, p_cat->pp_infos ); info_category_Delete( p_cat ); } else { INSERT_ELEM( p_item->pp_categories, p_item->i_categories, p_item->i_categories, p_cat ); } vlc_mutex_unlock( &p_item->lock ); vlc_event_t event; event.type = vlc_InputItemInfoChanged; vlc_event_send( &p_item->event_manager, &event ); }
/***************************************************************************** * Import cut marks and convert them to seekpoints (chapters). *****************************************************************************/ static void ImportMarks( access_t *p_access ) { access_sys_t *p_sys = p_access->p_sys; FILE *marksfile = OpenRelativeFile( p_access, "marks" ); if( !marksfile ) return; FILE *indexfile = OpenRelativeFile( p_access, "index" ); if( !indexfile ) { fclose( marksfile ); return; } /* get the length of this recording (index stores 8 bytes per frame) */ struct stat st; if( fstat( fileno( indexfile ), &st ) ) { fclose( marksfile ); fclose( indexfile ); return; } int64_t i_frame_count = st.st_size / 8; /* Put all cut marks in a "dummy" title */ input_title_t *p_marks = vlc_input_title_New(); if( !p_marks ) { fclose( marksfile ); fclose( indexfile ); return; } p_marks->psz_name = strdup( _("VDR Cut Marks") ); p_marks->i_length = i_frame_count * (int64_t)( CLOCK_FREQ / p_sys->fps ); uint64_t *offsetv = NULL; size_t offsetc = 0; /* offset for chapter positions */ int i_chapter_offset = p_sys->fps / 1000 * var_InheritInteger( p_access, "vdr-chapter-offset" ); /* minimum chapter size in frames */ int i_min_chapter_size = p_sys->fps * MIN_CHAPTER_SIZE; /* the last chapter started at this frame (init to 0 so * we skip useless chapters near the beginning as well) */ int64_t i_prev_chapter = 0; /* parse lines of the form "0:00:00.00 foobar" */ char *line = NULL; size_t line_len; while( ReadLine( &line, &line_len, marksfile ) ) { int64_t i_frame = ParseFrameNumber( line, p_sys->fps ); /* skip chapters which are near the end or too close to each other */ if( i_frame - i_prev_chapter < i_min_chapter_size || i_frame >= i_frame_count - i_min_chapter_size ) continue; i_prev_chapter = i_frame; /* move chapters (simple workaround for inaccurate cut marks) */ if( i_frame > -i_chapter_offset ) i_frame += i_chapter_offset; else i_frame = 0; uint64_t i_offset; uint16_t i_file_number; if( !ReadIndexRecord( indexfile, p_sys->b_ts_format, i_frame, &i_offset, &i_file_number ) ) continue; if( i_file_number < 1 || i_file_number > FILE_COUNT ) continue; /* add file sizes to get the "global" offset */ seekpoint_t *sp = vlc_seekpoint_New(); if( !sp ) continue; sp->i_time_offset = i_frame * (int64_t)( CLOCK_FREQ / p_sys->fps ); sp->psz_name = strdup( line ); TAB_APPEND( p_marks->i_seekpoint, p_marks->seekpoint, sp ); TAB_APPEND( offsetc, offsetv, i_offset ); for( int i = 0; i + 1 < i_file_number; ++i ) offsetv[offsetc - 1] += FILE_SIZE( i ); } /* add a chapter at the beginning if missing */ if( p_marks->i_seekpoint > 0 && offsetv[0] > 0 ) { seekpoint_t *sp = vlc_seekpoint_New(); if( sp ) { sp->i_time_offset = 0; sp->psz_name = strdup( _("Start") ); TAB_INSERT( p_marks->i_seekpoint, p_marks->seekpoint, sp, 0 ); TAB_INSERT( offsetc, offsetv, UINT64_C(0), 0 ); } } if( p_marks->i_seekpoint > 0 ) { p_sys->p_marks = p_marks; p_sys->offsets = offsetv; } else { vlc_input_title_Delete( p_marks ); TAB_CLEAN( offsetc, offsetv ); } fclose( marksfile ); fclose( indexfile ); }
/***************************************************************************** * Open: initialize and create stuff *****************************************************************************/ int Open_LuaSD( vlc_object_t *p_this ) { services_discovery_t *p_sd = ( services_discovery_t * )p_this; services_discovery_sys_t *p_sys; lua_State *L = NULL; char *psz_name; if( !( p_sys = malloc( sizeof( services_discovery_sys_t ) ) ) ) return VLC_ENOMEM; if( !strcmp( p_sd->psz_name, "lua" ) || !strcmp( p_sd->psz_name, "luasd" ) ) { // We want to load the module name "lua" // This module can be used to load lua script not registered // as builtin lua SD modules. config_ChainParse( p_sd, "lua-", ppsz_sd_options, p_sd->p_cfg ); psz_name = var_GetString( p_sd, "lua-sd" ); } else { // We are loading a builtin lua sd module. psz_name = strdup(p_sd->psz_name); } p_sd->p_sys = p_sys; p_sd->pf_control = Control; p_sys->psz_filename = vlclua_find_file( "sd", psz_name ); if( !p_sys->psz_filename ) { msg_Err( p_sd, "Couldn't find lua services discovery script \"%s\".", psz_name ); free( psz_name ); goto error; } free( psz_name ); L = luaL_newstate(); if( !L ) { msg_Err( p_sd, "Could not create new Lua State" ); goto error; } vlclua_set_this( L, p_sd ); luaL_openlibs( L ); luaL_register_namespace( L, "vlc", p_reg ); luaopen_input( L ); luaopen_msg( L ); luaopen_object( L ); luaopen_sd_sd( L ); luaopen_strings( L ); luaopen_variables( L ); luaopen_stream( L ); luaopen_gettext( L ); luaopen_xml( L ); lua_pop( L, 1 ); if( vlclua_add_modules_path( L, p_sys->psz_filename ) ) { msg_Warn( p_sd, "Error while setting the module search path for %s", p_sys->psz_filename ); goto error; } if( vlclua_dofile( VLC_OBJECT(p_sd), L, p_sys->psz_filename ) ) { msg_Err( p_sd, "Error loading script %s: %s", p_sys->psz_filename, lua_tostring( L, lua_gettop( L ) ) ); lua_pop( L, 1 ); goto error; } // No strdup(), just don't remove the string from the lua stack p_sd->description = vlclua_sd_description( VLC_OBJECT(p_sd), L, p_sys->psz_filename ); if( p_sd->description == NULL ) p_sd->description = p_sd->psz_name; p_sys->L = L; vlc_mutex_init( &p_sys->lock ); vlc_cond_init( &p_sys->cond ); TAB_INIT( p_sys->i_query, p_sys->ppsz_query ); if( vlc_clone( &p_sys->thread, Run, p_sd, VLC_THREAD_PRIORITY_LOW ) ) { TAB_CLEAN( p_sys->i_query, p_sys->ppsz_query ); vlc_cond_destroy( &p_sys->cond ); vlc_mutex_destroy( &p_sys->lock ); goto error; } return VLC_SUCCESS; error: if( L ) lua_close( L ); free( p_sys->psz_filename ); free( p_sys ); return VLC_EGENERIC; }