X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Fvlm.c;h=cb3cdc73b7491a8eb64bda16deef84ce38008e0b;hb=484758875dde16e1ada2d1ea4edf1d8d73cabc75;hp=f7f80edfdcee7053ee7179978df2d5d6bc69b4b0;hpb=acbad93b8b447ac9f776a53bf3e8f74f15132fe4;p=vlc diff --git a/src/input/vlm.c b/src/input/vlm.c index f7f80edfdc..cb3cdc73b7 100644 --- a/src/input/vlm.c +++ b/src/input/vlm.c @@ -42,15 +42,19 @@ # include /* gettimeofday() */ #endif +#ifdef UNDER_CE +#include /* gettimeofday() */ +#endif + #ifdef HAVE_TIME_H # include /* ctime() */ # include /* ftime() */ #endif #include -#include "input_internal.h" #include #include "vlm_internal.h" +#include "vlm_event.h" #include #include #include @@ -106,6 +110,7 @@ vlm_t *__vlm_New ( vlc_object_t *p_this ) TAB_INIT( p_vlm->i_schedule, p_vlm->schedule ); p_vlm->i_vod = 0; 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 ) ) @@ -195,7 +200,7 @@ int vlm_ExecuteCommand( vlm_t *p_vlm, const char *psz_command, int64_t vlm_Date(void) { -#ifdef WIN32 +#if defined (WIN32) && !defined (UNDER_CE) struct timeb tm; ftime( &tm ); return ((int64_t)tm.time) * 1000000 + ((int64_t)tm.millitm) * 1000; @@ -514,14 +519,14 @@ static int vlm_OnMediaUpdate( vlm_t *p_vlm, vlm_media_sys_t *p_media ) if( psz_output && asprintf( &psz_dup, "sout=%s", psz_output ) != -1 ) { - input_item_AddOption( p_media->vod.p_item, psz_dup ); + input_item_AddOption( p_media->vod.p_item, psz_dup, VLC_INPUT_OPTION_TRUSTED ); free( psz_dup ); } free( psz_output ); for( i = 0; i < p_cfg->i_option; i++ ) input_item_AddOption( p_media->vod.p_item, - p_cfg->ppsz_option[i] ); + p_cfg->ppsz_option[i], VLC_INPUT_OPTION_TRUSTED ); if( asprintf( &psz_header, _("Media: %s"), p_cfg->psz_name ) == -1 ) psz_header = NULL; @@ -531,7 +536,7 @@ static int vlm_OnMediaUpdate( vlm_t *p_vlm, vlm_media_sys_t *p_media ) while( !p_input->b_eof && !p_input->b_error ) msleep( 100000 ); - input_StopThread( p_input ); + input_StopThread( p_input, false ); vlc_thread_join( p_input ); vlc_object_release( p_input ); } @@ -570,6 +575,7 @@ static int vlm_OnMediaUpdate( vlm_t *p_vlm, vlm_media_sys_t *p_media ) /* TODO add support of var vlm_media_broadcast/vlm_media_vod */ + vlm_SendEventMediaChanged( p_vlm, p_cfg->id, p_cfg->psz_name ); return VLC_SUCCESS; } static int vlm_ControlMediaChange( vlm_t *p_vlm, vlm_media_t *p_cfg ) @@ -607,14 +613,14 @@ static int vlm_ControlMediaAdd( vlm_t *p_vlm, vlm_media_t *p_cfg, int64_t *p_id { 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_vlm->p_vod->p_module = module_need( p_vlm->p_vod, "vod server", 0, 0 ); + vlc_object_attach( p_vlm->p_vod, p_vlm->p_libvlc ); + p_vlm->p_vod->p_module = module_need( p_vlm->p_vod, "vod server", NULL, false ); if( !p_vlm->p_vod->p_module ) { msg_Err( p_vlm, "cannot find vod server" ); vlc_object_detach( p_vlm->p_vod ); vlc_object_release( p_vlm->p_vod ); - p_vlm->p_vod = 0; + p_vlm->p_vod = NULL; return VLC_EGENERIC; } @@ -622,10 +628,9 @@ static int vlm_ControlMediaAdd( vlm_t *p_vlm, vlm_media_t *p_cfg, int64_t *p_id p_vlm->p_vod->pf_media_control = vlm_MediaVodControl; } - p_media = malloc( sizeof( vlm_media_sys_t ) ); + p_media = calloc( 1, sizeof( vlm_media_sys_t ) ); if( !p_media ) return VLC_ENOMEM; - memset( p_media, 0, sizeof(vlm_media_sys_t) ); if( p_cfg->b_vod ) p_vlm->i_vod++; @@ -645,6 +650,8 @@ static int vlm_ControlMediaAdd( vlm_t *p_vlm, vlm_media_t *p_cfg, int64_t *p_id if( p_id ) *p_id = p_media->cfg.id; + /* */ + vlm_SendEventMediaAdded( p_vlm, p_media->cfg.id, p_media->cfg.psz_name ); return vlm_OnMediaUpdate( p_vlm, p_media ); } @@ -665,6 +672,9 @@ static int vlm_ControlMediaDel( vlm_t *p_vlm, int64_t id ) p_vlm->i_vod--; } + /* */ + vlm_SendEventMediaRemoved( p_vlm, id, p_media->cfg.psz_name ); + vlm_media_Clean( &p_media->cfg ); vlc_gc_decref( p_media->vod.p_item ); @@ -681,6 +691,7 @@ static int vlm_ControlMediaDel( vlm_t *p_vlm, int64_t id ) vlc_object_release( p_vlm->p_vod ); p_vlm->p_vod = NULL; } + return VLC_SUCCESS; } @@ -743,12 +754,10 @@ static vlm_media_instance_sys_t *vlm_ControlMediaInstanceGetByName( vlm_media_sy } static vlm_media_instance_sys_t *vlm_MediaInstanceNew( vlm_t *p_vlm, const char *psz_name ) { - vlm_media_instance_sys_t *p_instance = malloc( sizeof(vlm_media_instance_sys_t) ); + vlm_media_instance_sys_t *p_instance = calloc( 1, sizeof(vlm_media_instance_sys_t) ); if( !p_instance ) return NULL; - memset( p_instance, 0, sizeof(vlm_media_instance_sys_t) ); - p_instance->psz_name = NULL; if( psz_name ) p_instance->psz_name = strdup( psz_name ); @@ -758,22 +767,29 @@ static vlm_media_instance_sys_t *vlm_MediaInstanceNew( vlm_t *p_vlm, const char p_instance->i_index = 0; p_instance->b_sout_keep = false; p_instance->p_input = NULL; - p_instance->p_sout = NULL; + p_instance->p_input_resource = NULL; return p_instance; } -static void vlm_MediaInstanceDelete( vlm_media_instance_sys_t *p_instance ) +static void vlm_MediaInstanceDelete( vlm_t *p_vlm, int64_t id, vlm_media_instance_sys_t *p_instance, const char *psz_name ) { input_thread_t *p_input = p_instance->p_input; if( p_input ) { - input_StopThread( p_input ); - p_instance->p_sout = input_DetachSout( p_input ); + input_resource_t *p_resource; + + input_StopThread( p_input, true ); vlc_thread_join( p_input ); + + p_resource = input_DetachResource( p_input ); + input_resource_Delete( p_resource ); + vlc_object_release( p_input ); + + vlm_SendEventMediaInstanceStopped( p_vlm, id, psz_name ); } - if( p_instance->p_sout ) - sout_DeleteInstance( p_instance->p_sout ); + if( p_instance->p_input_resource ) + input_resource_Delete( p_instance->p_input_resource ); vlc_gc_decref( p_instance->p_item ); free( p_instance->psz_name ); @@ -816,7 +832,7 @@ static int vlm_ControlMediaInstanceStart( vlm_t *p_vlm, int64_t id, const char * (p_cfg->psz_output && psz_vod_output) ? ":" : psz_vod_output ? "#" : "", psz_vod_output ? psz_vod_output : "" ) != -1 ) { - input_item_AddOption( p_instance->p_item, psz_buffer ); + input_item_AddOption( p_instance->p_item, psz_buffer, VLC_INPUT_OPTION_TRUSTED ); free( psz_buffer ); } } @@ -828,7 +844,7 @@ static int vlm_ControlMediaInstanceStart( vlm_t *p_vlm, int64_t id, const char * else if( !strcmp( p_cfg->ppsz_option[i], "nosout-keep" ) || !strcmp( p_cfg->ppsz_option[i], "no-sout-keep" ) ) p_instance->b_sout_keep = false; else - input_item_AddOption( p_instance->p_item, p_cfg->ppsz_option[i] ); + input_item_AddOption( p_instance->p_item, p_cfg->ppsz_option[i], VLC_INPUT_OPTION_TRUSTED ); } TAB_APPEND( p_media->i_instance, p_media->instance, p_instance ); } @@ -845,15 +861,18 @@ static int vlm_ControlMediaInstanceStart( vlm_t *p_vlm, int64_t id, const char * return VLC_SUCCESS; } - input_StopThread( p_input ); - p_instance->p_sout = input_DetachSout( p_input ); + input_StopThread( p_input, !p_input->b_eof && !p_input->b_error ); vlc_thread_join( p_input ); + + p_instance->p_input_resource = input_DetachResource( p_input ); + vlc_object_release( p_input ); - if( !p_instance->b_sout_keep && p_instance->p_sout ) - { - sout_DeleteInstance( p_instance->p_sout ); - p_instance->p_sout = NULL; - } + + if( !p_instance->b_sout_keep ) + input_resource_TerminateSout( p_instance->p_input_resource ); + input_resource_TerminateVout( p_instance->p_input_resource ); + + vlm_SendEventMediaInstanceStopped( p_vlm, id, p_media->cfg.psz_name ); } /* Start new one */ @@ -862,11 +881,18 @@ static int vlm_ControlMediaInstanceStart( vlm_t *p_vlm, int64_t id, const char * if( asprintf( &psz_log, _("Media: %s"), p_media->cfg.psz_name ) != -1 ) { - p_instance->p_input = input_CreateThreadExtended( p_vlm, p_instance->p_item, psz_log, p_instance->p_sout ); + p_instance->p_input = input_CreateThreadExtended( p_vlm, p_instance->p_item, + psz_log, p_instance->p_input_resource ); + p_instance->p_input_resource = NULL; + if( !p_instance->p_input ) { TAB_REMOVE( p_media->i_instance, p_media->instance, p_instance ); - vlm_MediaInstanceDelete( p_instance ); + vlm_MediaInstanceDelete( p_vlm, id, p_instance, p_media->cfg.psz_name ); + } + else + { + vlm_SendEventMediaInstanceStarted( p_vlm, id, p_media->cfg.psz_name ); } free( psz_log ); } @@ -888,7 +914,7 @@ static int vlm_ControlMediaInstanceStop( vlm_t *p_vlm, int64_t id, const char *p TAB_REMOVE( p_media->i_instance, p_media->instance, p_instance ); - vlm_MediaInstanceDelete( p_instance ); + vlm_MediaInstanceDelete( p_vlm, id, p_instance, p_media->cfg.psz_name ); return VLC_SUCCESS; } @@ -1154,3 +1180,4 @@ int vlm_Control( vlm_t *p_vlm, int i_query, ... ) return i_result; } +