📄 es_out.c
字号:
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 + -