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

📄 vlm.c

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