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

📄 es_out.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 5 页
字号:
                }            }            {                vlc_event_t event;                event.type = vlc_InputSelectedStreamChanged;                vlc_event_send( &p_sys->p_input->p->event_manager, &event );            }            return VLC_SUCCESS;         case ES_OUT_SET_DEFAULT:        {            es = (es_out_id_t*) va_arg( args, es_out_id_t * );            if( es == NULL )            {                /*p_sys->i_default_video_id = -1;*/                /*p_sys->i_default_audio_id = -1;*/                p_sys->i_default_sub_id = -1;            }            else if( es == (es_out_id_t*)((uint8_t*)NULL+AUDIO_ES) )            {                /*p_sys->i_default_video_id = -1;*/            }            else if( es == (es_out_id_t*)((uint8_t*)NULL+VIDEO_ES) )            {                /*p_sys->i_default_audio_id = -1;*/            }            else if( es == (es_out_id_t*)((uint8_t*)NULL+SPU_ES) )            {                p_sys->i_default_sub_id = -1;            }            else            {                /*if( es->fmt.i_cat == VIDEO_ES )                    p_sys->i_default_video_id = es->i_id;                else                if( es->fmt.i_cat == AUDIO_ES )                    p_sys->i_default_audio_id = es->i_id;                else*/                if( es->fmt.i_cat == SPU_ES )                    p_sys->i_default_sub_id = es->i_id;            }            return VLC_SUCCESS;        }        case ES_OUT_SET_PCR:        case ES_OUT_SET_GROUP_PCR:        {            es_out_pgrm_t *p_pgrm = NULL;            int            i_group = 0;            int64_t        i_pcr;            if( i_query == ES_OUT_SET_PCR )            {                p_pgrm = p_sys->p_pgrm;            }            else            {                int i;                i_group = (int)va_arg( args, int );                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 )                p_pgrm = EsOutProgramAdd( out, i_group );   /* Create it */            i_pcr = (int64_t)va_arg( args, int64_t );            /* search program */            input_ClockSetPCR( p_sys->p_input, &p_pgrm->clock, i_pcr );            return VLC_SUCCESS;        }        case ES_OUT_RESET_PCR:            for( i = 0; i < p_sys->i_pgrm; i++ )                input_ClockResetPCR( &p_sys->pgrm[i]->clock );            return VLC_SUCCESS;        case ES_OUT_GET_TS:            if( p_sys->p_pgrm )            {                int64_t i_ts = (int64_t)va_arg( args, int64_t );                int64_t *pi_ts = (int64_t *)va_arg( args, int64_t * );                *pi_ts = input_ClockGetTS( p_sys->p_input,                                           &p_sys->p_pgrm->clock, i_ts );                return VLC_SUCCESS;            }            return VLC_EGENERIC;        case ES_OUT_GET_GROUP:            pi = (int*) va_arg( args, int* );            if( p_sys->p_pgrm )                *pi = p_sys->p_pgrm->i_id;            else                *pi = -1;    /* FIXME */            return VLC_SUCCESS;        case ES_OUT_SET_GROUP:        {            int j;            i = (int) va_arg( args, int );            for( j = 0; j < p_sys->i_pgrm; j++ )            {                es_out_pgrm_t *p_pgrm = p_sys->pgrm[j];                if( p_pgrm->i_id == i )                {                    EsOutProgramSelect( out, p_pgrm );                    return VLC_SUCCESS;                }            }            return VLC_EGENERIC;        }        case ES_OUT_SET_FMT:        {            /* This ain't pretty but is need by some demuxers (eg. Ogg )             * to update the p_extra data */            es_format_t *p_fmt;            es = (es_out_id_t*) va_arg( args, es_out_id_t * );            p_fmt = (es_format_t*) va_arg( args, es_format_t * );            if( es == NULL ) return VLC_EGENERIC;            if( p_fmt->i_extra )            {                es->fmt.i_extra = p_fmt->i_extra;                es->fmt.p_extra = realloc( es->fmt.p_extra, p_fmt->i_extra );                memcpy( es->fmt.p_extra, p_fmt->p_extra, p_fmt->i_extra );                if( !es->p_dec ) return VLC_SUCCESS;#if 1                input_DecoderDelete( es->p_dec );                es->p_dec = input_DecoderNew( p_sys->p_input,                                              &es->fmt, false );#else                es->p_dec->fmt_in.i_extra = p_fmt->i_extra;                es->p_dec->fmt_in.p_extra =                    realloc( es->p_dec->fmt_in.p_extra, p_fmt->i_extra );                memcpy( es->p_dec->fmt_in.p_extra,                        p_fmt->p_extra, p_fmt->i_extra );#endif            }            return VLC_SUCCESS;        }        case ES_OUT_SET_NEXT_DISPLAY_TIME:        {            int64_t i_date;            es = (es_out_id_t*) va_arg( args, es_out_id_t * );            i_date = (int64_t)va_arg( args, int64_t );            if( !es || !es->p_dec )                return VLC_EGENERIC;            /* XXX We should call input_ClockGetTS but PCR has been reseted             * and it will return 0, so we won't call input_ClockGetTS on all preroll samples             * but that's ugly(more time discontinuity), it need to be improved -- fenrir */            es->i_preroll_end = i_date;            return VLC_SUCCESS;        }        case ES_OUT_SET_GROUP_META:        {            int i_group = (int)va_arg( args, int );            vlc_meta_t *p_meta = (vlc_meta_t*)va_arg( args, vlc_meta_t * );            EsOutProgramMeta( out, i_group, p_meta );            return VLC_SUCCESS;        }        case ES_OUT_SET_GROUP_EPG:        {            int i_group = (int)va_arg( args, int );            vlc_epg_t *p_epg = (vlc_epg_t*)va_arg( args, vlc_epg_t * );            EsOutProgramEpg( out, i_group, p_epg );            return VLC_SUCCESS;        }        case ES_OUT_DEL_GROUP:        {            int i_group = (int)va_arg( args, int );            return EsOutProgramDel( out, i_group );        }        default:            msg_Err( p_sys->p_input, "unknown query in es_out_Control" );            return VLC_EGENERIC;    }}/**************************************************************************** * LanguageGetName: try to expend iso639 into plain name ****************************************************************************/static char *LanguageGetName( const char *psz_code ){    const iso639_lang_t *pl;    if( psz_code == NULL )    {        return strdup( "" );    }    if( strlen( psz_code ) == 2 )    {        pl = GetLang_1( psz_code );    }    else if( strlen( psz_code ) == 3 )    {        pl = GetLang_2B( psz_code );        if( !strcmp( pl->psz_iso639_1, "??" ) )        {            pl = GetLang_2T( psz_code );        }    }    else    {        return strdup( psz_code );    }    if( !strcmp( pl->psz_iso639_1, "??" ) )    {       return strdup( psz_code );    }    else    {        if( *pl->psz_native_name )        {            return strdup( pl->psz_native_name );        }        return strdup( pl->psz_eng_name );    }}/* Get a 2 char code */static char *LanguageGetCode( const char *psz_lang ){    const iso639_lang_t *pl;    if( psz_lang == NULL || *psz_lang == '\0' )        return strdup("??");    for( pl = p_languages; pl->psz_iso639_1 != NULL; pl++ )    {        if( !strcasecmp( pl->psz_eng_name, psz_lang ) ||            !strcasecmp( pl->psz_native_name, psz_lang ) ||            !strcasecmp( pl->psz_iso639_1, psz_lang ) ||            !strcasecmp( pl->psz_iso639_2T, psz_lang ) ||            !strcasecmp( pl->psz_iso639_2B, psz_lang ) )            break;    }    if( pl->psz_iso639_1 != NULL )        return strdup( pl->psz_iso639_1 );    return strdup("??");}static char **LanguageSplit( const char *psz_langs ){    char *psz_dup;    char *psz_parser;    char **ppsz = NULL;    int i_psz = 0;    if( psz_langs == NULL ) return NULL;    psz_parser = psz_dup = strdup(psz_langs);    while( psz_parser && *psz_parser )    {        char *psz;        char *psz_code;        psz = strchr(psz_parser, ',' );        if( psz ) *psz++ = '\0';        if( !strcmp( psz_parser, "any" ) )        {            TAB_APPEND( i_psz, ppsz, strdup("any") );        }        else        {            psz_code = LanguageGetCode( psz_parser );            if( strcmp( psz_code, "??" ) )            {                TAB_APPEND( i_psz, ppsz, psz_code );            }            else            {                free( psz_code );            }        }        psz_parser = psz;    }    if( i_psz )    {        TAB_APPEND( i_psz, ppsz, NULL );    }    free( psz_dup );    return ppsz;}static int LanguageArrayIndex( char **ppsz_langs, char *psz_lang ){    int i;    if( !ppsz_langs || !psz_lang ) return -1;    for( i = 0; ppsz_langs[i]; i++ )    {        if( !strcasecmp( ppsz_langs[i], psz_lang ) ||            !strcasecmp( ppsz_langs[i], "any" ) )        {            return i;        }    }    return -1;}/**************************************************************************** * EsOutAddInfo: * - add meta info to the playlist item ****************************************************************************/static void EsOutAddInfo( 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;    es_format_t    *fmt = &es->fmt;    char           *psz_cat;    lldiv_t         div;    /* Add stream info */    if( asprintf( &psz_cat, _("Stream %d"), out->p_sys->i_id - 1 ) == -1 )        return;    input_Control( p_input, INPUT_ADD_INFO, psz_cat, _("Codec"),                   "%.4s", (char*)&fmt->i_codec );    input_Control( p_input, INPUT_ADD_INFO, psz_cat, _("Language"),                   "%s", es->psz_language );    /* Add information */    switch( fmt->i_cat )    {    case AUDIO_ES:        input_Control( p_input, INPUT_ADD_INFO, psz_cat,                       _("Type"), _("Audio") );        if( fmt->audio.i_channels > 0 )            input_Control( p_input, INPUT_ADD_INFO, psz_cat, _("Channels"),                           "%u", fmt->audio.i_channels );        if( fmt->audio.i_rate > 0 )        {            input_Control( p_input, INPUT_ADD_INFO, psz_cat, _("Sample rate"),                           _("%u Hz"), fmt->audio.i_rate );            var_SetInteger( p_input, "sample-rate", fmt->audio.i_rate );        }        if( fmt->audio.i_bitspersample > 0 )            input_Control( p_input, INPUT_ADD_INFO, psz_cat,                           _("Bits per sample"), "%u",                           fmt->audio.i_bitspersample );        if( fmt->i_bitrate > 0 )        {            input_Control( p_input, INPUT_ADD_INFO, psz_cat, _("Bitrate"),                           _("%u kb/s"), fmt->i_bitrate / 1000 );            var_SetInteger( p_input, "bit-rate", fmt->i_bitrate );        }        break;    case VIDEO_ES:        input_Control( p_input, INPUT_ADD_INFO, psz_cat,                       _("Type"), _("Video") );        if( fmt->video.i_width > 0 && fmt->video.i_height > 0 )            input_Control( p_input, INPUT_ADD_INFO, psz_cat,                           _("Resolution"), "%ux%u",                           fmt->video.i_width, fmt->video.i_height );        if( fmt->video.i_visible_width > 0 &&            fmt->video.i_visible_height > 0 )            input_Control( p_input, INPUT_ADD_INFO, psz_cat,                           _("Display resolution"), "%ux%u",                           fmt->video.i_visible_width,                           fmt->video.i_visible_height);       if( fmt->video.i_frame_rate > 0 &&           fmt->video.i_frame_rate_base > 0 )       {           div = lldiv( (float)fmt->video.i_frame_rate /                               fmt->video.i_frame_rate_base * 1000000,                               1000000 );           input_Control( p_input, INPUT_ADD_INFO, psz_cat,                          _("Frame rate"), "%"PRId64".%06u",                          div.quot, (unsigned int )div.rem );       }       break;    case SPU_ES:        input_Control( p_input, INPUT_ADD_INFO, psz_cat,                       _("Type"), _("Subtitle") );        break;    default:        break;    }    free( psz_cat );}

⌨️ 快捷键说明

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