📄 vlm.c
字号:
} if( i_real_date <= i_time && i_real_date > i_lastcheck ) { for( j = 0; j < vlm->schedule[i]->i_command; j++ ) { TAB_APPEND( i_scheduled_commands, ppsz_scheduled_commands, strdup(vlm->schedule[i]->command[j] ) ); } } } } while( i_scheduled_commands ) { vlm_message_t *message = NULL; char *psz_command = ppsz_scheduled_commands[0]; ExecuteCommand( vlm, psz_command,&message ); /* for now, drop the message */ vlm_MessageDelete( message ); TAB_REMOVE( i_scheduled_commands, ppsz_scheduled_commands, psz_command ); free( psz_command ); } i_lastcheck = i_time; vlc_mutex_unlock( &vlm->lock ); msleep( 100000 ); } return NULL;}/* New API *//*typedef struct{ struct { int i_connection_count; int i_connection_active; } vod; struct { int i_count; bool b_playing; int i_playing_index; } broadcast;} vlm_media_status_t;*//* */static vlm_media_sys_t *vlm_ControlMediaGetById( vlm_t *p_vlm, int64_t id ){ int i; for( i = 0; i < p_vlm->i_media; i++ ) { if( p_vlm->media[i]->cfg.id == id ) return p_vlm->media[i]; } return NULL;}static vlm_media_sys_t *vlm_ControlMediaGetByName( vlm_t *p_vlm, const char *psz_name ){ int i; for( i = 0; i < p_vlm->i_media; i++ ) { if( !strcmp( p_vlm->media[i]->cfg.psz_name, psz_name ) ) return p_vlm->media[i]; } return NULL;}static int vlm_MediaDescriptionCheck( vlm_t *p_vlm, vlm_media_t *p_cfg ){ int i; if( !p_cfg || !p_cfg->psz_name || !strcmp( p_cfg->psz_name, "all" ) || !strcmp( p_cfg->psz_name, "media" ) || !strcmp( p_cfg->psz_name, "schedule" ) ) return VLC_EGENERIC; for( i = 0; i < p_vlm->i_media; i++ ) { if( p_vlm->media[i]->cfg.id == p_cfg->id ) continue; if( !strcmp( p_vlm->media[i]->cfg.psz_name, p_cfg->psz_name ) ) return VLC_EGENERIC; } return VLC_SUCCESS;}/* Called after a media description is changed/added */static int vlm_OnMediaUpdate( vlm_t *p_vlm, vlm_media_sys_t *p_media ){ vlm_media_t *p_cfg = &p_media->cfg; /* Check if we need to create/delete a vod media */ if( p_cfg->b_vod ) { if( !p_cfg->b_enabled && p_media->vod.p_media ) { p_vlm->p_vod->pf_media_del( p_vlm->p_vod, p_media->vod.p_media ); p_media->vod.p_media = NULL; } else if( p_cfg->b_enabled && !p_media->vod.p_media && p_cfg->i_input ) { /* Pre-parse the input */ input_thread_t *p_input; char *psz_output; char *psz_header; char *psz_dup; int i; vlc_gc_decref( p_media->vod.p_item ); p_media->vod.p_item = input_item_New( p_vlm, p_cfg->ppsz_input[0], p_cfg->psz_name ); if( p_cfg->psz_output ) { if( asprintf( &psz_output, "%s:description", p_cfg->psz_output ) == -1 ) psz_output = NULL; } else psz_output = strdup( "#description" ); if( psz_output && asprintf( &psz_dup, "sout=%s", psz_output ) != -1 ) { input_item_AddOption( p_media->vod.p_item, psz_dup ); 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] ); if( asprintf( &psz_header, _("Media: %s"), p_cfg->psz_name ) == -1 ) psz_header = NULL; if( (p_input = input_CreateThreadExtended( p_vlm, p_media->vod.p_item, psz_header, NULL ) ) ) { while( !p_input->b_eof && !p_input->b_error ) msleep( 100000 ); input_StopThread( p_input ); vlc_object_release( p_input ); } free( psz_header ); if( p_cfg->vod.psz_mux ) { input_item_t item; es_format_t es, *p_es = &es; char fourcc[5]; sprintf( fourcc, "%4.4s", p_cfg->vod.psz_mux ); fourcc[0] = tolower(fourcc[0]); fourcc[1] = tolower(fourcc[1]); fourcc[2] = tolower(fourcc[2]); fourcc[3] = tolower(fourcc[3]); /* XXX: Don't do it that way, but properly use a new input item ref. */ item = *p_media->vod.p_item; item.i_es = 1; item.es = &p_es; es_format_Init( &es, VIDEO_ES, *((int *)fourcc) ); p_media->vod.p_media = p_vlm->p_vod->pf_media_new( p_vlm->p_vod, p_cfg->psz_name, &item ); } else { p_media->vod.p_media = p_vlm->p_vod->pf_media_new( p_vlm->p_vod, p_cfg->psz_name, p_media->vod.p_item ); } } } else { /* TODO start media if needed */ } /* TODO add support of var vlm_media_broadcast/vlm_media_vod */ return VLC_SUCCESS;}static int vlm_ControlMediaChange( vlm_t *p_vlm, vlm_media_t *p_cfg ){ vlm_media_sys_t *p_media = vlm_ControlMediaGetById( p_vlm, p_cfg->id ); /* */ if( !p_media || vlm_MediaDescriptionCheck( p_vlm, p_cfg ) ) return VLC_EGENERIC; if( ( p_media->cfg.b_vod && !p_cfg->b_vod ) || ( !p_media->cfg.b_vod && p_cfg->b_vod ) ) return VLC_EGENERIC; if( 0 ) { /* TODO check what are the changes being done (stop instance if needed) */ } vlm_media_Clean( &p_media->cfg ); vlm_media_Copy( &p_media->cfg, p_cfg ); return vlm_OnMediaUpdate( p_vlm, p_media );}static int vlm_ControlMediaAdd( vlm_t *p_vlm, vlm_media_t *p_cfg, int64_t *p_id ){ vlm_media_sys_t *p_media; if( vlm_MediaDescriptionCheck( p_vlm, p_cfg ) || vlm_ControlMediaGetByName( p_vlm, p_cfg->psz_name ) ) { msg_Err( p_vlm, "invalid media description" ); return VLC_EGENERIC; } /* Check if we need to load the VOD server */ if( p_cfg->b_vod && !p_vlm->i_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_vlm->p_vod->p_module = module_Need( p_vlm->p_vod, "vod server", 0, 0 ); 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; return VLC_EGENERIC; } p_vlm->p_vod->p_data = p_vlm; p_vlm->p_vod->pf_media_control = vlm_MediaVodControl; } p_media = malloc( 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++; vlm_media_Copy( &p_media->cfg, p_cfg ); 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_media = NULL; TAB_INIT( p_media->i_instance, p_media->instance ); /* */ TAB_APPEND( p_vlm->i_media, p_vlm->media, p_media ); if( p_id ) *p_id = p_media->cfg.id; return vlm_OnMediaUpdate( p_vlm, p_media );}static int vlm_ControlMediaDel( 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_ControlInternal( p_vlm, VLM_STOP_MEDIA_INSTANCE, id, p_media->instance[0]->psz_name ); if( p_media->cfg.b_vod ) { p_media->cfg.b_enabled = false; vlm_OnMediaUpdate( p_vlm, p_media ); p_vlm->i_vod--; } vlm_media_Clean( &p_media->cfg ); vlc_gc_decref( p_media->vod.p_item ); TAB_REMOVE( p_vlm->i_media, p_vlm->media, p_media ); free( p_media ); /* Check if we need to unload the VOD server */ if( p_vlm->p_vod && p_vlm->i_vod <= 0 ) { module_Unneed( p_vlm->p_vod, p_vlm->p_vod->p_module ); vlc_object_detach( p_vlm->p_vod ); vlc_object_release( p_vlm->p_vod ); p_vlm->p_vod = NULL; } return VLC_SUCCESS;}static int vlm_ControlMediaGets( vlm_t *p_vlm, vlm_media_t ***ppp_dsc, int *pi_dsc ){ vlm_media_t **pp_dsc; int i_dsc; int i; TAB_INIT( i_dsc, pp_dsc ); for( i = 0; i < p_vlm->i_media; i++ ) { vlm_media_t *p_dsc = vlm_media_Duplicate( &p_vlm->media[i]->cfg ); TAB_APPEND( i_dsc, pp_dsc, p_dsc ); } *ppp_dsc = pp_dsc; *pi_dsc = i_dsc; return VLC_SUCCESS;}static int vlm_ControlMediaClear( vlm_t *p_vlm ){ while( p_vlm->i_media > 0 ) vlm_ControlMediaDel( p_vlm, p_vlm->media[0]->cfg.id ); return VLC_SUCCESS;}static int vlm_ControlMediaGet( vlm_t *p_vlm, int64_t id, vlm_media_t **pp_dsc ){ vlm_media_sys_t *p_media = vlm_ControlMediaGetById( p_vlm, id ); if( !p_media ) return VLC_EGENERIC; *pp_dsc = vlm_media_Duplicate( &p_media->cfg ); return VLC_SUCCESS;}static int vlm_ControlMediaGetId( vlm_t *p_vlm, const char *psz_name, int64_t *p_id ){ vlm_media_sys_t *p_media = vlm_ControlMediaGetByName( p_vlm, psz_name ); if( !p_media ) return VLC_EGENERIC; *p_id = p_media->cfg.id; return VLC_SUCCESS;}static vlm_media_instance_sys_t *vlm_ControlMediaInstanceGetByName( vlm_media_sys_t *p_media, const char *psz_id ){ int i; for( i = 0; i < p_media->i_instance; i++ ) { const char *psz = p_media->instance[i]->psz_name; if( ( psz == NULL && psz_id == NULL ) || ( psz && psz_id && !strcmp( psz, psz_id ) ) ) return p_media->instance[i]; } return NULL;}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) ); 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 ); p_instance->p_item = input_item_New( p_vlm, NULL, NULL ); p_instance->i_index = 0; p_instance->b_sout_keep = false; p_instance->p_input = NULL; p_instance->p_sout = NULL; return p_instance;}static void vlm_MediaInstanceDelete( vlm_media_instance_sys_t *p_instance ){ input_thread_t *p_input = p_instance->p_input; if( p_input ) { input_StopThread( p_input );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -