📄 access.c
字号:
msg_Dbg( p_input, "opening DVR device `%s'", psz_dvr ); if( (p_satellite->i_handle = open( psz_dvr, /*O_NONBLOCK | O_LARGEFILE*/0 )) == (-1) ) { msg_Warn( p_input, "cannot open `%s' (%s)", psz_dvr, strerror(errno) ); free( p_satellite ); return -1; } /* FIXME : this is from the Dreambox port. I have no idea whether it * hurts or helps other DVB interfaces, so I just leave it here. * Feel free to remove it if it breaks. --Meuuh */ ioctl_SetBufferSize( p_satellite->i_handle, DMX_BUFFER_SIZE ); /* Get antenna configuration options */ b_diseqc = config_GetInt( p_input, "diseqc" ); i_lnb_lof1 = config_GetInt( p_input, "lnb-lof1" ); i_lnb_lof2 = config_GetInt( p_input, "lnb-lof2" ); i_lnb_slof = config_GetInt( p_input, "lnb-slof" ); /* Initialize the Satellite Card */ if ( i_freq ) { int i_tuner = config_GetInt( p_input, "dvb-tuner" ); msg_Dbg( p_input, "initializing Sat Card with Freq: %d, Pol: %d, " "FEC: %03f, Srate: %d", i_freq, b_pol, f_fec, i_srate ); if ( ioctl_SECControl( i_tuner, i_freq, b_pol, i_lnb_slof, b_diseqc ) < 0 ) { msg_Err( p_input, "an error occurred when controling SEC" ); close( p_satellite->i_handle ); free( p_satellite ); return -1; } msg_Dbg( p_input, "initializing frontend device" ); switch (ioctl_SetQPSKFrontend ( i_tuner, i_freq, i_srate, f_fec, i_lnb_lof1, i_lnb_lof2, i_lnb_slof)) { case -2: msg_Err( p_input, "frontend returned an unexpected event" ); close( p_satellite->i_handle ); free( p_satellite ); return -1; break; case -3: msg_Err( p_input, "frontend returned no event" ); close( p_satellite->i_handle ); free( p_satellite ); return -1; break; case -4: msg_Err( p_input, "frontend: timeout when polling for event" ); close( p_satellite->i_handle ); free( p_satellite ); return -1; break; case -5: msg_Err( p_input, "an error occured when polling frontend device" ); close( p_satellite->i_handle ); free( p_satellite ); return -1; break; case -1: msg_Err( p_input, "frontend returned a failure event" ); close( p_satellite->i_handle ); free( p_satellite ); return -1; break; default: break; } } /* i_freq */ msg_Dbg( p_input, "setting filter on PAT" ); AllocateDemux( p_input, 0, PAT_TYPE ); if( input_InitStream( p_input, sizeof( stream_ts_data_t ) ) == -1 ) { msg_Err( p_input, "could not initialize stream structure" ); close( p_satellite->i_handle ); free( p_satellite ); return( -1 ); } vlc_mutex_lock( &p_input->stream.stream_lock ); p_input->stream.b_pace_control = 1; p_input->stream.b_seekable = 0; p_input->stream.p_selected_area->i_tell = 0; vlc_mutex_unlock( &p_input->stream.stream_lock ); p_input->i_mtu = SATELLITE_READ_ONCE; p_input->stream.i_method = INPUT_METHOD_SATELLITE; return 0;}/***************************************************************************** * Close : Close the device *****************************************************************************/void E_(Close) ( vlc_object_t *p_this ){ input_thread_t * p_input = (input_thread_t *)p_this; thread_sat_data_t * p_satellite = (thread_sat_data_t *)p_input->p_access_data; msg_Dbg( p_input, "unsetting filters on all pids" ); CloseProgram( p_input ); close( p_satellite->p_demux_handles[0].i_handle ); close( p_satellite->i_handle );}/***************************************************************************** * SatelliteRead: reads data from the satellite card *****************************************************************************/static ssize_t SatelliteRead( input_thread_t * p_input, byte_t * p_buffer, size_t i_len ){ thread_sat_data_t * p_satellite = (thread_sat_data_t *)p_input->p_access_data; ssize_t i_ret; unsigned int i; /* if not set, set filters to the PMTs */ /* This is kludgy and consumes way too much CPU power - the access * module should have a callback from the demux when a new program * is encountered. --Meuuh */ if ( !p_satellite->p_demux_handles[1].i_type ) { int i_program = config_GetInt( p_input, "program" ); for( i = 0; i < p_input->stream.i_pgrm_number; i++ ) { /* Only set a filter on the selected program : some boards * (read: Dreambox) only have 8 filters, so you don't want to * spend them on unwanted PMTs. --Meuuh */ if ( (!i_program || p_input->stream.pp_programs[i]->i_number == i_program) ) { msg_Dbg( p_input, "setting filter on PMT pid %d", p_input->stream.pp_programs[i]->pp_es[0]->i_id ); AllocateDemux( p_input, p_input->stream.pp_programs[i]->pp_es[0]->i_id, PMT_TYPE ); } } } i_ret = read( p_satellite->i_handle, p_buffer, i_len ); if( i_ret < 0 ) {# ifdef HAVE_ERRNO_H msg_Err( p_input, "read failed (%s)", strerror(errno) );# else msg_Err( p_input, "read failed" );# endif } return i_ret;}/***************************************************************************** * SatelliteSetArea : Does nothing *****************************************************************************/static int SatelliteSetArea( input_thread_t * p_input, input_area_t * p_area ){ return -1;}/***************************************************************************** * SatelliteSetProgram : Sets the card filters according to the * selected program, * and makes the appropriate changes to stream structure. *****************************************************************************/int SatelliteSetProgram( input_thread_t * p_input, pgrm_descriptor_t * p_new_prg ){ unsigned int i_es_index; vlc_value_t val; if ( p_input->stream.p_selected_program ) { for ( i_es_index = 0 ; /* 0 should be the PMT */ i_es_index < p_input->stream.p_selected_program-> i_es_number ; i_es_index ++ ) {#define p_es p_input->stream.p_selected_program->pp_es[i_es_index] if ( p_es->p_dec ) { input_UnselectES( p_input , p_es ); }#undef p_es } } msg_Dbg( p_input, "unsetting filters on all pids" ); CloseProgram( p_input ); msg_Dbg( p_input, "setting filter on PMT pid %d", p_new_prg->pp_es[0]->i_id ); AllocateDemux( p_input, p_new_prg->pp_es[0]->i_id, PMT_TYPE ); for ( i_es_index = 1 ; i_es_index < p_new_prg->i_es_number ; i_es_index ++ ) {#define p_es p_new_prg->pp_es[i_es_index] switch( p_es->i_cat ) { case VIDEO_ES: msg_Dbg(p_input, "setting filter on video ES 0x%x", p_es->i_id); /* Always set the filter. This may seem a little odd, but * it allows you to stream the video with demuxstream * without having a decoder or a stream output behind. * The result is you'll sometimes filter a PID which you * don't really want, but in the most common cases it * should be OK. --Meuuh */ AllocateDemux( p_input, p_es->i_id, ES_TYPE ); input_SelectES( p_input , p_es ); break; case AUDIO_ES: msg_Dbg(p_input, "setting filter on audio ES 0x%x", p_es->i_id); AllocateDemux( p_input, p_es->i_id, ES_TYPE ); input_SelectES( p_input , p_es ); break; default: /* Do not select private streams. This is to avoid the * limit of 8 filters on the Dreambox and possibly on * other boards. We should probably change that to * have the DVB subtitles, but filtering all private * streams including DVB tables and padding seems * nonsense to me. --Meuuh */#if 0 msg_Dbg(p_input, "setting filter on misc (0x%x) ES 0x%x", p_es->i_cat, p_es->i_id); AllocateDemux( p_input, p_es->i_id, ES_TYPE ); input_SelectES( p_input , p_es );#endif break;#undef p_es } } p_input->stream.p_selected_program = p_new_prg; /* Update the navigation variables without triggering a callback */ val.i_int = p_new_prg->i_number; var_Change( p_input, "program", VLC_VAR_SETVALUE, &val, NULL ); return 0;}/***************************************************************************** * SatelliteSeek: does nothing (not a seekable stream *****************************************************************************/static void SatelliteSeek( input_thread_t * p_input, off_t i_off ){ ;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -