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

📄 es_out.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
        return; /* Nothing to do */    if( p_sys->p_pgrm )    {        es_out_pgrm_t *old = p_sys->p_pgrm;        msg_Dbg( p_input, "unselecting program id=%d", old->i_id );        for( i = 0; i < p_sys->i_es; i++ )        {            if( p_sys->es[i]->p_pgrm == old && p_sys->es[i]->p_dec &&                p_sys->i_mode != ES_OUT_MODE_ALL )                EsUnselect( out, p_sys->es[i], VLC_TRUE );        }        p_sys->p_es_audio = NULL;        p_sys->p_es_sub = NULL;        p_sys->p_es_video = NULL;    }    msg_Dbg( p_input, "selecting program id=%d", p_pgrm->i_id );    /* Mark it selected */    p_pgrm->b_selected = VLC_TRUE;    /* Switch master stream */    if( p_sys->p_pgrm && p_sys->p_pgrm->clock.b_master )    {        p_sys->p_pgrm->clock.b_master = VLC_FALSE;    }    p_pgrm->clock.b_master = VLC_TRUE;    p_sys->p_pgrm = p_pgrm;    /* Update "program" */    val.i_int = p_pgrm->i_id;    var_Change( p_input, "program", VLC_VAR_SETVALUE, &val, NULL );    /* Update "es-*" */    var_Change( p_input, "audio-es", VLC_VAR_CLEARCHOICES, NULL, NULL );    var_Change( p_input, "video-es", VLC_VAR_CLEARCHOICES, NULL, NULL );    var_Change( p_input, "spu-es",   VLC_VAR_CLEARCHOICES, NULL, NULL );    for( i = 0; i < p_sys->i_es; i++ )    {        if( p_sys->es[i]->p_pgrm == p_sys->p_pgrm )            EsOutESVarUpdate( out, p_sys->es[i], VLC_FALSE );        EsOutSelect( out, p_sys->es[i], VLC_FALSE );    }    /* Update now playing if defined per program */    if( p_pgrm->psz_now_playing )    {        char *psz_cat = malloc( strlen(_("Program")) + 10 );        sprintf( psz_cat, "%s %d", _("Program"), p_pgrm->i_id );        input_Control( p_input, INPUT_ADD_INFO, _(VLC_META_INFO_CAT),                       _(VLC_META_NOW_PLAYING), "%s", p_pgrm->psz_now_playing );        free( psz_cat );    }    var_SetBool( p_sys->p_input, "intf-change", VLC_TRUE );}/* EsOutAddProgram: *  Add a program */static es_out_pgrm_t *EsOutProgramAdd( es_out_t *out, int i_group ){    es_out_sys_t      *p_sys = out->p_sys;    input_thread_t    *p_input = p_sys->p_input;    vlc_value_t       val;    es_out_pgrm_t *p_pgrm = malloc( sizeof( es_out_pgrm_t ) );    /* Init */    p_pgrm->i_id = i_group;    p_pgrm->i_es = 0;    p_pgrm->b_selected = VLC_FALSE;    p_pgrm->psz_now_playing = NULL;    input_ClockInit( &p_pgrm->clock, VLC_FALSE, p_input->input.i_cr_average );    /* Append it */    TAB_APPEND( p_sys->i_pgrm, p_sys->pgrm, p_pgrm );    /* Update "program" variable */    val.i_int = i_group;    var_Change( p_input, "program", VLC_VAR_ADDCHOICE, &val, NULL );    if( i_group == var_GetInteger( p_input, "program" ) )    {        EsOutProgramSelect( out, p_pgrm );    }    else    {        var_SetBool( p_sys->p_input, "intf-change", VLC_TRUE );    }    return p_pgrm;}/* EsOutDelProgram: *  Delete a program */static int EsOutProgramDel( es_out_t *out, int i_group ){    es_out_sys_t      *p_sys = out->p_sys;    input_thread_t    *p_input = p_sys->p_input;    es_out_pgrm_t     *p_pgrm = NULL;    vlc_value_t       val;    int               i;    for( i = 0; i < p_sys->i_pgrm; i++ )    {        if( p_sys->pgrm[i]->i_id == i_group )        {            p_pgrm = p_sys->pgrm[i];            break;        }    }    if( p_pgrm == NULL )        return VLC_EGENERIC;    if( p_pgrm->i_es )    {        msg_Dbg( p_input, "can't delete program %d which still has %i ES",                 i_group, p_pgrm->i_es );        return VLC_EGENERIC;    }    TAB_REMOVE( p_sys->i_pgrm, p_sys->pgrm, p_pgrm );    /* If program is selected we need to unselect it */    if( p_sys->p_pgrm == p_pgrm ) p_sys->p_pgrm = 0;    if( p_pgrm->psz_now_playing ) free( p_pgrm->psz_now_playing );    free( p_pgrm );    /* Update "program" variable */    val.i_int = i_group;    var_Change( p_input, "program", VLC_VAR_DELCHOICE, &val, NULL );    var_SetBool( p_sys->p_input, "intf-change", VLC_TRUE );    return VLC_SUCCESS;}/* EsOutProgramMeta: */static void EsOutProgramMeta( es_out_t *out, int i_group, vlc_meta_t *p_meta ){    es_out_sys_t      *p_sys = out->p_sys;    es_out_pgrm_t     *p_pgrm = NULL;    input_thread_t    *p_input = p_sys->p_input;    char              *psz_cat = malloc( strlen(_("Program")) + 10 );    char              *psz_name = NULL;    char              *psz_now_playing = NULL;    char              *psz_provider = NULL;    int i;    msg_Dbg( p_input, "EsOutProgramMeta: number=%d", i_group );    sprintf( psz_cat, "%s %d", _("Program"), i_group );    for( i = 0; i < p_meta->i_meta; i++ )    {        msg_Dbg( p_input, "  - %s = %s", p_meta->name[i], p_meta->value[i] );        input_Control( p_input, INPUT_ADD_INFO, psz_cat,                      _(p_meta->name[i]), "%s", p_meta->value[i] );        if( !strcasecmp( p_meta->name[i], "Name" ) )            psz_name = p_meta->value[i];        else if( !strcasecmp( p_meta->name[i], "Provider" ) )            psz_provider = p_meta->value[i];        else if( !strcasecmp( p_meta->name[i], VLC_META_NOW_PLAYING ) )            psz_now_playing = p_meta->value[i];    }    if( !psz_name && !psz_now_playing )    {        free( psz_cat );        return;    }    for( i = 0; i < p_sys->i_pgrm; i++ )    {        if( p_sys->pgrm[i]->i_id == i_group )        {            p_pgrm = p_sys->pgrm[i];            break;        }    }    if( p_pgrm == NULL ) {	free( psz_cat );	msg_Dbg( p_input, "Trying to add meta for non-existing program" );	return;    }    /* Update the description text of the program */    if( psz_name && *psz_name )    {        vlc_value_t val;        vlc_value_t text;        /* ugly but it works */        val.i_int = i_group;        var_Change( p_input, "program", VLC_VAR_DELCHOICE, &val, NULL );        if( psz_provider && *psz_provider )        {            asprintf( &text.psz_string, "%s [%s]", psz_name, psz_provider );            var_Change( p_input, "program", VLC_VAR_ADDCHOICE, &val, &text );            free( text.psz_string );        }        else        {            text.psz_string = psz_name;            var_Change( p_input, "program", VLC_VAR_ADDCHOICE, &val, &text );        }    }    if( psz_now_playing )    {        if( p_pgrm->psz_now_playing ) free( p_pgrm->psz_now_playing );        p_pgrm->psz_now_playing = strdup(psz_now_playing);        if( p_sys->p_pgrm == p_pgrm )        {            input_Control( p_input, INPUT_ADD_INFO, _(VLC_META_INFO_CAT),                           _(VLC_META_NOW_PLAYING), "%s", psz_now_playing );        }    }    free( psz_cat );}/* EsOutAdd: *  Add an es_out */static es_out_id_t *EsOutAdd( es_out_t *out, es_format_t *fmt ){    es_out_sys_t      *p_sys = out->p_sys;    input_thread_t    *p_input = p_sys->p_input;    es_out_id_t       *es = malloc( sizeof( es_out_id_t ) );    es_out_pgrm_t     *p_pgrm = NULL;    int i;    if( fmt->i_group < 0 )    {        msg_Err( p_input, "invalid group number" );        return NULL;    }    /* Search the program */    for( i = 0; i < p_sys->i_pgrm; i++ )    {        if( fmt->i_group == p_sys->pgrm[i]->i_id )        {            p_pgrm = p_sys->pgrm[i];            break;        }    }    if( p_pgrm == NULL )    {        /* Create a new one */        p_pgrm = EsOutProgramAdd( out, fmt->i_group );    }    /* Increase ref count for program */    p_pgrm->i_es++;    /* Set up ES */    if( fmt->i_id < 0 )        fmt->i_id = out->p_sys->i_id;    es->i_id = fmt->i_id;    es->p_pgrm = p_pgrm;    es_format_Copy( &es->fmt, fmt );    es->i_preroll_end = -1;    es->b_discontinuity = VLC_FALSE;    switch( fmt->i_cat )    {    case AUDIO_ES:        es->i_channel = p_sys->i_audio;        break;    case VIDEO_ES:        es->i_channel = p_sys->i_video;        if( fmt->video.i_frame_rate && fmt->video.i_frame_rate_base )            vlc_ureduce( &es->fmt.video.i_frame_rate,                         &es->fmt.video.i_frame_rate_base,                         fmt->video.i_frame_rate,                         fmt->video.i_frame_rate_base, 0 );        break;    case SPU_ES:        es->i_channel = p_sys->i_sub;        break;    default:        es->i_channel = 0;        break;    }    es->psz_language = LanguageGetName( fmt->psz_language ); /* remember so we only need to do it once */    es->psz_language_code = LanguageGetCode( fmt->psz_language );    es->p_dec = NULL;    if( es->p_pgrm == p_sys->p_pgrm )        EsOutESVarUpdate( out, es, VLC_FALSE );    /* Select it if needed */    EsOutSelect( out, es, VLC_FALSE );    TAB_APPEND( out->p_sys->i_es, out->p_sys->es, es );    p_sys->i_id++;  /* always incremented */    switch( fmt->i_cat )    {        case AUDIO_ES:            p_sys->i_audio++;            break;        case SPU_ES:            p_sys->i_sub++;            break;        case VIDEO_ES:            p_sys->i_video++;            break;    }    EsOutAddInfo( out, es );    return es;}static void EsSelect( es_out_t *out, es_out_id_t *es ){    es_out_sys_t   *p_sys = out->p_sys;    input_thread_t *p_input = p_sys->p_input;    vlc_value_t    val;    char           *psz_var;    if( es->p_dec )    {        msg_Warn( p_input, "ES 0x%x is already selected", es->i_id );        return;    }    if( es->fmt.i_cat == VIDEO_ES || es->fmt.i_cat == SPU_ES )    {        if( !var_GetBool( p_input, "video" ) ||            ( p_input->p_sout && !var_GetBool( p_input, "sout-video" ) ) )        {            msg_Dbg( p_input, "video is disabled, not selecting ES 0x%x",                     es->i_id );            return;        }    }    else if( es->fmt.i_cat == AUDIO_ES )    {        var_Get( p_input, "audio", &val );        if( !var_GetBool( p_input, "audio" ) ||            ( p_input->p_sout && !var_GetBool( p_input, "sout-audio" ) ) )        {            msg_Dbg( p_input, "audio is disabled, not selecting ES 0x%x",                     es->i_id );            return;        }    }    if( es->fmt.i_cat == SPU_ES )    {        var_Get( p_input, "spu", &val );        if( !var_GetBool( p_input, "spu" ) ||            ( p_input->p_sout && !var_GetBool( p_input, "sout-spu" ) ) )        {            msg_Dbg( p_input, "spu is disabled, not selecting ES 0x%x",                     es->i_id );            return;        }    }    es->i_preroll_end = -1;    es->p_dec = input_DecoderNew( p_input, &es->fmt, VLC_FALSE );    if( es->p_dec == NULL || es->p_pgrm != p_sys->p_pgrm )        return;    if( es->fmt.i_cat == VIDEO_ES )        psz_var = "video-es";    else if( es->fmt.i_cat == AUDIO_ES )        psz_var = "audio-es";    else if( es->fmt.i_cat == SPU_ES )        psz_var = "spu-es";    else        return;    /* Mark it as selected */    val.i_int = es->i_id;    var_Change( p_input, psz_var, VLC_VAR_SETVALUE, &val, NULL );    var_SetBool( p_sys->p_input, "intf-change", VLC_TRUE );}static void EsUnselect( es_out_t *out, es_out_id_t *es, vlc_bool_t b_update ){    es_out_sys_t   *p_sys = out->p_sys;    input_thread_t *p_input = p_sys->p_input;    vlc_value_t    val;    char           *psz_var;    if( es->p_dec == NULL )    {        msg_Warn( p_input, "ES 0x%x is already unselected", es->i_id );        return;    }    input_DecoderDelete( es->p_dec );    es->p_dec = NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -