#if defined (WIN32) && !defined (UNDER_CE)
#include <sys/timeb.h> /* ftime() */
#endif
+#include <limits.h>
#include <vlc_input.h>
#include <vlc_stream.h>
* Local prototypes.
*****************************************************************************/
-static void vlm_Destructor( vlm_t *p_vlm );
static void* Manage( void * );
static int vlm_MediaVodControl( void *, vod_media_t *, const char *, int, va_list );
{
vlm_t *p_vlm = NULL, **pp_vlm = &(libvlc_priv (p_this->p_libvlc)->p_vlm);
char *psz_vlmconf;
- static const char vlm_object_name[] = "vlm daemon";
/* Avoid multiple creation */
vlc_mutex_lock( &vlm_mutex );
p_vlm = *pp_vlm;
if( p_vlm )
{ /* VLM already exists */
- vlc_object_hold( p_vlm );
+ if( likely( p_vlm->users < UINT_MAX ) )
+ p_vlm->users++;
+ else
+ p_vlm = NULL;
vlc_mutex_unlock( &vlm_mutex );
return p_vlm;
}
msg_Dbg( p_this, "creating VLM" );
- p_vlm = vlc_custom_create( p_this, sizeof( *p_vlm ), VLC_OBJECT_GENERIC,
- vlm_object_name );
+ p_vlm = vlc_custom_create( p_this->p_libvlc, sizeof( *p_vlm ),
+ "vlm daemon" );
if( !p_vlm )
{
vlc_mutex_unlock( &vlm_mutex );
vlc_mutex_init( &p_vlm->lock );
vlc_mutex_init( &p_vlm->lock_manage );
vlc_cond_init_daytime( &p_vlm->wait_manage );
+ p_vlm->users = 1;
p_vlm->input_state_changed = false;
p_vlm->i_id = 1;
TAB_INIT( p_vlm->i_media, p_vlm->media );
TAB_INIT( p_vlm->i_schedule, p_vlm->schedule );
p_vlm->p_vod = NULL;
var_Create( p_vlm, "intf-event", VLC_VAR_ADDRESS );
- vlc_object_attach( p_vlm, p_this->p_libvlc );
if( vlc_clone( &p_vlm->thread, Manage, p_vlm, VLC_THREAD_PRIORITY_LOW ) )
{
}
free( psz_vlmconf );
- vlc_object_set_destructor( p_vlm, (vlc_destructor_t)vlm_Destructor );
vlc_mutex_unlock( &vlm_mutex );
return p_vlm;
void vlm_Delete( vlm_t *p_vlm )
{
/* vlm_Delete() is serialized against itself, and against vlm_New().
- * This way, vlm_Destructor () (called from vlc_objet_release() above)
- * is serialized against setting libvlc_priv->p_vlm from vlm_New(). */
+ * This mutex protects libvlc_priv->p_vlm and p_vlm->users. */
vlc_mutex_lock( &vlm_mutex );
- vlc_object_release( p_vlm );
+ assert( p_vlm->users > 0 );
+ if( --p_vlm->users == 0 )
+ {
+ assert( libvlc_priv(p_vlm->p_libvlc)->p_vlm = p_vlm );
+ libvlc_priv(p_vlm->p_libvlc)->p_vlm = NULL;
+ }
+ else
+ p_vlm = NULL;
vlc_mutex_unlock( &vlm_mutex );
-}
-/*****************************************************************************
- * vlm_Destructor:
- *****************************************************************************/
-static void vlm_Destructor( vlm_t *p_vlm )
-{
+ if( p_vlm == NULL )
+ return;
+
+ /* Destroy and release VLM */
vlc_mutex_lock( &p_vlm->lock );
vlm_ControlInternal( p_vlm, VLM_CLEAR_MEDIAS );
TAB_CLEAN( p_vlm->i_media, p_vlm->media );
TAB_CLEAN( p_vlm->i_schedule, p_vlm->schedule );
vlc_mutex_unlock( &p_vlm->lock );
- libvlc_priv(p_vlm->p_libvlc)->p_vlm = NULL;
vlc_object_kill( p_vlm );
if( p_vlm->p_vod )
vlc_cond_destroy( &p_vlm->wait_manage );
vlc_mutex_destroy( &p_vlm->lock );
vlc_mutex_destroy( &p_vlm->lock_manage );
+ vlc_object_release( p_vlm );
}
/*****************************************************************************
vlc_gc_decref( p_media->vod.p_item );
char *psz_uri = make_URI( p_cfg->ppsz_input[0], NULL );
- p_media->vod.p_item = input_item_New( p_vlm, psz_uri,
- p_cfg->psz_name );
+ p_media->vod.p_item = input_item_New( psz_uri, p_cfg->psz_name );
free( psz_uri );
if( p_cfg->psz_output )
&preparse );
input_Stop( p_input, true );
- vlc_thread_join( p_input );
- vlc_object_release( p_input );
+ input_Close( p_input );
vlc_sem_destroy( &sem_preparse );
}
free( psz_header );
psz_mux = p_cfg->vod.psz_mux;
es_format_t es, *p_es = &es;
- union { char text[5]; uint32_t value; } fourcc;
+ union {
+ char text[5];
+ unsigned char utext[5];
+ uint32_t value;
+ } fourcc;
sprintf( fourcc.text, "%4.4s", psz_mux );
- fourcc.text[0] = tolower(fourcc.text[0]);
- fourcc.text[1] = tolower(fourcc.text[1]);
- fourcc.text[2] = tolower(fourcc.text[2]);
- fourcc.text[3] = tolower(fourcc.text[3]);
+ for( int i = 0; i < 4; i++ )
+ fourcc.utext[i] = tolower(fourcc.utext[i]);
item.i_es = 1;
item.es = &p_es;
if( p_cfg->b_vod && !p_vlm->p_vod )
{
p_vlm->p_vod = vlc_custom_create( VLC_OBJECT(p_vlm), sizeof( vod_t ),
- VLC_OBJECT_GENERIC, "vod server" );
- vlc_object_attach( p_vlm->p_vod, p_vlm->p_libvlc );
+ "vod server" );
p_vlm->p_vod->p_module = module_need( p_vlm->p_vod, "vod server", "$vod-server", false );
if( !p_vlm->p_vod->p_module )
{
p_media->cfg.id = p_vlm->i_id++;
/* FIXME do we do something here if enabled is true ? */
- p_media->vod.p_item = input_item_New( p_vlm, NULL, NULL );
+ p_media->vod.p_item = input_item_New( NULL, NULL );
p_media->vod.p_media = NULL;
TAB_INIT( p_media->i_instance, p_media->instance );
if( psz_name )
p_instance->psz_name = strdup( psz_name );
- p_instance->p_item = input_item_New( p_vlm, NULL, NULL );
+ p_instance->p_item = input_item_New( NULL, NULL );
p_instance->i_index = 0;
p_instance->b_sout_keep = false;
p_instance->p_parent = vlc_object_create( p_vlm, sizeof (vlc_object_t) );
- vlc_object_attach( p_instance->p_parent, p_vlm->p_libvlc );
p_instance->p_input = NULL;
p_instance->p_input_resource = NULL;
if( p_input )
{
input_Stop( p_input, true );
- vlc_thread_join( p_input );
-
+ input_Join( p_input );
var_DelCallback( p_instance->p_input, "intf-event", InputEvent, p_media );
- vlc_object_release( p_input );
+ input_Release( p_input );
vlm_SendEventMediaInstanceStopped( p_vlm, id, p_media->cfg.psz_name );
}
input_Stop( p_input, true );
- vlc_thread_join( p_input );
-
+ input_Join( p_input );
var_DelCallback( p_instance->p_input, "intf-event", InputEvent, p_media );
- vlc_object_release( p_input );
+ input_Release( p_input );
if( !p_instance->b_sout_keep )
input_resource_TerminateSout( p_instance->p_input_resource );