📄 access.c
字号:
/***************************************************************************** * 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 + -