📄 access.c
字号:
/***************************************************************************** * access.c: DVB card input v4l2 only ***************************************************************************** * Copyright (C) 1998-2003 VideoLAN * * Authors: Johan Bilien <jobi@via.ecp.fr> * Jean-Paul Saman <jpsaman@wxs.nl> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include <stdio.h>#include <stdlib.h>#include <vlc/vlc.h>#include <vlc/input.h>#include "../../demux/mpeg/system.h"#ifdef HAVE_UNISTD_H# include <unistd.h>#endif#include <fcntl.h>#include <sys/types.h>#ifdef HAVE_ERRNO_H# include <string.h># include <errno.h>#endif#ifdef STRNCASECMP_IN_STRINGS_H# include <strings.h>#endif/* DVB Card Drivers */#include <linux/dvb/dmx.h>#include <linux/dvb/frontend.h>#include "dvb.h"#define SATELLITE_READ_ONCE 3/***************************************************************************** * Local prototypes *****************************************************************************/static ssize_t SatelliteRead( input_thread_t * p_input, byte_t * p_buffer, size_t i_len);static int SatelliteSetArea ( input_thread_t *, input_area_t * );static int SatelliteSetProgram ( input_thread_t *, pgrm_descriptor_t * );static void SatelliteSeek ( input_thread_t *, off_t );/***************************************************************************** * Open: open the frontend device *****************************************************************************/int E_(Open) ( vlc_object_t *p_this ){ struct dvb_frontend_info frontend_info; struct dvb_frontend_parameters fep; input_thread_t * p_input = (input_thread_t *)p_this; input_socket_t * p_satellite; char * psz_parser; char * psz_next; int i_fd = 0; unsigned int u_adapter = 1; unsigned int u_device = 0; unsigned int u_freq = 0; unsigned int u_srate = 0; unsigned int u_lnb_lof1; unsigned int u_lnb_lof2; unsigned int u_lnb_slof; int i_bandwidth = 0; int i_modulation = 0; int i_guard = 0; int i_transmission = 0; int i_hierarchy = 0; int i_polarisation = 0; int i_fec = 0; int i_code_rate_HP = 0; int i_code_rate_LP = 0; vlc_bool_t b_diseqc; vlc_bool_t b_probe; char dvr[] = DVR; char frontend[] = FRONTEND; int i_len = 0; vlc_value_t val; int i_test; /* parse the options passed in command line : */ psz_parser = strdup( p_input->psz_name ); if( !psz_parser ) { return( -1 ); } // Get adapter and device number to use for this dvb card u_adapter = config_GetInt( p_input, "adapter" ); u_device = config_GetInt( p_input, "device" ); /* Get antenna configuration options */ b_diseqc = config_GetInt( p_input, "diseqc" ); u_lnb_lof1 = config_GetInt( p_input, "lnb-lof1" ); u_lnb_lof2 = config_GetInt( p_input, "lnb-lof2" ); u_lnb_slof = config_GetInt( p_input, "lnb-slof" ); /*Get modulation parameters*/ i_bandwidth = config_GetInt( p_input, "bandwidth"); i_code_rate_HP = config_GetInt(p_input, "code-rate-hp"); i_code_rate_LP = config_GetInt(p_input, "code-rate-lp"); i_modulation = config_GetInt(p_input, "modulation"); i_transmission = config_GetInt(p_input, "transmission"); i_guard = config_GetInt(p_input, "guard"); i_hierarchy = config_GetInt(p_input, "hierarchy"); /* Determine frontend device information and capabilities */ b_probe = config_GetInt( p_input, "probe" ); if (b_probe) { if ( ioctl_InfoFrontend(p_input, &frontend_info, u_adapter, u_device) < 0 ) { msg_Err( p_input, "(access) cannot determine frontend info" ); return -1; } } else /* no frontend probing is done so use default border values. */ { msg_Dbg( p_input, "using default values for frontend info" ); i_len = sizeof(FRONTEND); if (snprintf(frontend, sizeof(FRONTEND), FRONTEND, u_adapter, u_device) >= i_len) { msg_Err( p_input, "snprintf() truncated string for FRONTEND" ); frontend[sizeof(FRONTEND)] = '\0'; } strncpy(frontend_info.name, frontend, 128); msg_Dbg(p_input, "method of access is %s", p_input->psz_access); frontend_info.type = FE_QPSK; if (strncmp( p_input->psz_access, "qpsk",4 ) ==0) frontend_info.type = FE_QPSK; else if (strncmp( p_input->psz_access, "cable",5 ) ==0) frontend_info.type = FE_QAM; else if (strncmp( p_input->psz_access, "terrestrial",11) ==0) frontend_info.type = FE_OFDM; frontend_info.frequency_max = u_lnb_lof2; /* in KHz, lnb_lof2 */ frontend_info.frequency_min = u_lnb_lof1; /* lnb_lof1 */ frontend_info.symbol_rate_max = 30000000; frontend_info.symbol_rate_min = 1000000; } /* Register Callback functions */ p_input->pf_read = SatelliteRead; p_input->pf_set_program = SatelliteSetProgram; p_input->pf_set_area = SatelliteSetArea; p_input->pf_seek = SatelliteSeek; i_test = strtol( psz_parser, &psz_next, 10 ); if ( psz_next == psz_parser ) { for ( ;; ) { if( !strncmp( psz_parser, "frequency=", strlen( "frequency=" ) ) ) { u_freq = strtol( psz_parser + strlen( "frequency=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "polarization=", strlen( "polarization=" ) ) ) { char *psz_parser_init; psz_parser += strlen( "polarization=" ); psz_parser_init = psz_parser; while ( *psz_parser != ':') { psz_parser++; } if ((!strncmp( psz_parser_init, "V" , psz_parser - psz_parser_init ) ) || (!strncmp( psz_parser_init, "V" , psz_parser - psz_parser_init ) ) ) { i_polarisation = 0; //VLC_FALSE; } else if ((!strncmp( psz_parser_init, "H" , psz_parser - psz_parser_init ) ) || (!strncmp( psz_parser_init, "h" , psz_parser - psz_parser_init ) ) ) { i_polarisation = 1; //VLC_TRUE; } else if ((!strncmp( psz_parser_init, "A" , psz_parser - psz_parser_init ) ) || (!strncmp( psz_parser_init, "a" , psz_parser - psz_parser_init ) ) ) { i_polarisation = 2; } } else if( !strncmp( psz_parser, "fec=", strlen( "fec=" ) ) ) { i_fec = (int)strtol( psz_parser + strlen( "fec=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "srate=", strlen( "srate=" ) ) ) { u_srate = (unsigned int)strtol( psz_parser + strlen( "srate=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "program=", strlen( "program=" ) ) ) { val.i_int = (int)strtol( psz_parser + strlen( "program=" ), &psz_parser, 0 ); var_Set( p_input, "program", val ); } else if( !strncmp( psz_parser, "diseqc", strlen( "disecq" ) ) ) { psz_parser += strlen("disecq"); b_diseqc = VLC_TRUE; } else if( !strncmp( psz_parser, "lnb-lof1=", strlen( "lnb-lof1=" ) ) ) { u_lnb_lof1 = (unsigned int)strtol( psz_parser + strlen( "lnb-lof1=" ), &psz_parser, 0 ); frontend_info.frequency_min = u_lnb_lof1; /* lnb_lof1 */ } else if( !strncmp( psz_parser, "lnb-lof2=", strlen( "lnb-lof2=" ) ) ) { u_lnb_lof2 = (unsigned int)strtol( psz_parser + strlen( "lnb-lof2=" ), &psz_parser, 0 ); frontend_info.frequency_max = u_lnb_lof2; /* in KHz, lnb_lof2 */ } else if( !strncmp( psz_parser, "lnb-slof=", strlen( "lnb-slof=" ) ) ) { u_lnb_slof = (unsigned int)strtol( psz_parser + strlen( "lnb-slof=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "device=", strlen( "device=" ) ) ) { u_device = (unsigned int)strtol( psz_parser + strlen( "device=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "adapter=", strlen( "adapter=" ) ) ) { u_adapter = (unsigned int)strtol( psz_parser + strlen( "adapter=" ), &psz_parser, 0 ); } else if (!strncmp( psz_parser, "modulation=", strlen( "modulation=" ) ) ) { i_modulation = (int)strtol( psz_parser + strlen( "modulation=" ), &psz_parser, 0 ); } else if (!strncmp( psz_parser, "bandwidth=", strlen( "bandwidth=" ) ) ) { i_bandwidth = (int)strtol( psz_parser + strlen( "bandwidth=" ), &psz_parser, 0 ); } else if (!strncmp( psz_parser, "guard=", strlen( "guard=" ) ) ) { i_guard = (int)strtol( psz_parser + strlen( "guard=" ), &psz_parser, 0 ); } else if (!strncmp( psz_parser, "transmission=", strlen( "transmission=" ) ) ) { i_transmission = (int)strtol( psz_parser + strlen( "transmission=" ),&psz_parser, 0 ); } else if (!strncmp( psz_parser, "hierarchy=", strlen( "hierarchy=" ) ) ) { i_hierarchy = (int)strtol( psz_parser + strlen( "hierarchy=" ),&psz_parser, 0 ); } else if (!strncmp( psz_parser, "code-rate-HP=", strlen( "code-rate-HP=" ) ) ) { i_code_rate_HP = (int)strtol( psz_parser + strlen( "code-rate-HP=" ),&psz_parser, 0 ); } else if (!strncmp( psz_parser, "code-rate-LP=", strlen( "code-rate-LP=" ) ) ) { i_code_rate_LP = (int)strtol( psz_parser + strlen( "code-rate-LP=" ),&psz_parser, 0 ); } else if( !strncmp( psz_parser, "probe", strlen( "probe" ) ) ) { psz_parser += strlen("probe"); b_probe = VLC_TRUE; } if( *psz_parser ) psz_parser++; else break; } } else { msg_Warn(p_input,"DVB Input syntax has changed, please see documentation for further informations"); u_freq = (unsigned int)i_test; if( *psz_next ) { psz_parser = psz_next + 1; i_polarisation = strtol( psz_parser, &psz_next, 10 ); if( *psz_next ) { psz_parser = psz_next + 1; i_fec = (int)strtol( psz_parser, &psz_next, 10 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -