📄 linux_dvb.c
字号:
} 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 = DecodeModulationOFDM( 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): %m", ret ); return -1; } return VLC_SUCCESS;}/***************************************************************************** * FrontendSetATSC : controls the FE device *****************************************************************************/static int FrontendSetATSC( access_t *p_access ){ access_sys_t *p_sys = p_access->p_sys; struct dvb_frontend_parameters fep; vlc_value_t val; int i_ret; /* Prepare the fep structure */ var_Get( p_access, "dvb-frequency", &val ); fep.frequency = val.i_int; fep.u.vsb.modulation = DecodeModulationATSC( 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( (i_ret = ioctl( p_sys->i_frontend_handle, FE_SET_FRONTEND, &fep )) < 0 ) { msg_Err( p_access, "ATSC: setting frontend failed (%d): %m", i_ret ); return VLC_EGENERIC; } return VLC_SUCCESS;}/* * Demux *//***************************************************************************** * DMXSetFilter : controls the demux to add a filter *****************************************************************************/int 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 (%m)" ); 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 (%m)", i_ret ); return VLC_EGENERIC; } return VLC_SUCCESS;}/***************************************************************************** * DMXUnsetFilter : removes a filter *****************************************************************************/int 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): %m", i_ret ); return i_ret; } msg_Dbg( p_access, "DMXUnsetFilter: closing demux %d", i_fd ); close( i_fd ); return VLC_SUCCESS;}/* * DVR device *//***************************************************************************** * DVROpen : *****************************************************************************/int 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 (%m)" ); return VLC_EGENERIC; } if( fcntl( p_sys->i_handle, F_SETFL, O_NONBLOCK ) == -1 ) { msg_Warn( p_access, "DVROpen: couldn't set non-blocking mode (%m)" ); } return VLC_SUCCESS;}/***************************************************************************** * DVRClose : *****************************************************************************/void DVRClose( access_t * p_access ){ access_sys_t *p_sys = p_access->p_sys; close( p_sys->i_handle );}/* * CAM device *//***************************************************************************** * CAMOpen : *****************************************************************************/int CAMOpen( access_t *p_access ){ access_sys_t *p_sys = p_access->p_sys; char ca[128]; int i_adapter, i_device; 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'; } memset( &caps, 0, sizeof( ca_caps_t )); msg_Dbg( p_access, "Opening device %s", ca ); if( (p_sys->i_ca_handle = open(ca, O_RDWR | O_NONBLOCK)) < 0 ) { msg_Warn( p_access, "CAMInit: opening CAM device failed (%m)" ); p_sys->i_ca_handle = 0; return VLC_EGENERIC; } if ( ioctl( p_sys->i_ca_handle, CA_GET_CAP, &caps ) != 0 ) { msg_Err( p_access, "CAMInit: ioctl() error getting CAM capabilities" ); close( p_sys->i_ca_handle ); p_sys->i_ca_handle = 0; return VLC_EGENERIC; } /* Output CA capabilities */ msg_Dbg( p_access, "CAMInit: CA interface with %d %s", caps.slot_num, caps.slot_num == 1 ? "slot" : "slots" ); if ( caps.slot_type & CA_CI ) msg_Dbg( p_access, "CAMInit: CI high level interface type" ); if ( caps.slot_type & CA_CI_LINK ) msg_Dbg( p_access, "CAMInit: CI link layer level interface type" ); if ( caps.slot_type & CA_CI_PHYS ) msg_Dbg( p_access, "CAMInit: CI physical layer level interface type (not supported) " ); if ( caps.slot_type & CA_DESCR ) msg_Dbg( p_access, "CAMInit: built-in descrambler detected" );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -