📄 pvr.c
字号:
case 0x0030: return V4L2_MPEG_AUDIO_L2_BITRATE_56K; case 0x0040: return V4L2_MPEG_AUDIO_L2_BITRATE_64K; case 0x0050: return V4L2_MPEG_AUDIO_L2_BITRATE_80K; case 0x0060: return V4L2_MPEG_AUDIO_L2_BITRATE_96K; case 0x0070: return V4L2_MPEG_AUDIO_L2_BITRATE_112K; case 0x0080: return V4L2_MPEG_AUDIO_L2_BITRATE_128K; case 0x0090: return V4L2_MPEG_AUDIO_L2_BITRATE_160K; case 0x00a0: return V4L2_MPEG_AUDIO_L2_BITRATE_192K; case 0x00b0: return V4L2_MPEG_AUDIO_L2_BITRATE_224K; case 0x00c0: return V4L2_MPEG_AUDIO_L2_BITRATE_256K; case 0x00d0: return V4L2_MPEG_AUDIO_L2_BITRATE_320K; case 0x00e0: return V4L2_MPEG_AUDIO_L2_BITRATE_384K; } return V4L2_MPEG_AUDIO_L2_BITRATE_192K;}/***************************************************************************** * V4L2AudioMode: calculate v4l2 audio mode from pvr-audio-bitmask *****************************************************************************/static uint32_t V4L2AudioMode( uint32_t i_bitmask ){ switch( i_bitmask & 0x0300 ) { case 0x0100: return V4L2_MPEG_AUDIO_MODE_JOINT_STEREO; case 0x0200: return V4L2_MPEG_AUDIO_MODE_DUAL; case 0x0300: return V4L2_MPEG_AUDIO_MODE_MONO; } return V4L2_MPEG_AUDIO_MODE_STEREO;}/***************************************************************************** * ConfigureV4L2: set up codec parameters using the new v4l2 api *****************************************************************************/static int ConfigureV4L2( access_t * p_access ){ access_sys_t *p_sys = (access_sys_t *) p_access->p_sys; struct v4l2_ext_controls controls; int result; memset( &controls, 0, sizeof(struct v4l2_ext_controls) ); controls.ctrl_class = V4L2_CTRL_CLASS_MPEG; controls.error_idx = 0; controls.reserved[0] = 0; controls.reserved[1] = 0; controls.count = 0; controls.controls = calloc( sizeof( struct v4l2_ext_control ), MAX_V4L2_CTRLS ); if( controls.controls == NULL ) return VLC_ENOMEM; /* Note: Ignore frame rate. Doesn't look like it can be changed. */ if( p_sys->i_bitrate != -1 ) { AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_VIDEO_BITRATE, p_sys->i_bitrate ); msg_Dbg( p_access, "Setting [%u] bitrate = %u", controls.count - 1, p_sys->i_bitrate ); } if( p_sys->i_bitrate_peak != -1 ) { AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_VIDEO_BITRATE_PEAK, p_sys->i_bitrate_peak ); msg_Dbg( p_access, "Setting [%u] bitrate_peak = %u", controls.count - 1, p_sys->i_bitrate_peak ); } if( p_sys->i_bitrate_mode != -1 ) { AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_VIDEO_BITRATE_MODE, p_sys->i_bitrate_mode ); msg_Dbg( p_access, "Setting [%u] bitrate_mode = %u", controls.count - 1, p_sys->i_bitrate_mode ); } if( p_sys->i_audio_bitmask != -1 ) { /* Sample rate */ AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ, V4L2SampleRate( p_sys->i_audio_bitmask ) ); /* Encoding layer and bitrate */ switch( V4L2AudioEncoding( p_sys->i_audio_bitmask ) ) { case V4L2_MPEG_AUDIO_ENCODING_LAYER_1: AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ, V4L2_MPEG_AUDIO_ENCODING_LAYER_1 ); AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_AUDIO_L1_BITRATE, V4L2AudioL1Bitrate( p_sys->i_audio_bitmask ) ); break; case V4L2_MPEG_AUDIO_ENCODING_LAYER_2: AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ, V4L2_MPEG_AUDIO_ENCODING_LAYER_2 ); AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_AUDIO_L2_BITRATE, V4L2AudioL2Bitrate( p_sys->i_audio_bitmask ) ); break; } /* Audio mode - stereo or mono */ AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_AUDIO_MODE, V4L2AudioMode( p_sys->i_audio_bitmask ) ); /* See if the user wants any other audio feature */ if( ( p_sys->i_audio_bitmask & 0x1ff00 ) != 0 ) { /* It would be possible to support the bits that represent: * V4L2_CID_MPEG_AUDIO_MODE_EXTENSION * V4L2_CID_MPEG_AUDIO_EMPHASIS * V4L2_CID_MPEG_AUDIO_CRC * but they are not currently used. Tell the user. */ msg_Err( p_access, "There were bits in pvr-audio-bitmask that were not used."); } msg_Dbg( p_access, "Setting audio controls"); } if( p_sys->i_keyint != -1 ) { AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_VIDEO_GOP_SIZE, p_sys->i_keyint ); msg_Dbg( p_access, "Setting [%u] keyint = %u", controls.count - 1, p_sys->i_keyint ); } if( p_sys->i_bframes != -1 ) { AddV4L2Ctrl( p_access, &controls, V4L2_CID_MPEG_VIDEO_B_FRAMES, p_sys->i_bframes ); msg_Dbg( p_access, "Setting [%u] bframes = %u", controls.count - 1, p_sys->i_bframes ); } result = ioctl( p_sys->i_fd, VIDIOC_S_EXT_CTRLS, &controls ); if( result < 0 ) { msg_Err( p_access, "Failed to write %u new capture card settings.", controls.error_idx ); } free( controls.controls ); return VLC_SUCCESS;}#endif /* HAVE_NEW_LINUX_VIDEODEV2_H *//***************************************************************************** * Open: open the device *****************************************************************************/static int Open( vlc_object_t * p_this ){ access_t *p_access = (access_t*) p_this; access_sys_t * p_sys; char * psz_tofree; char * psz_parser; char * psz_device = NULL; vlc_value_t val; struct v4l2_capability device_capability; int result; memset( &device_capability, 0, sizeof(struct v4l2_capability) ); p_access->pf_read = Read; p_access->pf_block = NULL; p_access->pf_seek = NULL; p_access->pf_control = Control; p_access->info.i_update = 0; p_access->info.i_size = 0; p_access->info.i_pos = 0; p_access->info.b_eof = false; p_access->info.i_title = 0; p_access->info.i_seekpoint = 0; /* create private access data */ p_sys = calloc( sizeof( access_sys_t ), 1 ); if( !p_sys ) return VLC_ENOMEM; p_access->p_sys = p_sys; /* defaults values */ var_Create( p_access, "pvr-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Create( p_access, "pvr-device", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-device" , &val); p_sys->psz_videodev = val.psz_string; var_Create( p_access, "pvr-radio-device", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-radio-device" , &val); p_sys->psz_radiodev = val.psz_string; var_Create( p_access, "pvr-norm", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-norm" , &val); p_sys->i_standard = val.i_int; var_Create( p_access, "pvr-width", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-width" , &val); p_sys->i_width = val.i_int; var_Create( p_access, "pvr-height", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-height" , &val); p_sys->i_height = val.i_int; var_Create( p_access, "pvr-frequency", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-frequency" , &val); p_sys->i_frequency = val.i_int; var_Create( p_access, "pvr-framerate", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-framerate" , &val); p_sys->i_framerate = val.i_int; var_Create( p_access, "pvr-keyint", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-keyint" , &val); p_sys->i_keyint = val.i_int; var_Create( p_access, "pvr-bframes", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-bframes" , &val); p_sys->i_bframes = val.b_bool; var_Create( p_access, "pvr-bitrate", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-bitrate" , &val); p_sys->i_bitrate = val.i_int; var_Create( p_access, "pvr-bitrate-peak", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-bitrate-peak" , &val); p_sys->i_bitrate_peak = val.i_int; var_Create( p_access, "pvr-bitrate-mode", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-bitrate-mode" , &val); p_sys->i_bitrate_mode = val.i_int; var_Create( p_access, "pvr-audio-bitmask", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-audio-bitmask" , &val); p_sys->i_audio_bitmask = val.i_int; var_Create( p_access, "pvr-audio-volume", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-audio-volume" , &val); p_sys->i_volume = val.i_int; var_Create( p_access, "pvr-channel", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_access, "pvr-channel" , &val); p_sys->i_input = val.i_int; /* parse command line options */ psz_tofree = strdup( p_access->psz_path ); if( !psz_tofree ) return VLC_ENOMEM; psz_parser = psz_tofree; if( *psz_parser ) { for( ;; ) { if ( !strncmp( psz_parser, "norm=", strlen( "norm=" ) ) ) { char *psz_parser_init; psz_parser += strlen( "norm=" ); psz_parser_init = psz_parser; while ( (*psz_parser != ':') && (*psz_parser != ',') && (*psz_parser != '\0') ) { psz_parser++; } if ( !strncmp( psz_parser_init, "secam" , psz_parser - psz_parser_init ) ) { p_sys->i_standard = V4L2_STD_SECAM; } else if ( !strncmp( psz_parser_init, "pal" , psz_parser - psz_parser_init ) ) { p_sys->i_standard = V4L2_STD_PAL; } else if ( !strncmp( psz_parser_init, "ntsc" , psz_parser - psz_parser_init ) ) { p_sys->i_standard = V4L2_STD_NTSC; } else { p_sys->i_standard = strtol( psz_parser_init , &psz_parser, 0 ); } } else if( !strncmp( psz_parser, "channel=", strlen( "channel=" ) ) ) { p_sys->i_input = strtol( psz_parser + strlen( "channel=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "device=", strlen( "device=" ) ) ) { int i_len = strlen( "/dev/videox" ); psz_device = calloc( i_len + 1, 1 ); if( !psz_device ) return VLC_ENOMEM; snprintf( psz_device, i_len, "/dev/video%ld", strtol( psz_parser + strlen( "device=" ), &psz_parser, 0 ) ); } else if( !strncmp( psz_parser, "frequency=", strlen( "frequency=" ) ) ) { p_sys->i_frequency = strtol( psz_parser + strlen( "frequency=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "framerate=", strlen( "framerate=" ) ) ) { p_sys->i_framerate = strtol( psz_parser + strlen( "framerate=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "keyint=", strlen( "keyint=" ) ) ) { p_sys->i_keyint = strtol( psz_parser + strlen( "keyint=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "bframes=", strlen( "bframes=" ) ) ) { p_sys->i_bframes = strtol( psz_parser + strlen( "bframes=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "width=", strlen( "width=" ) ) ) { p_sys->i_width = strtol( psz_parser + strlen( "width=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "height=", strlen( "height=" ) ) ) { p_sys->i_height = strtol( psz_parser + strlen( "height=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "audio=", strlen( "audio=" ) ) ) { p_sys->i_audio_bitmask = strtol( psz_parser + strlen( "audio=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "bitrate=", strlen( "bitrate=" ) ) ) { p_sys->i_bitrate = strtol( psz_parser + strlen( "bitrate=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "maxbitrate=", strlen( "maxbitrate=" ) ) ) { p_sys->i_bitrate_peak = strtol( psz_parser + strlen( "maxbitrate=" ), &psz_parser, 0 ); } else if( !strncmp( psz_parser, "bitratemode=", strlen( "bitratemode=" ) ) ) { char *psz_parser_init; psz_parser += strlen( "bitratemode=" ); psz_parser_init = psz_parser; while ( (*psz_parser != ':') && (*psz_parser != ',') && (*psz_parser != '\0') ) { psz_parser++; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -