bda.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:23k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * bda.c : BDA access module for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2007-2009 the VideoLAN team
  5.  *
  6.  * Author: Ken Self <kenself(at)optusnet(dot)com(dot)au>
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  21.  *****************************************************************************/
  22. /*****************************************************************************
  23.  * Preamble
  24.  *****************************************************************************/
  25. #ifdef HAVE_CONFIG_H
  26. # include "config.h"
  27. #endif
  28. #include "bda.h"
  29. #include <vlc_plugin.h>
  30. /*****************************************************************************
  31.  * Access: local prototypes
  32.  *****************************************************************************/
  33. static int  Open( vlc_object_t *p_this );
  34. static int  ParsePath( access_t *p_access, const char* psz_module,
  35.     const int i_param_count, const char** psz_param, const int* i_type );
  36. static void Close( vlc_object_t *p_this );
  37. static block_t *Block( access_t * );
  38. static int Control( access_t *, int, va_list );
  39. #define CACHING_TEXT N_("Caching value in ms")
  40. #define CACHING_LONGTEXT N_( 
  41.     "Caching value for DVB streams. This " 
  42.     "value should be set in milliseconds." )
  43. #define ADAPTER_TEXT N_("Adapter card to tune")
  44. #define ADAPTER_LONGTEXT N_("Adapter cards have a device file in directory " 
  45.     "named /dev/dvb/adapter[n] with n>=0.")
  46. #define DEVICE_TEXT N_("Device number to use on adapter")
  47. #define DEVICE_LONGTEXT ""
  48. #define FREQ_TEXT N_("Transponder/multiplex frequency")
  49. #if defined(WIN32) || defined(WINCE)
  50. #    define FREQ_LONGTEXT N_("In kHz for DVB-S or Hz for DVB-C/T")
  51. #else
  52. #    define FREQ_LONGTEXT N_("In kHz for DVB-C/S/T")
  53. #endif
  54. #define INVERSION_TEXT N_("Inversion mode")
  55. #define INVERSION_LONGTEXT N_("Inversion mode [0=off, 1=on, 2=auto]")
  56. static const int i_inversion_list[] = { -1, 0, 1, 2 };
  57. static const char *const ppsz_inversion_text[] = { N_("Undefined"), N_("Off"),
  58.     N_("On"), N_("Auto") };
  59. #define PROBE_TEXT N_("Probe DVB card for capabilities")
  60. #define PROBE_LONGTEXT N_("Some DVB cards do not like to be probed for their " 
  61.     "capabilities, you can disable this feature if you experience some " 
  62.     "trouble.")
  63. #define BUDGET_TEXT N_("Budget mode")
  64. #define BUDGET_LONGTEXT N_("This allows you to stream an entire transponder " 
  65.     "with a "budget" card.")
  66. /* Satellite */
  67. #if defined(WIN32) || defined(WINCE)
  68. #    define NETID_TEXT N_("Network Identifier")
  69. #    define NETID_LONGTEXT ""
  70. #else
  71. #    define SATNO_TEXT N_("Satellite number in the Diseqc system")
  72. #    define SATNO_LONGTEXT N_("[0=no diseqc, 1-4=satellite number].")
  73. #endif
  74. #define VOLTAGE_TEXT N_("LNB voltage")
  75. #define VOLTAGE_LONGTEXT N_("In Volts [0, 13=vertical, 18=horizontal].")
  76. #define HIGH_VOLTAGE_TEXT N_("High LNB voltage")
  77. #define HIGH_VOLTAGE_LONGTEXT N_("Enable high voltage if your cables are " 
  78.     "particularly long. This is not supported by all frontends.")
  79. #define TONE_TEXT N_("22 kHz tone")
  80. #define TONE_LONGTEXT N_("[0=off, 1=on, -1=auto].")
  81. #define FEC_TEXT N_("Transponder FEC")
  82. #define FEC_LONGTEXT N_("FEC=Forward Error Correction mode [9=auto].")
  83. #define SRATE_TEXT N_("Transponder symbol rate in kHz")
  84. #define SRATE_LONGTEXT ""
  85. #define LNB_LOF1_TEXT N_("Antenna lnb_lof1 (kHz)")
  86. #define LNB_LOF1_LONGTEXT N_("Low Band Local Osc Freq in kHz (usually 9.75GHz)")
  87. #define LNB_LOF2_TEXT N_("Antenna lnb_lof2 (kHz)")
  88. #define LNB_LOF2_LONGTEXT N_("High Band Local Osc Freq in kHz (usually 10.6GHz)")
  89. #define LNB_SLOF_TEXT N_("Antenna lnb_slof (kHz)")
  90. #define LNB_SLOF_LONGTEXT N_( 
  91.     "Low Noise Block switch freq in kHz (usually 11.7GHz)")
  92. /* Cable */
  93. #define MODULATION_TEXT N_("Modulation type")
  94. #define MODULATION_LONGTEXT N_("QAM, PSK or VSB modulation method")
  95. static const int i_mod_list[] = { -1, 16, 32, 64, 128, 256,
  96.     10002, 10004, 20008, 20016 };
  97. static const char *const ppsz_mod_text[] = {
  98.     N_("Undefined"), N_("QAM16"), N_("QAM32"), N_("QAM64"), N_("QAM128"), N_("QAM256"),
  99.     N_("BPSK"), N_("QPSK"), N_("8VSB"), N_("16VSB") };
  100. /* ATSC */
  101. #define MAJOR_CHANNEL_TEXT N_("ATSC Major Channel")
  102. #define MAJOR_CHANNEL_LONGTEXT N_("ATSC Major Channel")
  103. #define MINOR_CHANNEL_TEXT N_("ATSC Minor Channel")
  104. #define MINOR_CHANNEL_LONGTEXT N_("ATSC Minor Channel")
  105. #define PHYSICAL_CHANNEL_TEXT N_("ATSC Physical Channel")
  106. #define PHYSICAL_CHANNEL_LONGTEXT N_("ATSC Physical Channel")
  107. /* Terrestrial */
  108. #define CODE_RATE_HP_TEXT N_("FEC rate")
  109. #define CODE_RATE_HP_LONGTEXT N_("FEC rate includes " 
  110.     "DVB-T high priority stream FEC Rate")
  111. static const int i_hp_fec_list[] = { -1, 1, 2, 3, 4, 5 };
  112. static const char *const ppsz_hp_fec_text[] = {
  113.     N_("Undefined"), N_("1/2"), N_("2/3"), N_("3/4"), N_("5/6"), N_("7/8") };
  114. #define CODE_RATE_LP_TEXT N_("Terrestrial low priority stream code rate (FEC)")
  115. #define CODE_RATE_LP_LONGTEXT N_("Low Priority FEC Rate " 
  116.     "[Undefined,1/2,2/3,3/4,5/6,7/8]")
  117. static const int i_lp_fec_list[] = { -1, 1, 2, 3, 4, 5 };
  118. static const char *const ppsz_lp_fec_text[] = {
  119.     N_("Undefined"), N_("1/2"), N_("2/3"), N_("3/4"), N_("5/6"), N_("7/8") };
  120. #define BANDWIDTH_TEXT N_("Terrestrial bandwidth")
  121. #define BANDWIDTH_LONGTEXT N_("Terrestrial bandwidth [0=auto,6,7,8 in MHz]")
  122. static const int i_band_list[] = { -1, 6, 7, 8 };
  123. static const char *const ppsz_band_text[] = {
  124.     N_("Undefined"), N_("6 MHz"), N_("7 MHz"), N_("8 MHz") };
  125. #define GUARD_TEXT N_("Terrestrial guard interval")
  126. #define GUARD_LONGTEXT N_("Guard interval [Undefined,1/4,1/8,1/16,1/32]")
  127. static const int i_guard_list[] = { -1, 4, 8, 16, 32 };
  128. static const char *const ppsz_guard_text[] = {
  129.     N_("Undefined"), N_("1/4"), N_("1/8"), N_("1/16"), N_("1/32") };
  130. #define TRANSMISSION_TEXT N_("Terrestrial transmission mode")
  131. #define TRANSMISSION_LONGTEXT N_("Transmission mode [Undefined,2k,8k]")
  132. static const int i_transmission_list[] = { -1, 2, 8 };
  133. static const char *const ppsz_transmission_text[] = {
  134.     N_("Undefined"), N_("2k"), N_("8k") };
  135. #define HIERARCHY_TEXT N_("Terrestrial hierarchy mode")
  136. #define HIERARCHY_LONGTEXT N_("Hierarchy alpha value [Undefined,1,2,4]")
  137. static const int i_hierarchy_list[] = { -1, 1, 2, 4 };
  138. static const char *const ppsz_hierarchy_text[] = {
  139.     N_("Undefined"), N_("1"), N_("2"), N_("4") };
  140. /* BDA module additional DVB-S Parameters */
  141. #define AZIMUTH_TEXT N_("Satellite Azimuth")
  142. #define AZIMUTH_LONGTEXT N_("Satellite Azimuth in tenths of degree")
  143. #define ELEVATION_TEXT N_("Satellite Elevation")
  144. #define ELEVATION_LONGTEXT N_("Satellite Elevation in tenths of degree")
  145. #define LONGITUDE_TEXT N_("Satellite Longitude")
  146. #define LONGITUDE_LONGTEXT N_( 
  147.     "Satellite Longitude in 10ths of degree, -ve=West")
  148. #define POLARISATION_TEXT N_("Satellite Polarisation")
  149. #define POLARISATION_LONGTEXT N_("Satellite Polarisation [H/V/L/R]")
  150. static const char *const ppsz_polar_list[] = { "H", "V", "L", "R" };
  151. static const char *const ppsz_polar_text[] = {
  152.     N_("Horizontal"), N_("Vertical"),
  153.     N_("Circular Left"), N_("Circular Right") };
  154. #define RANGE_TEXT N_("Satellite Range Code")
  155. #define RANGE_LONGTEXT N_("Satellite Range Code as defined by manufacturer " 
  156.    "e.g. DISEqC switch code")
  157. #define NAME_TEXT N_("Network Name")
  158. #define NAME_LONGTEXT N_("Unique network name in the System Tuning Spaces")
  159. #define CREATE_TEXT N_("Network Name to Create")
  160. #define CREATE_LONGTEXT N_("Create Unique name in the System Tuning Spaces")
  161. vlc_module_begin ()
  162.     set_shortname( N_("DVB") )
  163.     set_description( N_("DirectShow DVB input") )
  164.     set_category( CAT_INPUT )
  165.     set_subcategory( SUBCAT_INPUT_ACCESS )
  166.     add_integer( "dvb-caching", DEFAULT_PTS_DELAY / 1000, NULL, CACHING_TEXT,
  167.                  CACHING_LONGTEXT, true )
  168.         change_safe()
  169.     add_integer( "dvb-frequency", 0, NULL, FREQ_TEXT, FREQ_LONGTEXT,
  170.                  false )
  171. #   if defined(WIN32) || defined(WINCE)
  172.         add_string( "dvb-network-name", NULL, NULL, NAME_TEXT, NAME_LONGTEXT,
  173.                     true )
  174.         add_string( "dvb-create-name", NULL, NULL, CREATE_TEXT,
  175.                     CREATE_LONGTEXT, true )
  176.         add_integer( "dvb-adapter", -1, NULL, ADAPTER_TEXT, ADAPTER_LONGTEXT,
  177.                      true )
  178. #   else
  179.         /* dvb-device refers to a frontend within an adapter */
  180.         add_integer( "dvb-device", 0, NULL, DEVICE_TEXT, DEVICE_LONGTEXT,
  181.                      true )
  182.         add_bool( "dvb-probe", 1, NULL, PROBE_TEXT, PROBE_LONGTEXT, true )
  183.         add_bool( "dvb-budget-mode", 0, NULL, BUDGET_TEXT, BUDGET_LONGTEXT,
  184.                   true )
  185. #   endif
  186.     /* DVB-S (satellite) */
  187.     add_integer( "dvb-inversion", 2, NULL, INVERSION_TEXT,
  188.         INVERSION_LONGTEXT, true )
  189.         change_integer_list( i_inversion_list, ppsz_inversion_text, NULL )
  190. #   if defined(WIN32) || defined(WINCE)
  191.         add_string( "dvb-polarisation", NULL, NULL, POLARISATION_TEXT,
  192.             POLARISATION_LONGTEXT, false )
  193.             change_string_list( ppsz_polar_list, ppsz_polar_text, 0 )
  194.             /* Note: Polaristion H = voltage 18; V = voltage 13; */
  195.         add_integer( "dvb-network-id", 0, NULL, NETID_TEXT, NETID_LONGTEXT,
  196.             true )
  197.         add_integer( "dvb-azimuth", 0, NULL, AZIMUTH_TEXT, AZIMUTH_LONGTEXT,
  198.             true )
  199.         add_integer( "dvb-elevation", 0, NULL, ELEVATION_TEXT,
  200.             ELEVATION_LONGTEXT, true )
  201.         add_integer( "dvb-longitude", 0, NULL, LONGITUDE_TEXT,
  202.             LONGITUDE_LONGTEXT, true )
  203.         add_string( "dvb-range", NULL, NULL, RANGE_TEXT,
  204.             RANGE_LONGTEXT, true )
  205.         /* dvb-range corresponds to the BDA InputRange parameter which is
  206.          * used by some drivers to control the diseqc */
  207. #   else
  208.         add_integer( "dvb-satno", 0, NULL, SATNO_TEXT, SATNO_LONGTEXT,
  209.             true )
  210.         add_integer( "dvb-voltage", 13, NULL, VOLTAGE_TEXT, VOLTAGE_LONGTEXT,
  211.             true )
  212.         add_bool( "dvb-high-voltage", 0, NULL, HIGH_VOLTAGE_TEXT,
  213.             HIGH_VOLTAGE_LONGTEXT, true )
  214.         add_integer( "dvb-tone", -1, NULL, TONE_TEXT, TONE_LONGTEXT,
  215.             true )
  216.         add_integer( "dvb-fec", 9, NULL, FEC_TEXT, FEC_LONGTEXT, true )
  217. #   endif
  218.     add_integer( "dvb-lnb-lof1", 0, NULL, LNB_LOF1_TEXT,
  219.         LNB_LOF1_LONGTEXT, true )
  220.     add_integer( "dvb-lnb-lof2", 0, NULL, LNB_LOF2_TEXT,
  221.         LNB_LOF2_LONGTEXT, true )
  222.     add_integer( "dvb-lnb-slof", 0, NULL, LNB_SLOF_TEXT,
  223.         LNB_SLOF_LONGTEXT, true )
  224.     add_integer( "dvb-srate", 27500, NULL, SRATE_TEXT, SRATE_LONGTEXT,
  225.         false )
  226.     /* DVB-C (cable) */
  227.     add_integer( "dvb-modulation", -1, NULL, MODULATION_TEXT,
  228.         MODULATION_LONGTEXT, true )
  229.         change_integer_list( i_mod_list, ppsz_mod_text, NULL )
  230.     /* ATSC */
  231.     add_integer( "dvb-major-channel", 0, NULL, MAJOR_CHANNEL_TEXT,
  232.         MAJOR_CHANNEL_LONGTEXT, true )
  233.      add_integer( "dvb-minor-channel", 0, NULL, MINOR_CHANNEL_TEXT,
  234.         MINOR_CHANNEL_LONGTEXT, true )
  235.      add_integer( "dvb-physical-channel", 0, NULL, PHYSICAL_CHANNEL_TEXT,
  236.         PHYSICAL_CHANNEL_LONGTEXT, true )
  237.     /* DVB-T (terrestrial) */
  238.     add_integer( "dvb-code-rate-hp", -1, NULL, CODE_RATE_HP_TEXT,
  239.         CODE_RATE_HP_LONGTEXT, true )
  240.         change_integer_list( i_hp_fec_list, ppsz_hp_fec_text, NULL )
  241.     add_integer( "dvb-code-rate-lp", -1, NULL, CODE_RATE_LP_TEXT,
  242.         CODE_RATE_LP_LONGTEXT, true )
  243.         change_integer_list( i_lp_fec_list, ppsz_lp_fec_text, NULL )
  244.     add_integer( "dvb-bandwidth", 0, NULL, BANDWIDTH_TEXT, BANDWIDTH_LONGTEXT,
  245.         false )
  246.         change_integer_list( i_band_list, ppsz_band_text, NULL )
  247.     add_integer( "dvb-guard", -1, NULL, GUARD_TEXT, GUARD_LONGTEXT, true )
  248.         change_integer_list( i_guard_list, ppsz_guard_text, NULL )
  249.     add_integer( "dvb-transmission", -1, NULL, TRANSMISSION_TEXT,
  250.         TRANSMISSION_LONGTEXT, true )
  251.         change_integer_list( i_transmission_list, ppsz_transmission_text, NULL )
  252.     add_integer( "dvb-hierarchy", -1, NULL, HIERARCHY_TEXT, HIERARCHY_LONGTEXT,
  253.         true )
  254.         change_integer_list( i_hierarchy_list, ppsz_hierarchy_text, NULL )
  255.     set_capability( "access", 0 )
  256.     add_shortcut( "dvb" )      /* Generic name */
  257.     add_shortcut( "dvb-s" )    /* Satellite */
  258.     add_shortcut( "dvbs" )
  259.     add_shortcut( "qpsk" )
  260.     add_shortcut( "satellite" )
  261.     add_shortcut( "dvb-c" )    /* Cable */
  262.     add_shortcut( "dvbc" )
  263.     add_shortcut( "qam" )
  264.     add_shortcut( "cable" )
  265.     add_shortcut( "dvbt" )    /* Terrestrial */
  266.     add_shortcut( "dvb-t" )
  267.     add_shortcut( "ofdm" )
  268.     add_shortcut( "terrestrial" )
  269.     add_shortcut( "atsc" )     /* Atsc */
  270.     add_shortcut( "usdigital" )
  271.     set_callbacks( Open, Close )
  272. vlc_module_end ()
  273. /*****************************************************************************
  274.  * Open: open direct show device as an access module
  275.  *****************************************************************************/
  276. static int Open( vlc_object_t *p_this )
  277. {
  278.     access_t     *p_access = (access_t*)p_this;
  279.     access_sys_t *p_sys;
  280.     const char* psz_module  = "dvb";
  281.     const int   i_param_count = 26;
  282.     const char* psz_param[] = { "frequency", "bandwidth",
  283.         "srate", "azimuth", "elevation", "longitude", "polarisation",
  284.         "modulation", "caching", "lnb-lof1", "lnb-lof2", "lnb-slof",
  285.         "inversion", "network-id", "code-rate-hp", "code-rate-lp",
  286.         "guard", "transmission", "hierarchy", "range", "network-name",
  287.         "create-name", "major-channel", "minor-channel", "physical-channel",
  288.         "adapter" };
  289.     const int   i_type[] = { VLC_VAR_INTEGER, VLC_VAR_INTEGER,
  290.         VLC_VAR_INTEGER, VLC_VAR_INTEGER, VLC_VAR_INTEGER, VLC_VAR_INTEGER,
  291.         VLC_VAR_STRING, VLC_VAR_INTEGER, VLC_VAR_INTEGER, VLC_VAR_INTEGER,
  292.         VLC_VAR_INTEGER, VLC_VAR_INTEGER, VLC_VAR_INTEGER, VLC_VAR_INTEGER,
  293.         VLC_VAR_INTEGER, VLC_VAR_INTEGER, VLC_VAR_INTEGER, VLC_VAR_INTEGER,
  294.         VLC_VAR_INTEGER, VLC_VAR_STRING, VLC_VAR_STRING, VLC_VAR_STRING,
  295.         VLC_VAR_INTEGER, VLC_VAR_INTEGER, VLC_VAR_INTEGER, VLC_VAR_INTEGER };
  296.     char  psz_full_name[128];
  297.     int i_ret;
  298.    /* Only if selected */
  299.     if( *p_access->psz_access == '' )
  300.         return VLC_EGENERIC;
  301.     /* Setup Access */
  302.     p_access->pf_read = NULL;
  303.     p_access->pf_block = Block;     /* Function to read compressed data */
  304.     p_access->pf_control = Control; /* Function to control the module */
  305.     p_access->pf_seek = NULL;
  306.     p_access->info.i_update = 0;
  307.     p_access->info.i_size = 0;
  308.     p_access->info.i_pos = 0;
  309.     p_access->info.b_eof = false;
  310.     p_access->info.i_title = 0;
  311.     p_access->info.i_seekpoint = 0;
  312.     p_access->p_sys = p_sys = calloc( 1, sizeof( access_sys_t ) );
  313.     if( !p_sys )
  314.         return VLC_ENOMEM;
  315.     for( int i = 0; i < i_param_count; i++ )
  316.     {
  317.         snprintf( psz_full_name, 128, "%s-%s", psz_module,
  318.                   psz_param[i] );
  319.         var_Create( p_access, psz_full_name, i_type[i] | VLC_VAR_DOINHERIT );
  320.     }
  321.     /* Parse the command line */
  322.     if( ParsePath( p_access, psz_module, i_param_count, psz_param, i_type ) )
  323.     {
  324.         free( p_sys );
  325.         return VLC_EGENERIC;
  326.     }
  327.     /* Build directshow graph */
  328.     dvb_newBDAGraph( p_access );
  329.     i_ret = VLC_EGENERIC;
  330.     if( strncmp( p_access->psz_access, "qpsk", 4 ) == 0 ||
  331.         strncmp( p_access->psz_access, "dvb-s", 5 ) == 0 ||
  332.         strncmp( p_access->psz_access, "dvbs", 4 ) == 0 ||
  333.         strncmp( p_access->psz_access, "satellite", 9 ) == 0 )
  334.     {
  335.         i_ret = dvb_SubmitDVBSTuneRequest( p_access );
  336.     }
  337.     if( strncmp( p_access->psz_access, "cable", 5 ) == 0 ||
  338.         strncmp( p_access->psz_access, "dvb-c", 5 ) == 0  ||
  339.         strncmp( p_access->psz_access, "dvbc", 4 ) == 0  ||
  340.         strncmp( p_access->psz_access, "qam", 3 ) == 0 )
  341.     {
  342.         i_ret = dvb_SubmitDVBCTuneRequest( p_access );
  343.     }
  344.     if( strncmp( p_access->psz_access, "terrestrial", 11 ) == 0 ||
  345.         strncmp( p_access->psz_access, "dvb-t", 5 ) == 0 ||
  346.         strncmp( p_access->psz_access, "ofdm", 4 ) == 0 ||
  347.         strncmp( p_access->psz_access, "dvbt", 4 ) == 0 )
  348.     {
  349.         i_ret = dvb_SubmitDVBTTuneRequest( p_access );
  350.     }
  351.     if( strncmp( p_access->psz_access, "usdigital", 9 ) == 0 ||
  352.         strncmp( p_access->psz_access, "atsc", 4 ) == 0 )
  353.     {
  354.         i_ret = dvb_SubmitATSCTuneRequest( p_access );
  355.     }
  356.     if( !strcmp( p_access->psz_access, "dvb" ) )
  357.     {
  358.         /* Try to auto detect */
  359.         if( i_ret )
  360.             i_ret = dvb_SubmitDVBSTuneRequest( p_access );
  361.         if( i_ret )
  362.             i_ret = dvb_SubmitDVBCTuneRequest( p_access );
  363.         if( i_ret )
  364.             i_ret = dvb_SubmitDVBTTuneRequest( p_access );
  365.         if( i_ret )
  366.             i_ret = dvb_SubmitATSCTuneRequest( p_access );
  367.     }
  368.     if( !i_ret )
  369.         p_access->psz_demux = strdup( "ts" );
  370.     else
  371.         msg_Warn( p_access, "DVB_Open: Unsupported Network %s",
  372.                   p_access->psz_access);
  373.     return i_ret;
  374. }
  375. /*****************************************************************************
  376.  * ParsePath:
  377.  * Parses the path passed to VLC treating it as a MRL which
  378.  * is organized as a sequence of <key>=<value> pairs separated by a colon
  379.  * e.g. :key1=value1:key2=value2:key3=value3.
  380.  * Each <key> is matched to one of the parameters passed in psz_param using
  381.  * whatever characters are provided. e.g. fr = fre = frequency
  382.  *****************************************************************************/
  383. static int ParsePath( access_t *p_access, const char* psz_module,
  384.     const int i_param_count, const char** psz_param, const int* i_type )
  385. {
  386.     const int   MAXPARAM = 40;
  387.     bool        b_used[MAXPARAM];
  388.     char*       psz_parser;
  389.     char*       psz_token;
  390.     char*       psz_value;
  391.     vlc_value_t v_value;
  392.     size_t      i_token_len, i_param_len;
  393.     int         i_this_param;
  394.     char        psz_full_name[128];
  395.     if( i_param_count > MAXPARAM )
  396.     {
  397.         msg_Warn( p_access, "ParsePath: Too many parameters: %d > %d",
  398.             i_param_count, MAXPARAM );
  399.             return VLC_EGENERIC;
  400.     }
  401.     for( int i = 0; i < i_param_count; i++ )
  402.         b_used[i] = false;
  403.     psz_parser = p_access->psz_path;
  404.     if( strlen( psz_parser ) <= 0 )
  405.         return VLC_SUCCESS;
  406.     i_token_len = strcspn( psz_parser, ":" );
  407.     if( i_token_len <= 0 )
  408.         i_token_len  = strcspn( ++psz_parser, ":" );
  409.     do
  410.     {
  411.         psz_token = strndup( psz_parser, i_token_len );
  412.         i_param_len  = strcspn( psz_token, "=" );
  413.         if( i_param_len <= 0 )
  414.         {
  415.             msg_Warn( p_access, "ParsePath: Unspecified parameter %s",
  416.                 psz_token );
  417.             free( psz_token );
  418.             return VLC_EGENERIC;
  419.         }
  420.         i_this_param = -1;
  421.         for( int i = 0; i < i_param_count; i++ )
  422.         {
  423.             if( strncmp( psz_token, psz_param[i], i_param_len ) == 0 )
  424.             {
  425.                 i_this_param = i;
  426.                 break;
  427.             }
  428.         }
  429.         if( i_this_param < 0 )
  430.         {
  431.             msg_Warn( p_access, "ParsePath: Unknown parameter %s", psz_token );
  432.             free( psz_token );
  433.             return VLC_EGENERIC;
  434.         }
  435.         if( b_used[i_this_param] )
  436.         {
  437.             msg_Warn( p_access, "ParsePath: Duplicate parameter %s",
  438.                 psz_token );
  439.             free( psz_token );
  440.             return VLC_EGENERIC;
  441.         }
  442.         b_used[i_this_param] = true;
  443.         /* if "=" was found in token then value starts at
  444.          * psz_token + i_paramlen + 1
  445.          * else there is no value specified so we use an empty string */
  446.         psz_value = psz_token + i_param_len + 1;
  447.         if( i_param_len >= i_token_len )
  448.             psz_value--;
  449.         if( i_type[i_this_param] == VLC_VAR_STRING )
  450.              v_value.psz_string = strdup( psz_value );
  451.         if( i_type[i_this_param] == VLC_VAR_INTEGER )
  452.              v_value.i_int = atol( psz_value );
  453.         snprintf( psz_full_name, 128, "%s-%s", psz_module,
  454.             psz_param[i_this_param] );
  455.         var_Set( p_access, psz_full_name, v_value );
  456.         free( psz_token );
  457.         if( i_token_len >= strlen( psz_parser ) )
  458.             break;
  459.         psz_parser += i_token_len + 1;
  460.         i_token_len = strcspn( psz_parser, ":" );
  461.     }
  462.     while( true );
  463.     return VLC_SUCCESS;
  464. }
  465. /*****************************************************************************
  466.  * AccessClose: close device
  467.  *****************************************************************************/
  468. static void Close( vlc_object_t *p_this )
  469. {
  470.     access_t     *p_access = (access_t *)p_this;
  471.     access_sys_t *p_sys    = p_access->p_sys;
  472.     dvb_deleteBDAGraph( p_access );
  473.     free( p_sys );
  474. }
  475. /*****************************************************************************
  476.  * Control:
  477.  *****************************************************************************/
  478. static int Control( access_t *p_access, int i_query, va_list args )
  479. {
  480.     bool   *pb_bool, b_bool;
  481.     int          i_int;
  482.     int64_t      *pi_64;
  483.     switch( i_query )
  484.     {
  485.     case ACCESS_CAN_SEEK:           /* 0 */
  486.     case ACCESS_CAN_FASTSEEK:       /* 1 */
  487.     case ACCESS_CAN_PAUSE:          /* 2 */
  488.     case ACCESS_CAN_CONTROL_PACE:   /* 3 */
  489.         pb_bool = (bool*)va_arg( args, bool* );
  490.         *pb_bool = false;
  491.         break;
  492.     case ACCESS_GET_PTS_DELAY:      /* 5 */
  493.         pi_64 = (int64_t*)va_arg( args, int64_t * );
  494.         *pi_64 = var_GetInteger( p_access, "dvb-caching" ) * 1000;
  495.         break;
  496.         /* */
  497.     case ACCESS_GET_TITLE_INFO:     /* 6 */
  498.     case ACCESS_GET_META:           /* 7 */
  499.     case ACCESS_SET_PAUSE_STATE:    /* 8 */
  500.     case ACCESS_SET_TITLE:          /* 9 */
  501.     case ACCESS_SET_SEEKPOINT:      /* 10 */
  502.     case ACCESS_GET_CONTENT_TYPE:
  503.         return VLC_EGENERIC;
  504.     case ACCESS_SET_PRIVATE_ID_STATE: /* 11 */
  505.         i_int  = (int)va_arg( args, int );
  506.         b_bool = (bool)va_arg( args, int );
  507.         break;
  508.     case ACCESS_SET_PRIVATE_ID_CA:  /* 12 -From Demux */
  509.         break;
  510.     default:
  511.         msg_Warn( p_access,
  512.                   "DVB_Control: Unimplemented query in control %d", i_query );
  513.         return VLC_EGENERIC;
  514.     }
  515.     return VLC_SUCCESS;
  516. }
  517. /*****************************************************************************
  518.  * Block:
  519.  *****************************************************************************/
  520. static block_t *Block( access_t *p_access )
  521. {
  522.     return dvb_Pop( p_access );
  523. }