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

📄 access.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * Block: *****************************************************************************/static block_t *Block( access_t *p_access ){    access_sys_t *p_sys = p_access->p_sys;    block_t *p_block;    for ( ; ; )    {        struct pollfd ufds[2];        int i_ret;        /* Initialize file descriptor sets */        memset (ufds, 0, sizeof (ufds));        ufds[0].fd = p_sys->i_handle;        ufds[0].events = POLLIN;        ufds[1].fd = p_sys->i_frontend_handle;        ufds[1].events = POLLPRI;        /* We'll wait 0.5 second if nothing happens */        /* Find if some data is available */        i_ret = poll( ufds, 2, 500 );        if ( p_access->b_die )            return NULL;        if ( i_ret < 0 )        {            if( errno == EINTR )                continue;            msg_Err( p_access, "poll error: %s", strerror(errno) );            return NULL;        }        if ( p_sys->i_ca_handle && mdate() > p_sys->i_ca_next_event )        {            E_(CAMPoll)( p_access );            p_sys->i_ca_next_event = mdate() + p_sys->i_ca_timeout;        }        if ( ufds[1].revents )        {            E_(FrontendPoll)( p_access );        }#ifdef ENABLE_HTTPD        if ( p_sys->i_httpd_timeout && mdate() > p_sys->i_httpd_timeout )        {            vlc_mutex_lock( &p_sys->httpd_mutex );            if ( p_sys->b_request_frontend_info )            {                msg_Warn( p_access, "frontend timeout for HTTP interface" );                p_sys->b_request_frontend_info = VLC_FALSE;                p_sys->psz_frontend_info = strdup( "Timeout getting info\n" );            }            if ( p_sys->b_request_mmi_info )            {                msg_Warn( p_access, "MMI timeout for HTTP interface" );                p_sys->b_request_mmi_info = VLC_FALSE;                p_sys->psz_mmi_info = strdup( "Timeout getting info\n" );            }            vlc_cond_signal( &p_sys->httpd_cond );            vlc_mutex_unlock( &p_sys->httpd_mutex );        }        if ( p_sys->b_request_frontend_info )        {            E_(FrontendStatus)( p_access );        }        if ( p_sys->b_request_mmi_info )        {            E_(CAMStatus)( p_access );        }#endif        if ( p_sys->i_frontend_timeout && mdate() > p_sys->i_frontend_timeout )        {            msg_Warn( p_access, "no lock, tuning again" );            E_(FrontendSet)( p_access );        }        if ( ufds[0].revents )        {            p_block = block_New( p_access,                                 p_sys->i_read_once * TS_PACKET_SIZE );            if( ( p_block->i_buffer = read( p_sys->i_handle, p_block->p_buffer,                                p_sys->i_read_once * TS_PACKET_SIZE ) ) <= 0 )            {                msg_Warn( p_access, "read failed (%s)", strerror(errno) );                block_Release( p_block );                continue;            }            break;        }    }    if( p_sys->i_read_once < DVB_READ_ONCE )        p_sys->i_read_once++;    return p_block;}/***************************************************************************** * Control: *****************************************************************************/static int Control( access_t *p_access, int i_query, va_list args ){    access_sys_t *p_sys = p_access->p_sys;    vlc_bool_t   *pb_bool, b_bool;    int          *pi_int, i_int;    int64_t      *pi_64;    switch( i_query )    {        /* */        case ACCESS_CAN_SEEK:        case ACCESS_CAN_FASTSEEK:        case ACCESS_CAN_PAUSE:        case ACCESS_CAN_CONTROL_PACE:            pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t* );            *pb_bool = VLC_FALSE;            break;        /* */        case ACCESS_GET_MTU:            pi_int = (int*)va_arg( args, int * );            *pi_int = DVB_READ_ONCE * TS_PACKET_SIZE;            break;        case ACCESS_GET_PTS_DELAY:            pi_64 = (int64_t*)va_arg( args, int64_t * );            *pi_64 = var_GetInteger( p_access, "dvb-caching" ) * 1000;            break;        /* */        case ACCESS_SET_PAUSE_STATE:        case ACCESS_GET_TITLE_INFO:        case ACCESS_SET_TITLE:        case ACCESS_SET_SEEKPOINT:            return VLC_EGENERIC;        case ACCESS_SET_PRIVATE_ID_STATE:            i_int  = (int)va_arg( args, int );               /* Private data (pid for now)*/            b_bool = (vlc_bool_t)va_arg( args, vlc_bool_t ); /* b_selected */            if( !p_sys->b_budget_mode )            {                /* FIXME we may want to give the real type (me ?, I don't ;) */                if( b_bool )                    FilterSet( p_access, i_int, OTHER_TYPE );                else                    FilterUnsetPID( p_access, i_int );            }            break;        case ACCESS_SET_PRIVATE_ID_CA:        {            dvbpsi_pmt_t *p_pmt;            p_pmt = (dvbpsi_pmt_t *)va_arg( args, dvbpsi_pmt_t * );            E_(CAMSet)( p_access, p_pmt );            break;        }        default:            msg_Warn( p_access, "unimplemented query in control" );            return VLC_EGENERIC;    }    return VLC_SUCCESS;}/***************************************************************************** * FilterSet/FilterUnset: *****************************************************************************/static void FilterSet( access_t *p_access, int i_pid, int i_type ){    access_sys_t *p_sys = p_access->p_sys;    int i;    /* Find first free slot */    for( i = 0; i < MAX_DEMUX; i++ )    {        if( !p_sys->p_demux_handles[i].i_type )            break;        if( p_sys->p_demux_handles[i].i_pid == i_pid )            return; /* Already set */    }    if( i >= MAX_DEMUX )    {        msg_Err( p_access, "no free p_demux_handles !" );        return;    }    if( E_(DMXSetFilter)( p_access, i_pid,                           &p_sys->p_demux_handles[i].i_handle, i_type ) )    {        msg_Err( p_access, "DMXSetFilter failed" );        return;    }    p_sys->p_demux_handles[i].i_type = i_type;    p_sys->p_demux_handles[i].i_pid = i_pid;    if( p_sys->i_read_once < DVB_READ_ONCE )        p_sys->i_read_once++;}static void FilterUnset( access_t *p_access, int i_max ){    access_sys_t *p_sys = p_access->p_sys;    int i;    for( i = 0; i < i_max; i++ )    {        if( p_sys->p_demux_handles[i].i_type )        {            E_(DMXUnsetFilter)( p_access, p_sys->p_demux_handles[i].i_handle );            p_sys->p_demux_handles[i].i_type = 0;        }    }}static void FilterUnsetPID( access_t *p_access, int i_pid ){    access_sys_t *p_sys = p_access->p_sys;    int i;    for( i = 0; i < MAX_DEMUX; i++ )    {        if( p_sys->p_demux_handles[i].i_type &&            p_sys->p_demux_handles[i].i_pid == i_pid )        {            E_(DMXUnsetFilter)( p_access, p_sys->p_demux_handles[i].i_handle );            p_sys->p_demux_handles[i].i_type = 0;        }    }}/***************************************************************************** * VarInit/ParseMRL: *****************************************************************************/static void VarInit( access_t *p_access ){    /* */    var_Create( p_access, "dvb-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    /* */    var_Create( p_access, "dvb-adapter", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-device", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-frequency", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-inversion", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-probe", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-budget-mode", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );    /* */    var_Create( p_access, "dvb-satno", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-voltage", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-high-voltage", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-tone", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-fec", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-srate", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-lnb-lof1", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-lnb-lof2", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-lnb-slof", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    /* */    var_Create( p_access, "dvb-modulation", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    /* */    var_Create( p_access, "dvb-code-rate-hp", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-code-rate-lp", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-bandwidth", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-transmission", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-guard", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-hierarchy", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );#ifdef ENABLE_HTTPD    var_Create( p_access, "dvb-http-host", VLC_VAR_STRING | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-http-user", VLC_VAR_STRING | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-http-password", VLC_VAR_STRING | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-http-acl", VLC_VAR_STRING | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-http-intf-cert", VLC_VAR_STRING | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-http-intf-key", VLC_VAR_STRING | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-http-intf-ca", VLC_VAR_STRING | VLC_VAR_DOINHERIT );    var_Create( p_access, "dvb-http-intf-crl", VLC_VAR_STRING | VLC_VAR_DOINHERIT );#endif}/* */static int ParseMRL( access_t *p_access ){    char *psz_dup = strdup( p_access->psz_path );    char *psz_parser = psz_dup;    char *psz_next;    vlc_value_t         val;#define GET_OPTION_INT( option )                                            \    if ( !strncmp( psz_parser, option "=", strlen(option "=") ) )           \    {                                                                       \        val.i_int = strtol( psz_parser + strlen(option "="), &psz_parser,   \                            0 );                                            \        var_Set( p_access, "dvb-" option, val );                            \    }#define GET_OPTION_BOOL( option )                                           \    if ( !strncmp( psz_parser, option "=", strlen(option "=") ) )           \    {                                                                       \        val.b_bool = strtol( psz_parser + strlen(option "="), &psz_parser,  \                             0 );                                           \        var_Set( p_access, "dvb-" option, val );                            \    }    /* Test for old syntax */    strtol( psz_parser, &psz_next, 10 );    if( psz_next != psz_parser )    {        msg_Err( p_access, "the DVB input old syntax is deprecated, use vlc "                          "-p dvb to see an explanation of the new syntax" );        free( psz_dup );        return VLC_EGENERIC;    }    while( *psz_parser )    {        GET_OPTION_INT("adapter")        else GET_OPTION_INT("device")        else GET_OPTION_INT("frequency")        else GET_OPTION_INT("inversion")        else GET_OPTION_BOOL("probe")        else GET_OPTION_BOOL("budget-mode")        else GET_OPTION_INT("voltage")        else GET_OPTION_BOOL("high-voltage")        else GET_OPTION_INT("tone")        else GET_OPTION_INT("satno")        else GET_OPTION_INT("fec")        else GET_OPTION_INT("srate")        else GET_OPTION_INT("lnb-lof1")        else GET_OPTION_INT("lnb-lof2")        else GET_OPTION_INT("lnb-slof")        else GET_OPTION_INT("modulation")        else GET_OPTION_INT("code-rate-hp")        else GET_OPTION_INT("code-rate-lp")        else GET_OPTION_INT("bandwidth")        else GET_OPTION_INT("transmission")        else GET_OPTION_INT("guard")        else GET_OPTION_INT("hierarchy")        /* Redundant with voltage but much easier to use */        else if( !strncmp( psz_parser, "polarization=",                           strlen( "polarization=" ) ) )        {            psz_parser += strlen( "polarization=" );            if ( *psz_parser == 'V' || *psz_parser == 'v' )                val.i_int = 13;            else if ( *psz_parser == 'H' || *psz_parser == 'h' )                val.i_int = 18;            else            {                msg_Err( p_access, "illegal polarization %c", *psz_parser );                free( psz_dup );                return VLC_EGENERIC;            }            var_Set( p_access, "dvb-voltage", val );        }        else        {            msg_Err( p_access, "unknown option (%s)", psz_parser );            free( psz_dup );            return VLC_EGENERIC;        }        if ( *psz_parser )            psz_parser++;    }#undef GET_OPTION_INT#undef GET_OPTION_BOOL    free( psz_dup );    return VLC_SUCCESS;}

⌨️ 快捷键说明

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