/* * XXX name and p_cfg are used (-> do NOT free them) */ static sout_stream_t *sout_StreamNew( sout_instance_t *p_sout, char *psz_name, config_chain_t *p_cfg, sout_stream_t *p_next) { sout_stream_t *p_stream; assert(psz_name); p_stream = vlc_custom_create( p_sout, sizeof( *p_stream ), "stream out" ); if( !p_stream ) return NULL; p_stream->p_sout = p_sout; p_stream->p_sys = NULL; p_stream->psz_name = psz_name; p_stream->p_cfg = p_cfg; p_stream->p_next = p_next; msg_Dbg( p_sout, "stream=`%s'", p_stream->psz_name ); p_stream->p_module = module_need( p_stream, "sout stream", p_stream->psz_name, true ); if( !p_stream->p_module ) { /* those must be freed by the caller if creation failed */ p_stream->psz_name = NULL; p_stream->p_cfg = NULL; sout_StreamDelete( p_stream ); return NULL; } return p_stream; }
/***************************************************************************** * 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; sout_StreamDelete( p_sys->p_out ); 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 = (sout_stream_sys_t *)p_stream->p_sys; sout_StreamDelete( p_sys->p_out ); p_stream->p_sout->i_out_pace_nocontrol--; free( p_sys ); }
/* Destroy a "stream_out" modules chain * * p_first is the first module to be destroyed in the chain * p_last is the last module to be destroyed * if NULL, all modules are destroyed * if not NULL, modules following it must be destroyed separately */ void sout_StreamChainDelete(sout_stream_t *p_first, sout_stream_t *p_last) { while(p_first != NULL) { sout_stream_t *p_next = p_first->p_next; sout_StreamDelete(p_first); if(p_first == p_last) break; p_first = p_next; } }
/***************************************************************************** * 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; msg_Dbg( p_stream, "closing a duplication" ); for( i = 0; i < p_sys->i_nb_streams; i++ ) { sout_StreamDelete( p_sys->pp_streams[i] ); free( p_sys->ppsz_select[i] ); } free( p_sys->pp_streams ); free( p_sys->ppsz_select ); free( p_sys ); }
/* Creates a complete "stream_out" modules chain * * chain format: module1{option=*:option=*}[:module2{option=*:...}] * * The modules are created starting from the last one and linked together * A pointer to the last module created is stored if pp_last isn't NULL, to * make sure sout_StreamChainDelete doesn't delete modules created in another * place. * * Returns a pointer to the first module. */ sout_stream_t *sout_StreamChainNew(sout_instance_t *p_sout, const char *psz_chain, sout_stream_t *p_next, sout_stream_t **pp_last) { if(!psz_chain || !*psz_chain) { if(pp_last) *pp_last = NULL; return p_next; } char *psz_parser = strdup(psz_chain); if(!psz_parser) return NULL; vlc_array_t cfg, name; vlc_array_init(&cfg); vlc_array_init(&name); /* parse chain */ while(psz_parser) { config_chain_t *p_cfg; char *psz_name; char *psz_rest_chain = config_ChainCreate( &psz_name, &p_cfg, psz_parser ); free( psz_parser ); psz_parser = psz_rest_chain; vlc_array_append(&cfg, p_cfg); vlc_array_append(&name, psz_name); } int i = vlc_array_count(&name); vlc_array_t module; vlc_array_init(&module); while(i--) { p_next = sout_StreamNew( p_sout, vlc_array_item_at_index(&name, i), vlc_array_item_at_index(&cfg, i), p_next); if(!p_next) goto error; if(i == vlc_array_count(&name) - 1 && pp_last) *pp_last = p_next; /* last module created in the chain */ vlc_array_append(&module, p_next); } vlc_array_clear(&name); vlc_array_clear(&cfg); vlc_array_clear(&module); return p_next; error: i++; /* last module couldn't be created */ /* destroy all modules created, starting with the last one */ int modules = vlc_array_count(&module); while(modules--) sout_StreamDelete(vlc_array_item_at_index(&module, modules)); vlc_array_clear(&module); /* then destroy all names and config which weren't destroyed by * sout_StreamDelete */ while(i--) { free(vlc_array_item_at_index(&name, i)); config_ChainDestroy(vlc_array_item_at_index(&cfg, i)); } vlc_array_clear(&name); vlc_array_clear(&cfg); return NULL; }