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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * pvr.c
  3.  *****************************************************************************
  4.  * Copyright (C) 2001, 2002 the VideoLAN team
  5.  * $Id: 70d0127afe6802cb6eebf26f4aeb724ebcc40e74 $
  6.  *
  7.  * Authors: Eric Petit <titer@videolan.org>
  8.  *          Paul Corke <paulc@datatote.co.uk>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * Preamble
  26.  *****************************************************************************/
  27. #ifdef HAVE_CONFIG_H
  28. # include "config.h"
  29. #endif
  30. #include <vlc_common.h>
  31. #include <vlc_plugin.h>
  32. #include <vlc_access.h>
  33. #include <sys/types.h>
  34. #include <sys/stat.h>
  35. #include <fcntl.h>
  36. #include <unistd.h>
  37. #include <errno.h>
  38. #include <linux/types.h>
  39. #include <sys/ioctl.h>
  40. #include <sys/poll.h>
  41. #ifdef HAVE_NEW_LINUX_VIDEODEV2_H
  42. #   ifdef VIDEODEV2_H_FILE
  43. #   include VIDEODEV2_H_FILE
  44. #   else
  45. #   include <linux/videodev2.h>
  46. #   endif
  47. #else
  48. #include "videodev2.h"
  49. #endif
  50. /*****************************************************************************
  51.  * Module descriptor
  52.  *****************************************************************************/
  53. static int  Open ( vlc_object_t * );
  54. static void Close( vlc_object_t * );
  55. #define CACHING_TEXT N_("Caching value in ms")
  56. #define CACHING_LONGTEXT N_( 
  57.     "Default caching value for PVR streams. This " 
  58.     "value should be set in milliseconds." )
  59. #define DEVICE_TEXT N_( "Device" )
  60. #define DEVICE_LONGTEXT N_( "PVR video device" )
  61. #define RADIO_DEVICE_TEXT N_( "Radio device" )
  62. #define RADIO_DEVICE_LONGTEXT N_( "PVR radio device" )
  63. #define NORM_TEXT N_( "Norm" )
  64. #define NORM_LONGTEXT N_( "Norm of the stream " 
  65.     "(Automatic, SECAM, PAL, or NTSC)." )
  66. #define WIDTH_TEXT N_( "Width" )
  67. #define WIDTH_LONGTEXT N_( "Width of the stream to capture " 
  68.     "(-1 for autodetection)." )
  69. #define HEIGHT_TEXT N_( "Height" )
  70. #define HEIGHT_LONGTEXT N_( "Height of the stream to capture " 
  71.     "(-1 for autodetection)." )
  72. #define FREQUENCY_TEXT N_( "Frequency" )
  73. #define FREQUENCY_LONGTEXT N_( "Frequency to capture (in kHz), if applicable." )
  74. #define FRAMERATE_TEXT N_( "Framerate" )
  75. #define FRAMERATE_LONGTEXT N_( "Framerate to capture, if applicable " 
  76.     "(-1 for autodetect)." )
  77. #define KEYINT_TEXT N_( "Key interval" )
  78. #define KEYINT_LONGTEXT N_( "Interval between keyframes (-1 for autodetect)." )
  79. #define BFRAMES_TEXT N_( "B Frames" )
  80. #define BFRAMES_LONGTEXT N_("If this option is set, B-Frames will be used. " 
  81.     "Use this option to set the number of B-Frames.")
  82. #define BITRATE_TEXT N_( "Bitrate" )
  83. #define BITRATE_LONGTEXT N_( "Bitrate to use (-1 for default)." )
  84. #define BITRATE_PEAK_TEXT N_( "Bitrate peak" )
  85. #define BITRATE_PEAK_LONGTEXT N_( "Peak bitrate in VBR mode." )
  86. #define BITRATE_MODE_TEXT N_( "Bitrate mode" )
  87. #define BITRATE_MODE_LONGTEXT N_( "Bitrate mode to use (VBR or CBR)." )
  88. #define BITMASK_TEXT N_( "Audio bitmask" )
  89. #define BITMASK_LONGTEXT N_("Bitmask that will "
  90.     "get used by the audio part of the card." )
  91. #define VOLUME_TEXT N_( "Volume" )
  92. #define VOLUME_LONGTEXT N_("Audio volume (0-65535)." )
  93. #define CHAN_TEXT N_( "Channel" )
  94. #define CHAN_LONGTEXT N_( "Channel of the card to use (Usually, 0 = tuner, " 
  95.     "1 = composite, 2 = svideo)" )
  96. static const int i_norm_list[] =
  97.     { V4L2_STD_UNKNOWN, V4L2_STD_SECAM, V4L2_STD_PAL, V4L2_STD_NTSC };
  98. static const char *const psz_norm_list_text[] =
  99.     { N_("Automatic"), N_("SECAM"), N_("PAL"),  N_("NTSC") };
  100. static const int i_bitrates[] = { 0, 1 };
  101. static const char *const psz_bitrates_list_text[] = { N_("vbr"), N_("cbr") };
  102. static const int pi_radio_range[2] = { 65000, 108000 };
  103. vlc_module_begin ()
  104.     set_shortname( N_("PVR") )
  105.     set_description( N_("IVTV MPEG Encoding cards input") )
  106.     set_category( CAT_INPUT )
  107.     set_subcategory( SUBCAT_INPUT_ACCESS )
  108.     set_capability( "access", 0 )
  109.     add_shortcut( "pvr" )
  110.     add_integer( "pvr-caching", DEFAULT_PTS_DELAY / 1000, NULL, CACHING_TEXT,
  111.                  CACHING_LONGTEXT, true )
  112.     add_string( "pvr-device", "/dev/video0", NULL, DEVICE_TEXT,
  113.                  DEVICE_LONGTEXT, false )
  114.     add_string( "pvr-radio-device", "/dev/radio0", NULL, RADIO_DEVICE_TEXT,
  115.                  RADIO_DEVICE_LONGTEXT, false )
  116.     add_integer( "pvr-norm", V4L2_STD_UNKNOWN , NULL, NORM_TEXT,
  117.                  NORM_LONGTEXT, false )
  118.        change_integer_list( i_norm_list, psz_norm_list_text, NULL )
  119.     add_integer( "pvr-width", -1, NULL, WIDTH_TEXT, WIDTH_LONGTEXT, true )
  120.     add_integer( "pvr-height", -1, NULL, HEIGHT_TEXT, HEIGHT_LONGTEXT,
  121.                  true )
  122.     add_integer( "pvr-frequency", -1, NULL, FREQUENCY_TEXT, FREQUENCY_LONGTEXT,
  123.                  false )
  124.     add_integer( "pvr-framerate", -1, NULL, FRAMERATE_TEXT, FRAMERATE_LONGTEXT,
  125.                  true )
  126.     add_integer( "pvr-keyint", -1, NULL, KEYINT_TEXT, KEYINT_LONGTEXT,
  127.                  true )
  128.     add_integer( "pvr-bframes", -1, NULL, FRAMERATE_TEXT, FRAMERATE_LONGTEXT,
  129.                  true )
  130.     add_integer( "pvr-bitrate", -1, NULL, BITRATE_TEXT, BITRATE_LONGTEXT,
  131.                  false )
  132.     add_integer( "pvr-bitrate-peak", -1, NULL, BITRATE_PEAK_TEXT,
  133.                  BITRATE_PEAK_LONGTEXT, true )
  134.     add_integer( "pvr-bitrate-mode", -1, NULL, BITRATE_MODE_TEXT,
  135.                  BITRATE_MODE_LONGTEXT, true )
  136.         change_integer_list( i_bitrates, psz_bitrates_list_text, NULL )
  137.     add_integer( "pvr-audio-bitmask", -1, NULL, BITMASK_TEXT,
  138.                  BITMASK_LONGTEXT, true )
  139.     add_integer( "pvr-audio-volume", -1, NULL, VOLUME_TEXT,
  140.                  VOLUME_LONGTEXT, true )
  141.     add_integer( "pvr-channel", -1, NULL, CHAN_TEXT, CHAN_LONGTEXT, true )
  142.     set_callbacks( Open, Close )
  143. vlc_module_end ()
  144. /*****************************************************************************
  145.  * Prototypes
  146.  *****************************************************************************/
  147. static ssize_t Read   ( access_t *, uint8_t *, size_t );
  148. static int Control( access_t *, int, va_list );
  149. /* ivtv specific ioctls */
  150. #define IVTV_IOC_G_CODEC    0xFFEE7703
  151. #define IVTV_IOC_S_CODEC    0xFFEE7704
  152. /* for use with IVTV_IOC_G_CODEC and IVTV_IOC_S_CODEC */
  153. struct ivtv_ioctl_codec {
  154.     uint32_t aspect;
  155.     uint32_t audio_bitmask;
  156.     uint32_t bframes;
  157.     uint32_t bitrate_mode;
  158.     uint32_t bitrate;
  159.     uint32_t bitrate_peak;
  160.     uint32_t dnr_mode;
  161.     uint32_t dnr_spatial;
  162.     uint32_t dnr_temporal;
  163.     uint32_t dnr_type;
  164.     uint32_t framerate;
  165.     uint32_t framespergop;
  166.     uint32_t gop_closure;
  167.     uint32_t pulldown;
  168.     uint32_t stream_type;
  169. };
  170. struct access_sys_t
  171. {
  172.     /* file descriptor */
  173.     int i_fd;
  174.     int i_radio_fd;
  175.     char *psz_videodev;
  176.     char *psz_radiodev;
  177.     /* options */
  178.     int i_standard;
  179.     int i_width;
  180.     int i_height;
  181.     int i_frequency;
  182.     int i_framerate;
  183.     int i_keyint;
  184.     int i_bframes;
  185.     int i_bitrate;
  186.     int i_bitrate_peak;
  187.     int i_bitrate_mode;
  188.     int i_audio_bitmask;
  189.     int i_input;
  190.     int i_volume;
  191.     /* driver version */
  192.     bool b_v4l2_api;
  193. };
  194. /*****************************************************************************
  195.  * ConfigureIVTV: set up codec parameters using the old ivtv api
  196.  *****************************************************************************/
  197. static int ConfigureIVTV( access_t * p_access )
  198. {
  199.     access_sys_t *p_sys = (access_sys_t *) p_access->p_sys;
  200.     struct ivtv_ioctl_codec codec;
  201.     int result;
  202.     memset( &codec, 0, sizeof(struct ivtv_ioctl_codec) );
  203.     result = ioctl( p_sys->i_fd, IVTV_IOC_G_CODEC, &codec );
  204.     if( result < 0 )
  205.     {
  206.         msg_Err( p_access, "Failed to read current capture card settings." );
  207.         return VLC_EGENERIC;
  208.     }
  209.     if( p_sys->i_framerate != -1 )
  210.     {
  211.         switch( p_sys->i_framerate )
  212.         {
  213.             case 30:
  214.                 codec.framerate = 0;
  215.                 break;
  216.             case 25:
  217.                 codec.framerate = 1;
  218.                 break;
  219.             default:
  220.                 msg_Warn( p_access, "Invalid framerate, reverting to 25." );
  221.                 codec.framerate = 1;
  222.                 break;
  223.         }
  224.     }
  225.     if( p_sys->i_bitrate != -1 )
  226.     {
  227.         codec.bitrate = p_sys->i_bitrate;
  228.     }
  229.     if( p_sys->i_bitrate_peak != -1 )
  230.     {
  231.         codec.bitrate_peak = p_sys->i_bitrate_peak;
  232.     }
  233.     if( p_sys->i_bitrate_mode != -1 )
  234.     {
  235.         codec.bitrate_mode = p_sys->i_bitrate_mode;
  236.     }
  237.     if( p_sys->i_audio_bitmask != -1 )
  238.     {
  239.         codec.audio_bitmask = p_sys->i_audio_bitmask;
  240.     }
  241.     if( p_sys->i_keyint != -1 )
  242.     {
  243.         codec.framespergop = p_sys->i_keyint;
  244.     }
  245.     if( p_sys->i_bframes != -1 )
  246.     {
  247.         codec.bframes = p_sys->i_bframes;
  248.     }
  249.     result = ioctl( p_sys->i_fd, IVTV_IOC_S_CODEC, &codec );
  250.     if( result  < 0 )
  251.     {
  252.         msg_Err( p_access, "Failed to write new capture card settings." );
  253.         return VLC_EGENERIC;
  254.     }
  255.     msg_Dbg( p_access, "Setting codec parameters to:  framerate: "
  256.                         "%d, bitrate: %d/%d/%d",
  257.                         codec.framerate, codec.bitrate,
  258.                         codec.bitrate_peak, codec.bitrate_mode );
  259.     return VLC_SUCCESS;
  260. }
  261. #ifdef HAVE_NEW_LINUX_VIDEODEV2_H
  262. #define MAX_V4L2_CTRLS (6)
  263. /*****************************************************************************
  264.  * AddV4L2Ctrl: adds a control to the v4l2 controls list
  265.  *****************************************************************************/
  266. static void AddV4L2Ctrl( access_t * p_access,
  267.                          struct v4l2_ext_controls * p_controls,
  268.                          uint32_t i_id, uint32_t i_value )
  269. {
  270.     if( p_controls->count >= MAX_V4L2_CTRLS )
  271.     {
  272.         msg_Err( p_access, "Tried to set too many v4l2 controls at once." );
  273.         return;
  274.     }
  275.     p_controls->controls[p_controls->count].id    = i_id;
  276.     p_controls->controls[p_controls->count].value = i_value;
  277.     p_controls->count++;
  278. }
  279. /*****************************************************************************
  280.  * V4L2SampleRate: calculate v4l2 sample rate from pvr-audio-bitmask
  281.  *****************************************************************************/
  282. static uint32_t V4L2SampleRate( uint32_t i_bitmask )
  283. {
  284.     switch( i_bitmask & 0x0003 )
  285.     {
  286.         case 0x0001: return V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000;
  287.         case 0x0002: return V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000;
  288.     }
  289.     return V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100;
  290. }
  291. /*****************************************************************************
  292.  * V4L2AudioEncoding: calculate v4l2 audio encoding level from pvr-audio-bitmask
  293.  *****************************************************************************/
  294. static uint32_t V4L2AudioEncoding( uint32_t i_bitmask )
  295. {
  296.     switch( i_bitmask & 0x000c )
  297.     {
  298.         case 0x0004: return V4L2_MPEG_AUDIO_ENCODING_LAYER_1;
  299.         case 0x0008: return V4L2_MPEG_AUDIO_ENCODING_LAYER_2;
  300.     }
  301.     return 0xffffffff;
  302. }
  303. /*****************************************************************************
  304.  * V4L2AudioL1Bitrate: calculate v4l2 audio bitrate for layer-1 audio from pvr-audio-bitmask
  305.  *****************************************************************************/
  306. static uint32_t V4L2AudioL1Bitrate( uint32_t i_bitmask )
  307. {
  308.     switch( i_bitmask & 0x00f0 )
  309.     {
  310.         case 0x0010: return V4L2_MPEG_AUDIO_L1_BITRATE_32K;
  311.         case 0x0020: return V4L2_MPEG_AUDIO_L1_BITRATE_64K;
  312.         case 0x0030: return V4L2_MPEG_AUDIO_L1_BITRATE_96K;
  313.         case 0x0040: return V4L2_MPEG_AUDIO_L1_BITRATE_128K;
  314.         case 0x0050: return V4L2_MPEG_AUDIO_L1_BITRATE_160K;
  315.         case 0x0060: return V4L2_MPEG_AUDIO_L1_BITRATE_192K;
  316.         case 0x0070: return V4L2_MPEG_AUDIO_L1_BITRATE_224K;
  317.         case 0x0080: return V4L2_MPEG_AUDIO_L1_BITRATE_256K;
  318.         case 0x0090: return V4L2_MPEG_AUDIO_L1_BITRATE_288K;
  319.         case 0x00a0: return V4L2_MPEG_AUDIO_L1_BITRATE_320K;
  320.         case 0x00b0: return V4L2_MPEG_AUDIO_L1_BITRATE_352K;
  321.         case 0x00c0: return V4L2_MPEG_AUDIO_L1_BITRATE_384K;
  322.         case 0x00d0: return V4L2_MPEG_AUDIO_L1_BITRATE_416K;
  323.         case 0x00e0: return V4L2_MPEG_AUDIO_L1_BITRATE_448K;
  324.     }
  325.     return V4L2_MPEG_AUDIO_L1_BITRATE_320K;
  326. }
  327. /*****************************************************************************
  328.  * V4L2AudioL2Bitrate: calculate v4l2 audio bitrate for layer-1 audio from pvr-audio-bitmask
  329.  *****************************************************************************/
  330. static uint32_t V4L2AudioL2Bitrate( uint32_t i_bitmask )
  331. {
  332.     switch( i_bitmask & 0x00f0 )
  333.     {
  334.         case 0x0010: return V4L2_MPEG_AUDIO_L2_BITRATE_32K;
  335.         case 0x0020: return V4L2_MPEG_AUDIO_L2_BITRATE_48K;
  336.         case 0x0030: return V4L2_MPEG_AUDIO_L2_BITRATE_56K;
  337.         case 0x0040: return V4L2_MPEG_AUDIO_L2_BITRATE_64K;
  338.         case 0x0050: return V4L2_MPEG_AUDIO_L2_BITRATE_80K;
  339.         case 0x0060: return V4L2_MPEG_AUDIO_L2_BITRATE_96K;
  340.         case 0x0070: return V4L2_MPEG_AUDIO_L2_BITRATE_112K;
  341.         case 0x0080: return V4L2_MPEG_AUDIO_L2_BITRATE_128K;
  342.         case 0x0090: return V4L2_MPEG_AUDIO_L2_BITRATE_160K;
  343.         case 0x00a0: return V4L2_MPEG_AUDIO_L2_BITRATE_192K;
  344.         case 0x00b0: return V4L2_MPEG_AUDIO_L2_BITRATE_224K;
  345.         case 0x00c0: return V4L2_MPEG_AUDIO_L2_BITRATE_256K;
  346.         case 0x00d0: return V4L2_MPEG_AUDIO_L2_BITRATE_320K;
  347.         case 0x00e0: return V4L2_MPEG_AUDIO_L2_BITRATE_384K;
  348.     }
  349.     return V4L2_MPEG_AUDIO_L2_BITRATE_192K;
  350. }
  351. /*****************************************************************************
  352.  * V4L2AudioMode: calculate v4l2 audio mode from pvr-audio-bitmask
  353.  *****************************************************************************/
  354. static uint32_t V4L2AudioMode( uint32_t i_bitmask )
  355. {
  356.     switch( i_bitmask & 0x0300 )
  357.     {
  358.         case 0x0100: return V4L2_MPEG_AUDIO_MODE_JOINT_STEREO;
  359.         case 0x0200: return V4L2_MPEG_AUDIO_MODE_DUAL;
  360.         case 0x0300: return V4L2_MPEG_AUDIO_MODE_MONO;
  361.     }
  362.     return V4L2_MPEG_AUDIO_MODE_STEREO;
  363. }
  364. /*****************************************************************************
  365.  * ConfigureV4L2: set up codec parameters using the new v4l2 api
  366.  *****************************************************************************/
  367. static int ConfigureV4L2( access_t * p_access )
  368. {
  369.     access_sys_t *p_sys = (access_sys_t *) p_access->p_sys;
  370.     struct v4l2_ext_controls controls;
  371.     int result;
  372.     memset( &controls, 0, sizeof(struct v4l2_ext_controls) );
  373.     controls.ctrl_class  = V4L2_CTRL_CLASS_MPEG;
  374.     controls.error_idx   = 0;
  375.     controls.reserved[0] = 0;
  376.     controls.reserved[1] = 0;
  377.     controls.count       = 0;
  378.     controls.controls    = calloc( MAX_V4L2_CTRLS,
  379.                                    sizeof( struct v4l2_ext_control ) );
  380.     if( controls.controls == NULL )
  381.         return VLC_ENOMEM;
  382.     /* Note: Ignore frame rate.  Doesn't look like it can be changed. */
  383.     if( p_sys->i_bitrate != -1 )
  384.     {
  385.         AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_VIDEO_BITRATE,
  386.                      p_sys->i_bitrate );
  387.         msg_Dbg( p_access, "Setting [%u] bitrate = %u",
  388.                  controls.count - 1, p_sys->i_bitrate );
  389.     }
  390.     if( p_sys->i_bitrate_peak != -1 )
  391.     {
  392.         AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
  393.                      p_sys->i_bitrate_peak );
  394.         msg_Dbg( p_access, "Setting [%u] bitrate_peak = %u",
  395.                  controls.count - 1, p_sys->i_bitrate_peak );
  396.     }
  397.     if( p_sys->i_bitrate_mode != -1 )
  398.     {
  399.         AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
  400.                      p_sys->i_bitrate_mode );
  401.         msg_Dbg( p_access, "Setting [%u] bitrate_mode = %u",
  402.                  controls.count - 1, p_sys->i_bitrate_mode );
  403.     }
  404.     if( p_sys->i_audio_bitmask != -1 )
  405.     {
  406.         /* Sample rate */
  407.         AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
  408.                     V4L2SampleRate( p_sys->i_audio_bitmask ) );
  409.         /* Encoding layer and bitrate */
  410.         switch( V4L2AudioEncoding( p_sys->i_audio_bitmask ) )
  411.         {
  412.             case V4L2_MPEG_AUDIO_ENCODING_LAYER_1:
  413.                  AddV4L2Ctrl( p_access, &controls,
  414.                               V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
  415.                               V4L2_MPEG_AUDIO_ENCODING_LAYER_1 );
  416.                  AddV4L2Ctrl( p_access, &controls,
  417.                               V4L2_CID_MPEG_AUDIO_L1_BITRATE,
  418.                               V4L2AudioL1Bitrate( p_sys->i_audio_bitmask ) );
  419.                  break;
  420.             case V4L2_MPEG_AUDIO_ENCODING_LAYER_2:
  421.                  AddV4L2Ctrl( p_access, &controls,
  422.                               V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
  423.                               V4L2_MPEG_AUDIO_ENCODING_LAYER_2 );
  424.                  AddV4L2Ctrl( p_access, &controls,
  425.                               V4L2_CID_MPEG_AUDIO_L2_BITRATE,
  426.                               V4L2AudioL2Bitrate( p_sys->i_audio_bitmask ) );
  427.                  break;
  428.         }
  429.         /* Audio mode - stereo or mono */
  430.         AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_AUDIO_MODE,
  431.                      V4L2AudioMode( p_sys->i_audio_bitmask ) );
  432.         /* See if the user wants any other audio feature */
  433.         if( ( p_sys->i_audio_bitmask & 0x1ff00 ) != 0 )
  434.         {
  435.             /* It would be possible to support the bits that represent:
  436.              *   V4L2_CID_MPEG_AUDIO_MODE_EXTENSION
  437.              *   V4L2_CID_MPEG_AUDIO_EMPHASIS
  438.              *   V4L2_CID_MPEG_AUDIO_CRC
  439.              * but they are not currently used.  Tell the user.
  440.              */
  441.             msg_Err( p_access, "There were bits in pvr-audio-bitmask that were not used.");
  442.         }
  443.         msg_Dbg( p_access, "Setting audio controls");
  444.     }
  445.     if( p_sys->i_keyint != -1 )
  446.     {
  447.         AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_VIDEO_GOP_SIZE,
  448.                      p_sys->i_keyint );
  449.         msg_Dbg( p_access, "Setting [%u] keyint = %u",
  450.                  controls.count - 1, p_sys->i_keyint );
  451.     }
  452.     if( p_sys->i_bframes != -1 )
  453.     {
  454.         AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_VIDEO_B_FRAMES,
  455.                      p_sys->i_bframes );
  456.         msg_Dbg( p_access, "Setting [%u] bframes = %u",
  457.                  controls.count - 1, p_sys->i_bframes );
  458.     }
  459.     result = ioctl( p_sys->i_fd, VIDIOC_S_EXT_CTRLS, &controls );
  460.     if( result < 0 )
  461.     {
  462.         msg_Err( p_access, "Failed to write %u new capture card settings.",
  463.                             controls.error_idx );
  464.     }
  465.     free( controls.controls );
  466.     return VLC_SUCCESS;
  467. }
  468. #endif /* HAVE_NEW_LINUX_VIDEODEV2_H */
  469. /*****************************************************************************
  470.  * Open: open the device
  471.  *****************************************************************************/
  472. static int Open( vlc_object_t * p_this )
  473. {
  474.     access_t *p_access = (access_t*) p_this;
  475.     access_sys_t * p_sys;
  476.     char * psz_tofree;
  477.     char * psz_parser;
  478.     struct v4l2_capability device_capability;
  479.     int result;
  480.     memset( &device_capability, 0, sizeof(struct v4l2_capability) );
  481.     access_InitFields( p_access );
  482.     ACCESS_SET_CALLBACKS( Read, NULL, Control, NULL );
  483.     p_sys = p_access->p_sys = calloc( 1, sizeof( access_sys_t ));
  484.     if( !p_sys ) return VLC_ENOMEM;
  485.     /* defaults values */
  486.     var_Create( p_access, "pvr-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
  487.     p_sys->psz_videodev = var_CreateGetString( p_access, "pvr-device" );
  488.     p_sys->psz_radiodev = var_CreateGetString( p_access, "pvr-radio-device" );
  489.     p_sys->i_standard   = var_CreateGetInteger( p_access, "pvr-norm" );
  490.     p_sys->i_width      = var_CreateGetInteger( p_access, "pvr-width" );
  491.     p_sys->i_height     = var_CreateGetInteger( p_access, "pvr-height" );
  492.     p_sys->i_frequency  = var_CreateGetInteger( p_access, "pvr-frequency" );
  493.     p_sys->i_framerate  = var_CreateGetInteger( p_access, "pvr-framerate" );
  494.     p_sys->i_keyint     = var_CreateGetInteger( p_access, "pvr-keyint" );
  495.     p_sys->i_bframes    = var_CreateGetInteger( p_access, "pvr-bframes" );
  496.     p_sys->i_bitrate    = var_CreateGetInteger( p_access, "pvr-bitrate" );
  497.     p_sys->i_bitrate_peak  = var_CreateGetInteger( p_access, "pvr-bitrate-peak" );
  498.     p_sys->i_bitrate_mode  = var_CreateGetInteger( p_access, "pvr-bitrate-mode" );
  499.     p_sys->i_audio_bitmask = var_CreateGetInteger( p_access, "pvr-audio-bitmask" );
  500.     p_sys->i_volume     = var_CreateGetInteger( p_access, "pvr-audio-volume" );
  501.     p_sys->i_input      = var_CreateGetInteger( p_access, "pvr-channel" );
  502.     /* parse command line options */
  503.     psz_tofree = strdup( p_access->psz_path );
  504.     if( !psz_tofree )
  505.     {
  506.         free( p_sys->psz_radiodev );
  507.         free( p_sys->psz_videodev );
  508.         free( p_sys );
  509.         return VLC_ENOMEM;
  510.     }
  511.     psz_parser = psz_tofree;
  512.     while( *psz_parser )
  513.     {
  514.         /* Leading slash -> device path */
  515.         if( *psz_parser == '/' )
  516.         {
  517.             free( p_sys->psz_videodev );
  518.             p_sys->psz_videodev = strdup( psz_parser );
  519.             break;
  520.         }
  521.         /* Extract option name */
  522.         const char *optname = psz_parser;
  523.         psz_parser = strchr( psz_parser, '=' );
  524.         if( psz_parser == NULL )
  525.             break;
  526.         *psz_parser++ = '';
  527.         /* Extract option value */
  528.         char *optval = psz_parser;
  529.         while( memchr( ":,", *psz_parser, 3 /* includes  */ ) == NULL )
  530.             psz_parser++;
  531.         if( *psz_parser ) /* more options to come */
  532.             *psz_parser++ = ''; /* skip , or : */
  533.         if ( !strcmp( optname, "norm" ) )
  534.         {
  535.             if ( !strcmp( optval, "secam" ) )
  536.                 p_sys->i_standard = V4L2_STD_SECAM;
  537.             else if ( !strcmp( optval, "pal" ) )
  538.                 p_sys->i_standard = V4L2_STD_PAL;
  539.             else if ( !strcmp( optval, "ntsc" ) )
  540.                 p_sys->i_standard = V4L2_STD_NTSC;
  541.             else
  542.                 p_sys->i_standard = atoi( optval );
  543.         }
  544.         else if( !strcmp( optname, "channel" ) )
  545.             p_sys->i_input = atoi( optval );
  546.         else if( !strcmp( optname, "device" ) )
  547.         {
  548.             free( p_sys->psz_videodev );
  549.             if( asprintf( &p_sys->psz_videodev, "/dev/video%s", optval ) == -1)
  550.                 p_sys->psz_videodev = NULL;
  551.         }
  552.         else if( !strcmp( optname, "frequency" ) )
  553.             p_sys->i_frequency = atoi( optval );
  554.         else if( !strcmp( optname, "framerate" ) )
  555.             p_sys->i_framerate = atoi( optval );
  556.         else if( !strcmp( optname, "keyint" ) )
  557.             p_sys->i_keyint = atoi( optval );
  558.         else if( !strcmp( optname, "bframes" ) )
  559.             p_sys->i_bframes = atoi( optval );
  560.         else if( !strcmp( optname, "width" ) )
  561.             p_sys->i_width = atoi( optval );
  562.         else if( !strcmp( optname, "height" ) )
  563.             p_sys->i_height = atoi( optval );
  564.         else if( !strcmp( optname, "audio" ) )
  565.             p_sys->i_audio_bitmask = atoi( optval );
  566.         else if( !strcmp( optname, "bitrate" ) )
  567.             p_sys->i_bitrate = atoi( optval );
  568.         else if( !strcmp( optname, "maxbitrate" ) )
  569.             p_sys->i_bitrate_peak = atoi( optval );
  570.         else if( !strcmp( optname, "bitratemode" ) )
  571.         {
  572.             if( !strcmp( optval, "vbr" ) )
  573.                 p_sys->i_bitrate_mode = 0;
  574.             else if( !strcmp( optval, "cbr" ) )
  575.                 p_sys->i_bitrate_mode = 1;
  576.         }
  577.         else if( !strcmp( optname, "size" ) )
  578.         {
  579.             p_sys->i_width = strtol( optval, &optval, 0 );
  580.             p_sys->i_height = atoi( optval );
  581.         }
  582.     }
  583.     free( psz_tofree );
  584.     /* open the device */
  585.     p_sys->i_fd = open( p_sys->psz_videodev, O_RDWR );
  586.     if( p_sys->i_fd < 0 )
  587.     {
  588.         msg_Err( p_access, "Cannot open device %s (%m).",
  589.                  p_sys->psz_videodev );
  590.         Close( VLC_OBJECT(p_access) );
  591.         return VLC_EGENERIC;
  592.     }
  593.     msg_Dbg( p_access, "Using video device: %s.", p_sys->psz_videodev);
  594.     /* See what version of ivtvdriver is running */
  595.     result = ioctl( p_sys->i_fd, VIDIOC_QUERYCAP, &device_capability );
  596.     if( result < 0 )
  597.     {
  598.         msg_Err( p_access, "unknown ivtv/pvr driver version in use" );
  599.         Close( VLC_OBJECT(p_access) );
  600.         return VLC_EGENERIC;
  601.     }
  602.     msg_Dbg( p_access, "%s driver (%s on %s) version %02x.%02x.%02x",
  603.               device_capability.driver,
  604.               device_capability.card,
  605.               device_capability.bus_info,
  606.             ( device_capability.version >> 16 ) & 0xff,
  607.             ( device_capability.version >>  8 ) & 0xff,
  608.             ( device_capability.version       ) & 0xff);
  609.     if ( strncmp( (char *) device_capability.driver, "ivtv", 4 )
  610.            || device_capability.version >= 0x000800 )
  611.     {
  612.         /* Drivers > 0.8.0 use v4l2 API instead of IVTV ioctls */
  613.         msg_Dbg( p_access, "this driver uses the v4l2 API" );
  614.         p_sys->b_v4l2_api = true;
  615.     }
  616.     else
  617.     {
  618.         p_sys->b_v4l2_api = false;
  619.     }
  620.     /* set the input */
  621.     if ( p_sys->i_input != -1 )
  622.     {
  623.         result = ioctl( p_sys->i_fd, VIDIOC_S_INPUT, &p_sys->i_input );
  624.         if ( result < 0 )
  625.             msg_Warn( p_access, "Failed to select the requested input pin." );
  626.         else
  627.             msg_Dbg( p_access, "input set to: %d", p_sys->i_input );
  628.     }
  629.     /* set the video standard */
  630.     if ( p_sys->i_standard != V4L2_STD_UNKNOWN )
  631.     {
  632.         result = ioctl( p_sys->i_fd, VIDIOC_S_STD, &p_sys->i_standard );
  633.         if ( result  < 0 )
  634.             msg_Warn( p_access, "Failed to set the requested video standard." );
  635.         else
  636.             msg_Dbg( p_access, "video standard set to: %x",
  637.                      p_sys->i_standard);
  638.     }
  639.     /* set the picture size */
  640.     if ( (p_sys->i_width != -1) || (p_sys->i_height != -1) )
  641.     {
  642.         struct v4l2_format vfmt;
  643.         memset( &vfmt, 0, sizeof(struct v4l2_format) );
  644.         vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  645.         result = ioctl( p_sys->i_fd, VIDIOC_G_FMT, &vfmt );
  646.         if ( result < 0 )
  647.         {
  648.             msg_Warn( p_access, "Failed to read current picture size." );
  649.         }
  650.         else
  651.         {
  652.             if ( p_sys->i_width != -1 )
  653.             {
  654.                 vfmt.fmt.pix.width = p_sys->i_width;
  655.             }
  656.             if ( p_sys->i_height != -1 )
  657.             {
  658.                 vfmt.fmt.pix.height = p_sys->i_height;
  659.             }
  660.             result = ioctl( p_sys->i_fd, VIDIOC_S_FMT, &vfmt );
  661.             if ( result < 0 )
  662.             {
  663.                 msg_Warn( p_access, "Failed to set requested picture size." );
  664.             }
  665.             else
  666.             {
  667.                 msg_Dbg( p_access, "picture size set to: %dx%d",
  668.                          vfmt.fmt.pix.width, vfmt.fmt.pix.height );
  669.             }
  670.         }
  671.     }
  672.     /* set the frequency */
  673.     if ( p_sys->i_frequency != -1 )
  674.     {
  675.         int i_fd;
  676.         struct v4l2_tuner vt;
  677.          /* TODO: let the user choose the tuner */
  678.         memset( &vt, 0, sizeof(struct v4l2_tuner) );
  679.         if ( (p_sys->i_frequency >= pi_radio_range[0])
  680.               && (p_sys->i_frequency <= pi_radio_range[1]) )
  681.         {
  682.             p_sys->i_radio_fd = open( p_sys->psz_radiodev, O_RDWR );
  683.             if( p_sys->i_radio_fd < 0 )
  684.             {
  685.                 msg_Err( p_access, "Cannot open radio device (%m)." );
  686.                 Close( VLC_OBJECT(p_access) );
  687.                 return VLC_EGENERIC;
  688.             }
  689.             msg_Dbg( p_access, "using radio device: %s",
  690.                      p_sys->psz_radiodev );
  691.             i_fd = p_sys->i_radio_fd;
  692.         }
  693.         else
  694.         {
  695.             i_fd = p_sys->i_fd;
  696.             p_sys->i_radio_fd = -1;
  697.         }
  698.         result = ioctl( i_fd, VIDIOC_G_TUNER, &vt );
  699.         if ( result < 0 )
  700.         {
  701.             msg_Warn( p_access, "Failed to read tuner information (%m)." );
  702.         }
  703.         else
  704.         {
  705.             struct v4l2_frequency vf;
  706.             memset( &vf, 0, sizeof(struct v4l2_frequency) );
  707.             vf.tuner = vt.index;
  708.             result = ioctl( i_fd, VIDIOC_G_FREQUENCY, &vf );
  709.             if ( result < 0 )
  710.             {
  711.                 msg_Warn( p_access, "Failed to read tuner frequency (%m)." );
  712.             }
  713.             else
  714.             {
  715.                 if( vt.capability & V4L2_TUNER_CAP_LOW )
  716.                     vf.frequency = p_sys->i_frequency * 16;
  717.                 else
  718.                     vf.frequency = (p_sys->i_frequency * 16 + 500) / 1000;
  719.                 result = ioctl( i_fd, VIDIOC_S_FREQUENCY, &vf );
  720.                 if( result < 0 )
  721.                 {
  722.                     msg_Warn( p_access, "Failed to set tuner frequency (%m)." );
  723.                 }
  724.                 else
  725.                 {
  726.                     msg_Dbg( p_access, "tuner frequency set to: %d",
  727.                              p_sys->i_frequency );
  728.                 }
  729.             }
  730.         }
  731.     }
  732.     /* control parameters */
  733.     if ( p_sys->i_volume != -1 )
  734.     {
  735.         struct v4l2_control ctrl;
  736.         memset( &ctrl, 0, sizeof(struct v4l2_control) );
  737.         ctrl.id = V4L2_CID_AUDIO_VOLUME;
  738.         ctrl.value = p_sys->i_volume;
  739.         result = ioctl( p_sys->i_fd, VIDIOC_S_CTRL, &ctrl );
  740.         if ( result < 0 )
  741.         {
  742.             msg_Warn( p_access, "Failed to set the volume." );
  743.         }
  744.     }
  745.     /* codec parameters */
  746.     if ( (p_sys->i_framerate != -1)
  747.             || (p_sys->i_bitrate_mode != -1)
  748.             || (p_sys->i_bitrate_peak != -1)
  749.             || (p_sys->i_keyint != -1)
  750.             || (p_sys->i_bframes != -1)
  751.             || (p_sys->i_bitrate != -1)
  752.             || (p_sys->i_audio_bitmask != -1) )
  753.     {
  754.         if( p_sys->b_v4l2_api )
  755.         {
  756. #ifdef HAVE_NEW_LINUX_VIDEODEV2_H
  757.             result = ConfigureV4L2( p_access );
  758.             if( result != VLC_SUCCESS )
  759.             {
  760.                 Close( VLC_OBJECT(p_access) );
  761.                 return result;
  762.             }
  763. #else
  764.             msg_Warn( p_access, "You have new ivtvdrivers, "
  765.                       "but this vlc was built against an old v4l2 version." );
  766. #endif
  767.         }
  768.         else
  769.         {
  770.             result = ConfigureIVTV( p_access );
  771.             if( result != VLC_SUCCESS )
  772.             {
  773.                 Close( VLC_OBJECT(p_access) );
  774.                 return result;
  775.             }
  776.         }
  777.     }
  778.     return VLC_SUCCESS;
  779. }
  780. /*****************************************************************************
  781.  * Close: close the device
  782.  *****************************************************************************/
  783. static void Close( vlc_object_t * p_this )
  784. {
  785.     access_t *p_access = (access_t*) p_this;
  786.     access_sys_t *p_sys = (access_sys_t *) p_access->p_sys;
  787.     if ( p_sys->i_fd != -1 )
  788.         close( p_sys->i_fd );
  789.     if ( p_sys->i_radio_fd != -1 )
  790.         close( p_sys->i_radio_fd );
  791.     free( p_sys->psz_videodev );
  792.     free( p_sys->psz_radiodev );
  793.     free( p_sys );
  794. }
  795. /*****************************************************************************
  796.  * Read
  797.  *****************************************************************************/
  798. static ssize_t Read( access_t * p_access, uint8_t * p_buffer, size_t i_len )
  799. {
  800.     access_sys_t *p_sys = (access_sys_t *) p_access->p_sys;
  801.     struct pollfd ufd;
  802.     int i_ret;
  803.     ufd.fd = p_sys->i_fd;
  804.     ufd.events = POLLIN;
  805.     if( p_access->info.b_eof )
  806.         return 0;
  807.     do
  808.     {
  809.         if( !vlc_object_alive (p_access) )
  810.             return 0;
  811.         ufd.revents = 0;
  812.     }
  813.     while( ( i_ret = poll( &ufd, 1, 500 ) ) == 0 );
  814.     if( i_ret < 0 )
  815.     {
  816.         msg_Err( p_access, "Polling error (%m)." );
  817.         return -1;
  818.     }
  819.     i_ret = read( p_sys->i_fd, p_buffer, i_len );
  820.     if( i_ret == 0 )
  821.     {
  822.         p_access->info.b_eof = true;
  823.     }
  824.     else if( i_ret > 0 )
  825.     {
  826.         p_access->info.i_pos += i_ret;
  827.     }
  828.     return i_ret;
  829. }
  830. /*****************************************************************************
  831.  * Control
  832.  *****************************************************************************/
  833. static int Control( access_t *p_access, int i_query, va_list args )
  834. {
  835.     bool   *pb_bool;
  836.     int64_t      *pi_64;
  837.     switch( i_query )
  838.     {
  839.         /* */
  840.         case ACCESS_CAN_SEEK:
  841.         case ACCESS_CAN_FASTSEEK:
  842.             pb_bool = (bool*)va_arg( args, bool* );
  843.             *pb_bool = false;
  844.             break;
  845.         case ACCESS_CAN_PAUSE:
  846.             pb_bool = (bool*)va_arg( args, bool* );
  847.             *pb_bool = false;
  848.             break;
  849.         case ACCESS_CAN_CONTROL_PACE:
  850.             pb_bool = (bool*)va_arg( args, bool* );
  851.             *pb_bool = false;
  852.             break;
  853.         /* */
  854.         case ACCESS_GET_PTS_DELAY:
  855.             pi_64 = (int64_t*)va_arg( args, int64_t * );
  856.             *pi_64 = (int64_t)var_GetInteger( p_access, "pvr-caching" ) * 1000;
  857.             break;
  858.         /* */
  859.         case ACCESS_SET_PAUSE_STATE:
  860.             /* Nothing to do */
  861.             break;
  862.         case ACCESS_GET_TITLE_INFO:
  863.         case ACCESS_SET_TITLE:
  864.         case ACCESS_SET_SEEKPOINT:
  865.         case ACCESS_SET_PRIVATE_ID_STATE:
  866.         case ACCESS_GET_CONTENT_TYPE:
  867.             return VLC_EGENERIC;
  868.         default:
  869.             msg_Warn( p_access, "Unimplemented query in control." );
  870.             return VLC_EGENERIC;
  871.     }
  872.     return VLC_SUCCESS;
  873. }