📄 vlm.c
字号:
p_instance->p_sout = input_DetachSout( p_input ); vlc_thread_join( p_input ); vlc_object_release( p_input ); } if( p_instance->p_sout ) sout_DeleteInstance( p_instance->p_sout ); vlc_gc_decref( p_instance->p_item ); free( p_instance->psz_name ); free( p_instance );}static int vlm_ControlMediaInstanceStart( vlm_t *p_vlm, int64_t id, const char *psz_id, int i_input_index, const char *psz_vod_output ){ vlm_media_sys_t *p_media = vlm_ControlMediaGetById( p_vlm, id ); vlm_media_instance_sys_t *p_instance; char *psz_log; if( !p_media || !p_media->cfg.b_enabled || p_media->cfg.i_input <= 0 ) return VLC_EGENERIC; /* TODO support multiple input for VOD with sout-keep ? */ if( ( p_media->cfg.b_vod && !psz_vod_output ) || ( !p_media->cfg.b_vod && psz_vod_output ) ) return VLC_EGENERIC; if( i_input_index < 0 || i_input_index >= p_media->cfg.i_input ) return VLC_EGENERIC; p_instance = vlm_ControlMediaInstanceGetByName( p_media, psz_id ); if( !p_instance ) { vlm_media_t *p_cfg = &p_media->cfg; int i; p_instance = vlm_MediaInstanceNew( p_vlm, psz_id ); if( !p_instance ) return VLC_ENOMEM; if( p_cfg->psz_output != NULL || psz_vod_output != NULL ) { char *psz_buffer; if( asprintf( &psz_buffer, "sout=%s%s%s", p_cfg->psz_output ? p_cfg->psz_output : "", (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 ); free( psz_buffer ); } } for( i = 0; i < p_cfg->i_option; i++ ) { if( !strcmp( p_cfg->ppsz_option[i], "sout-keep" ) ) p_instance->b_sout_keep = true; 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] ); } TAB_APPEND( p_media->i_instance, p_media->instance, p_instance ); } /* Stop old instance */ input_thread_t *p_input = p_instance->p_input; if( p_input ) { if( p_instance->i_index == i_input_index && !p_input->b_eof && !p_input->b_error ) { if( var_GetInteger( p_input, "state" ) == PAUSE_S ) var_SetInteger( p_input, "state", PLAYING_S ); return VLC_SUCCESS; } input_StopThread( p_input ); p_instance->p_sout = input_DetachSout( p_input ); vlc_thread_join( 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; } } /* Start new one */ p_instance->i_index = i_input_index; input_item_SetURI( p_instance->p_item, p_media->cfg.ppsz_input[p_instance->i_index] ) ; 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 ); if( !p_instance->p_input ) { TAB_REMOVE( p_media->i_instance, p_media->instance, p_instance ); vlm_MediaInstanceDelete( p_instance ); } free( psz_log ); } return VLC_SUCCESS;}static int vlm_ControlMediaInstanceStop( vlm_t *p_vlm, int64_t id, const char *psz_id ){ vlm_media_sys_t *p_media = vlm_ControlMediaGetById( p_vlm, id ); vlm_media_instance_sys_t *p_instance; if( !p_media ) return VLC_EGENERIC; p_instance = vlm_ControlMediaInstanceGetByName( p_media, psz_id ); if( !p_instance ) return VLC_EGENERIC; TAB_REMOVE( p_media->i_instance, p_media->instance, p_instance ); vlm_MediaInstanceDelete( p_instance ); return VLC_SUCCESS;}static int vlm_ControlMediaInstancePause( vlm_t *p_vlm, int64_t id, const char *psz_id ){ vlm_media_sys_t *p_media = vlm_ControlMediaGetById( p_vlm, id ); vlm_media_instance_sys_t *p_instance; int i_state; if( !p_media ) return VLC_EGENERIC; p_instance = vlm_ControlMediaInstanceGetByName( p_media, psz_id ); if( !p_instance || !p_instance->p_input ) return VLC_EGENERIC; /* Toggle pause state */ i_state = var_GetInteger( p_instance->p_input, "state" ); if( i_state == PAUSE_S ) var_SetInteger( p_instance->p_input, "state", PLAYING_S ); else if( i_state == PLAYING_S ) var_SetInteger( p_instance->p_input, "state", PAUSE_S ); return VLC_SUCCESS;}static int vlm_ControlMediaInstanceGetTimePosition( vlm_t *p_vlm, int64_t id, const char *psz_id, int64_t *pi_time, double *pd_position ){ vlm_media_sys_t *p_media = vlm_ControlMediaGetById( p_vlm, id ); vlm_media_instance_sys_t *p_instance; if( !p_media ) return VLC_EGENERIC; p_instance = vlm_ControlMediaInstanceGetByName( p_media, psz_id ); if( !p_instance || !p_instance->p_input ) return VLC_EGENERIC; if( pi_time ) *pi_time = var_GetTime( p_instance->p_input, "time" ); if( pd_position ) *pd_position = var_GetFloat( p_instance->p_input, "position" ); return VLC_SUCCESS;}static int vlm_ControlMediaInstanceSetTimePosition( vlm_t *p_vlm, int64_t id, const char *psz_id, int64_t i_time, double d_position ){ vlm_media_sys_t *p_media = vlm_ControlMediaGetById( p_vlm, id ); vlm_media_instance_sys_t *p_instance; if( !p_media ) return VLC_EGENERIC; p_instance = vlm_ControlMediaInstanceGetByName( p_media, psz_id ); if( !p_instance || !p_instance->p_input ) return VLC_EGENERIC; if( i_time >= 0 ) return var_SetTime( p_instance->p_input, "time", i_time ); else if( d_position >= 0 && d_position <= 100 ) return var_SetFloat( p_instance->p_input, "position", d_position ); return VLC_EGENERIC;}static int vlm_ControlMediaInstanceGets( vlm_t *p_vlm, int64_t id, vlm_media_instance_t ***ppp_idsc, int *pi_instance ){ vlm_media_sys_t *p_media = vlm_ControlMediaGetById( p_vlm, id ); vlm_media_instance_t **pp_idsc; int i_idsc; int i; if( !p_media ) return VLC_EGENERIC; TAB_INIT( i_idsc, pp_idsc ); for( i = 0; i < p_media->i_instance; i++ ) { vlm_media_instance_sys_t *p_instance = p_media->instance[i]; vlm_media_instance_t *p_idsc = vlm_media_instance_New(); if( p_instance->psz_name ) p_idsc->psz_name = strdup( p_instance->psz_name ); if( p_instance->p_input ) { p_idsc->i_time = var_GetTime( p_instance->p_input, "time" ); p_idsc->i_length = var_GetTime( p_instance->p_input, "length" ); p_idsc->d_position = var_GetFloat( p_instance->p_input, "position" ); if( var_GetInteger( p_instance->p_input, "state" ) == PAUSE_S ) p_idsc->b_paused = true; p_idsc->i_rate = var_GetInteger( p_instance->p_input, "rate" ); } TAB_APPEND( i_idsc, pp_idsc, p_idsc ); } *ppp_idsc = pp_idsc; *pi_instance = i_idsc; return VLC_SUCCESS;}static int vlm_ControlMediaInstanceClear( vlm_t *p_vlm, int64_t id ){ vlm_media_sys_t *p_media = vlm_ControlMediaGetById( p_vlm, id ); if( !p_media ) return VLC_EGENERIC; while( p_media->i_instance > 0 ) vlm_ControlMediaInstanceStop( p_vlm, id, p_media->instance[0]->psz_name ); return VLC_SUCCESS;}static int vlm_ControlScheduleClear( vlm_t *p_vlm ){ while( p_vlm->i_schedule > 0 ) vlm_ScheduleDelete( p_vlm, p_vlm->schedule[0] ); return VLC_SUCCESS;}static int vlm_vaControlInternal( vlm_t *p_vlm, int i_query, va_list args ){ vlm_media_t *p_dsc; vlm_media_t **pp_dsc; vlm_media_t ***ppp_dsc; vlm_media_instance_t ***ppp_idsc; const char *psz_id; const char *psz_vod; int64_t *p_id; int64_t id; int i_int; int *pi_int; int64_t *pi_i64; int64_t i_i64; double *pd_double; double d_double; switch( i_query ) { /* Media control */ case VLM_GET_MEDIAS: ppp_dsc = (vlm_media_t ***)va_arg( args, vlm_media_t *** ); pi_int = (int *)va_arg( args, int * ); return vlm_ControlMediaGets( p_vlm, ppp_dsc, pi_int ); case VLM_CLEAR_MEDIAS: return vlm_ControlMediaClear( p_vlm ); case VLM_CHANGE_MEDIA: p_dsc = (vlm_media_t*)va_arg( args, vlm_media_t * ); return vlm_ControlMediaChange( p_vlm, p_dsc ); case VLM_ADD_MEDIA: p_dsc = (vlm_media_t*)va_arg( args, vlm_media_t * ); p_id = (int64_t*)va_arg( args, int64_t * ); return vlm_ControlMediaAdd( p_vlm, p_dsc, p_id ); case VLM_DEL_MEDIA: id = (int64_t)va_arg( args, int64_t ); return vlm_ControlMediaDel( p_vlm, id ); case VLM_GET_MEDIA: id = (int64_t)va_arg( args, int64_t ); pp_dsc = (vlm_media_t **)va_arg( args, vlm_media_t ** ); return vlm_ControlMediaGet( p_vlm, id, pp_dsc ); case VLM_GET_MEDIA_ID: psz_id = (const char*)va_arg( args, const char * ); p_id = (int64_t*)va_arg( args, int64_t * ); return vlm_ControlMediaGetId( p_vlm, psz_id, p_id ); /* Media instance control */ case VLM_GET_MEDIA_INSTANCES: id = (int64_t)va_arg( args, int64_t ); ppp_idsc = (vlm_media_instance_t ***)va_arg( args, vlm_media_instance_t *** ); pi_int = (int *)va_arg( args, int *); return vlm_ControlMediaInstanceGets( p_vlm, id, ppp_idsc, pi_int ); case VLM_CLEAR_MEDIA_INSTANCES: id = (int64_t)va_arg( args, int64_t ); return vlm_ControlMediaInstanceClear( p_vlm, id ); case VLM_START_MEDIA_BROADCAST_INSTANCE: id = (int64_t)va_arg( args, int64_t ); psz_id = (const char*)va_arg( args, const char* ); i_int = (int)va_arg( args, int ); return vlm_ControlMediaInstanceStart( p_vlm, id, psz_id, i_int, NULL ); case VLM_START_MEDIA_VOD_INSTANCE: id = (int64_t)va_arg( args, int64_t ); psz_id = (const char*)va_arg( args, const char* ); i_int = (int)va_arg( args, int ); psz_vod = (const char*)va_arg( args, const char* ); if( !psz_vod ) return VLC_EGENERIC; return vlm_ControlMediaInstanceStart( p_vlm, id, psz_id, i_int, psz_vod ); case VLM_STOP_MEDIA_INSTANCE: id = (int64_t)va_arg( args, int64_t ); psz_id = (const char*)va_arg( args, const char* ); return vlm_ControlMediaInstanceStop( p_vlm, id, psz_id ); case VLM_PAUSE_MEDIA_INSTANCE: id = (int64_t)va_arg( args, int64_t ); psz_id = (const char*)va_arg( args, const char* ); return vlm_ControlMediaInstancePause( p_vlm, id, psz_id ); case VLM_GET_MEDIA_INSTANCE_TIME: id = (int64_t)va_arg( args, int64_t ); psz_id = (const char*)va_arg( args, const char* ); pi_i64 = (int64_t*)va_arg( args, int64_t * ); return vlm_ControlMediaInstanceGetTimePosition( p_vlm, id, psz_id, pi_i64, NULL ); case VLM_GET_MEDIA_INSTANCE_POSITION: id = (int64_t)va_arg( args, int64_t ); psz_id = (const char*)va_arg( args, const char* ); pd_double = (double*)va_arg( args, double* ); return vlm_ControlMediaInstanceGetTimePosition( p_vlm, id, psz_id, NULL, pd_double ); case VLM_SET_MEDIA_INSTANCE_TIME: id = (int64_t)va_arg( args, int64_t ); psz_id = (const char*)va_arg( args, const char* ); i_i64 = (int64_t)va_arg( args, int64_t); return vlm_ControlMediaInstanceSetTimePosition( p_vlm, id, psz_id, i_i64, -1 ); case VLM_SET_MEDIA_INSTANCE_POSITION: id = (int64_t)va_arg( args, int64_t ); psz_id = (const char*)va_arg( args, const char* ); d_double = (double)va_arg( args, double ); return vlm_ControlMediaInstanceSetTimePosition( p_vlm, id, psz_id, -1, d_double ); case VLM_CLEAR_SCHEDULES: return vlm_ControlScheduleClear( p_vlm ); default: msg_Err( p_vlm, "unknown VLM query" ); return VLC_EGENERIC; }}int vlm_ControlInternal( vlm_t *p_vlm, int i_query, ... ){ va_list args; int i_result; va_start( args, i_query ); i_result = vlm_vaControlInternal( p_vlm, i_query, args ); va_end( args ); return i_result;}int vlm_Control( vlm_t *p_vlm, int i_query, ... ){ va_list args; int i_result; va_start( args, i_query ); vlc_mutex_lock( &p_vlm->lock ); i_result = vlm_vaControlInternal( p_vlm, i_query, args ); vlc_mutex_unlock( &p_vlm->lock ); va_end( args ); return i_result;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -