📄 linux_dvb.c
字号:
static fe_guard_interval_t DecodeGuardInterval( access_t *p_access ){ vlc_value_t val; fe_guard_interval_t fe_guard = 0; var_Get( p_access, "dvb-guard", &val ); msg_Dbg( p_access, "using guard=%d", val.i_int ); switch( val.i_int ) { case 0: fe_guard = GUARD_INTERVAL_AUTO; break; case 4: fe_guard = GUARD_INTERVAL_1_4; break; case 8: fe_guard = GUARD_INTERVAL_1_8; break; case 16: fe_guard = GUARD_INTERVAL_1_16; break; case 32: fe_guard = GUARD_INTERVAL_1_32; break; default: msg_Dbg( p_access, "terrestrial dvb has guard interval not set, using auto"); fe_guard = GUARD_INTERVAL_AUTO; break; } return fe_guard;}static fe_hierarchy_t DecodeHierarchy( access_t *p_access ){ vlc_value_t val; fe_hierarchy_t fe_hierarchy = 0; var_Get( p_access, "dvb-hierarchy", &val ); msg_Dbg( p_access, "using hierarchy=%d", val.i_int ); switch( val.i_int ) { case -1: fe_hierarchy = HIERARCHY_NONE; break; case 0: fe_hierarchy = HIERARCHY_AUTO; break; case 1: fe_hierarchy = HIERARCHY_1; break; case 2: fe_hierarchy = HIERARCHY_2; break; case 4: fe_hierarchy = HIERARCHY_4; break; default: msg_Dbg( p_access, "terrestrial dvb has hierarchy not set, using auto"); fe_hierarchy = HIERARCHY_AUTO; break; } return fe_hierarchy;}static int FrontendSetOFDM( access_t * p_access ){ access_sys_t *p_sys = p_access->p_sys; struct dvb_frontend_parameters fep; vlc_value_t val; int ret; /* Prepare the fep structure */ var_Get( p_access, "dvb-frequency", &val ); fep.frequency = val.i_int; fep.inversion = DecodeInversion( p_access ); fep.u.ofdm.bandwidth = DecodeBandwidth( p_access ); var_Get( p_access, "dvb-code-rate-hp", &val ); fep.u.ofdm.code_rate_HP = DecodeFEC( p_access, val.i_int ); var_Get( p_access, "dvb-code-rate-lp", &val ); fep.u.ofdm.code_rate_LP = DecodeFEC( p_access, val.i_int ); fep.u.ofdm.constellation = DecodeModulation( p_access ); fep.u.ofdm.transmission_mode = DecodeTransmission( p_access ); fep.u.ofdm.guard_interval = DecodeGuardInterval( p_access ); fep.u.ofdm.hierarchy_information = DecodeHierarchy( p_access ); /* Empty the event queue */ for( ; ; ) { struct dvb_frontend_event event; if ( ioctl( p_sys->i_frontend_handle, FE_GET_EVENT, &event ) < 0 && errno == EWOULDBLOCK ) break; } /* Now send it all to the frontend device */ if( (ret = ioctl( p_sys->i_frontend_handle, FE_SET_FRONTEND, &fep )) < 0 ) { msg_Err( p_access, "DVB-T: setting frontend failed (%d) %s", ret, strerror(errno) ); return -1; } return VLC_SUCCESS;}/* * Demux *//***************************************************************************** * DMXSetFilter : controls the demux to add a filter *****************************************************************************/int E_(DMXSetFilter)( access_t * p_access, int i_pid, int * pi_fd, int i_type ){ struct dmx_pes_filter_params s_filter_params; int i_ret; unsigned int i_adapter, i_device; char dmx[128]; vlc_value_t val; var_Get( p_access, "dvb-adapter", &val ); i_adapter = val.i_int; var_Get( p_access, "dvb-device", &val ); i_device = val.i_int; if( snprintf( dmx, sizeof(dmx), DMX, i_adapter, i_device ) >= (int)sizeof(dmx) ) { msg_Err( p_access, "snprintf() truncated string for DMX" ); dmx[sizeof(dmx) - 1] = '\0'; } msg_Dbg( p_access, "Opening device %s", dmx ); if( (*pi_fd = open(dmx, O_RDWR)) < 0 ) { msg_Err( p_access, "DMXSetFilter: opening device failed (%s)", strerror(errno) ); return VLC_EGENERIC; } /* We fill the DEMUX structure : */ s_filter_params.pid = i_pid; s_filter_params.input = DMX_IN_FRONTEND; s_filter_params.output = DMX_OUT_TS_TAP; s_filter_params.flags = DMX_IMMEDIATE_START; switch ( i_type ) { /* First device */ case 1: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_VIDEO0 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_VIDEO0; break; case 2: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_AUDIO0 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_AUDIO0; break; case 3: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_TELETEXT0 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_TELETEXT0; break; case 4: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_SUBTITLE0 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_SUBTITLE0; break; case 5: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_PCR0 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_PCR0; break; /* Second device */ case 6: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_VIDEO1 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_VIDEO1; break; case 7: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_AUDIO1 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_AUDIO1; break; case 8: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_TELETEXT1 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_TELETEXT1; break; case 9: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_SUBTITLE1 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_SUBTITLE1; break; case 10: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_PCR1 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_PCR1; break; /* Third device */ case 11: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_VIDEO2 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_VIDEO2; break; case 12: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_AUDIO2 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_AUDIO2; break; case 13: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_TELETEXT2 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_TELETEXT2; break; case 14: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_SUBTITLE2 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_SUBTITLE2; break; case 15: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_PCR2 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_PCR2; break; /* Forth device */ case 16: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_VIDEO3 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_VIDEO3; break; case 17: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_AUDIO3 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_AUDIO3; break; case 18: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_TELETEXT3 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_TELETEXT3; break; case 19: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_SUBTITLE3 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_SUBTITLE3; break; case 20: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_PCR3 for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_PCR3; break; /* Usually used by Nova cards */ case 21: default: msg_Dbg(p_access, "DMXSetFilter: DMX_PES_OTHER for PID %d", i_pid); s_filter_params.pes_type = DMX_PES_OTHER; break; } /* We then give the order to the device : */ if( (i_ret = ioctl( *pi_fd, DMX_SET_PES_FILTER, &s_filter_params )) < 0 ) { msg_Err( p_access, "DMXSetFilter: failed with %d (%s)", i_ret, strerror(errno) ); return VLC_EGENERIC; } return VLC_SUCCESS;}/***************************************************************************** * DMXUnsetFilter : removes a filter *****************************************************************************/int E_(DMXUnsetFilter)( access_t * p_access, int i_fd ){ int i_ret; if( (i_ret = ioctl( i_fd, DMX_STOP )) < 0 ) { msg_Err( p_access, "DMX_STOP failed for demux (%d) %s", i_ret, strerror(errno) ); return i_ret; } msg_Dbg( p_access, "DMXUnsetFilter: closing demux %d", i_fd ); close( i_fd ); return VLC_SUCCESS;}/* * DVR device *//***************************************************************************** * DVROpen : *****************************************************************************/int E_(DVROpen)( access_t * p_access ){ access_sys_t *p_sys = p_access->p_sys; unsigned int i_adapter, i_device; char dvr[128]; vlc_value_t val; var_Get( p_access, "dvb-adapter", &val ); i_adapter = val.i_int; var_Get( p_access, "dvb-device", &val ); i_device = val.i_int; if( snprintf( dvr, sizeof(dvr), DVR, i_adapter, i_device ) >= (int)sizeof(dvr) ) { msg_Err( p_access, "snprintf() truncated string for DVR" ); dvr[sizeof(dvr) - 1] = '\0'; } msg_Dbg( p_access, "Opening device %s", dvr ); if( (p_sys->i_handle = open(dvr, O_RDONLY)) < 0 ) { msg_Err( p_access, "DVROpen: opening device failed (%s)", strerror(errno) ); return VLC_EGENERIC; } return VLC_SUCCESS;}/***************************************************************************** * DVRClose : *****************************************************************************/void E_(DVRClose)( access_t * p_access ){ access_sys_t *p_sys = p_access->p_sys; close( p_sys->i_handle );}/* * CAM device *//***************************************************************************** * CAMOpen : *****************************************************************************/int E_(CAMOpen)( access_t *p_access ){ access_sys_t *p_sys = p_access->p_sys; char ca[128]; int i_adapter, i_device, i_slot; ca_caps_t caps; i_adapter = var_GetInteger( p_access, "dvb-adapter" ); i_device = var_GetInteger( p_access, "dvb-device" ); if( snprintf( ca, sizeof(ca), CA, i_adapter, i_device ) >= (int)sizeof(ca) ) { msg_Err( p_access, "snprintf() truncated string for CA" ); ca[sizeof(ca) - 1] = '\0'; } msg_Dbg( p_access, "Opening device %s", ca ); if( (p_sys->i_ca_handle = open(ca, O_RDWR | O_NONBLOCK)) < 0 ) { msg_Err( p_access, "CAMInit: opening device failed (%s)", strerror(errno) ); p_sys->i_ca_handle = 0; return VLC_EGENERIC; } if ( ioctl( p_sys->i_ca_handle, CA_GET_CAP, &caps ) != 0 || caps.slot_num == 0 || caps.slot_type != CA_CI_LINK ) { msg_Err( p_access, "CAMInit: no compatible CAM module" ); close( p_sys->i_ca_handle ); p_sys->i_ca_handle = 0; return VLC_EGENERIC; } p_sys->i_nb_slots = caps.slot_num; memset( p_sys->pb_active_slot, 0, sizeof(vlc_bool_t) * MAX_CI_SLOTS ); for ( i_slot = 0; i_slot < p_sys->i_nb_slots; i_slot++ ) { if ( ioctl( p_sys->i_ca_handle, CA_RESET, 1 << i_slot) != 0 ) { msg_Err( p_access, "CAMInit: couldn't reset slot %d", i_slot ); } } msg_Dbg( p_access, "CAMInit: found a CI handler with %d slots", p_sys->i_nb_slots ); p_sys->i_ca_timeout = 100000; /* Wait a bit otherwise it doesn't initialize properly... */ msleep( 1000000 ); return VLC_SUCCESS;}/***************************************************************************** * CAMPoll : *****************************************************************************/int E_(CAMPoll)( access_t * p_access ){ access_sys_t *p_sys = p_access->p_sys; if ( p_sys->i_ca_handle == 0 ) { return VLC_EGENERIC; } return E_(en50221_Poll)( p_access );}/***************************************************************************** * CAMSet : *****************************************************************************/int E_(CAMSet)( access_t * p_access, dvbpsi_pmt_t *p_pmt ){ access_sys_t *p_sys = p_access->p_sys; if ( p_sys->i_ca_handle == 0 ) { return VLC_EGENERIC; } E_(en50221_SetCAPMT)( p_access, p_pmt ); return VLC_SUCCESS;}/***************************************************************************** * CAMClose : *****************************************************************************/void E_(CAMClose)( access_t * p_access ){ access_sys_t *p_sys = p_access->p_sys; E_(en50221_End)( p_access ); if ( p_sys->i_ca_handle ) { close( p_sys->i_ca_handle ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -