⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pvr.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -