⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vlm.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -