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

📄 v4l2.c

📁 vlc源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        return VLC_EGENERIC;    }    return VLC_SUCCESS;}/***************************************************************************** * GetV4L2Params: fill in p_sys parameters (shared by DemuxOpen and AccessOpen) *****************************************************************************/static void GetV4L2Params( demux_sys_t *p_sys, vlc_object_t *p_obj ){    p_sys->i_video_pts = -1;    p_sys->i_selected_standard_id =        i_standards_list[var_CreateGetInteger( p_obj, "v4l2-standard" )];    p_sys->i_selected_input = var_CreateGetInteger( p_obj, "v4l2-input" );    p_sys->i_selected_audio_input =        var_CreateGetInteger( p_obj, "v4l2-audio-input" );    p_sys->io = var_CreateGetInteger( p_obj, "v4l2-io" );    p_sys->i_width = var_CreateGetInteger( p_obj, "v4l2-width" );    p_sys->i_height = var_CreateGetInteger( p_obj, "v4l2-height" );    var_CreateGetBool( p_obj, "v4l2-controls-reset" );    p_sys->f_fps = var_CreateGetFloat( p_obj, "v4l2-fps" );    p_sys->i_sample_rate = var_CreateGetInteger( p_obj, "v4l2-samplerate" );    p_sys->psz_requested_chroma = var_CreateGetString( p_obj, "v4l2-chroma" );    p_sys->i_audio_method = var_CreateGetInteger( p_obj, "v4l2-audio-method" );    p_sys->b_stereo = var_CreateGetBool( p_obj, "v4l2-stereo" );    p_sys->i_pts = var_CreateGetInteger( p_obj, "v4l2-caching" );    p_sys->i_cur_tuner = var_CreateGetInteger( p_obj, "v4l2-tuner" );    p_sys->i_frequency = var_CreateGetInteger( p_obj, "v4l2-tuner-frequency" );    p_sys->i_audio_mode = var_CreateGetInteger( p_obj, "v4l2-tuner-audio-mode" );    p_sys->psz_set_ctrls = var_CreateGetString( p_obj, "v4l2-set-ctrls" );    p_sys->psz_device = p_sys->psz_vdev = p_sys->psz_adev = NULL;    p_sys->i_fd_video = -1;    p_sys->i_fd_audio = -1;    p_sys->p_es_video = p_sys->p_es_audio = 0;    p_sys->p_block_audio = 0;}/***************************************************************************** * ParseMRL: parse the options contained in the MRL *****************************************************************************/static void ParseMRL( demux_sys_t *p_sys, char *psz_path, vlc_object_t *p_obj ){    char *psz_dup = strdup( psz_path );    char *psz_parser = psz_dup;    while( *psz_parser && *psz_parser != ':' )    {        psz_parser++;    }    if( *psz_parser == ':' )    {        /* read options */        for( ;; )        {            *psz_parser++ = '\0';            if( !strncmp( psz_parser, "adev=", strlen( "adev=" ) ) )            {                int  i_len;                psz_parser += strlen( "adev=" );                if( strchr( psz_parser, ':' ) )                {                    i_len = strchr( psz_parser, ':' ) - psz_parser;                }                else                {                    i_len = strlen( psz_parser );                }                p_sys->psz_adev = strndup( psz_parser, i_len );                if( !*p_sys->psz_adev )                {                    free( p_sys->psz_adev );                    p_sys->psz_adev = NULL;                }                psz_parser += i_len;            }            else if( !strncmp( psz_parser, "standard=", strlen( "standard=" ) ) )            {                psz_parser += strlen( "standard=" );                if( !strncmp( psz_parser, "pal", strlen( "pal" ) ) )                {                    p_sys->i_selected_standard_id = V4L2_STD_PAL;                    psz_parser += strlen( "pal" );                }                else if( !strncmp( psz_parser, "ntsc", strlen( "ntsc" ) ) )                {                    p_sys->i_selected_standard_id = V4L2_STD_NTSC;                    psz_parser += strlen( "ntsc" );                }                else if( !strncmp( psz_parser, "secam", strlen( "secam" ) ) )                {                    p_sys->i_selected_standard_id = V4L2_STD_SECAM;                    psz_parser += strlen( "secam" );                }                else if( !strncmp( psz_parser, "default", strlen( "default" ) ) )                {                    p_sys->i_selected_standard_id = V4L2_STD_UNKNOWN;                    psz_parser += strlen( "default" );                }                else                {                    p_sys->i_selected_standard_id = i_standards_list[strtol( psz_parser, &psz_parser, 0 )];                }            }            else if( !strncmp( psz_parser, "chroma=", strlen( "chroma=" ) ) )            {                int  i_len;                psz_parser += strlen( "chroma=" );                if( strchr( psz_parser, ':' ) )                {                    i_len = strchr( psz_parser, ':' ) - psz_parser;                }                else                {                    i_len = strlen( psz_parser );                }                free( p_sys->psz_requested_chroma );                p_sys->psz_requested_chroma = strndup( psz_parser, i_len );                psz_parser += i_len;            }            else if( !strncmp( psz_parser, "input=", strlen( "input=" ) ) )            {                p_sys->i_selected_input = strtol( psz_parser + strlen( "input=" ),                                       &psz_parser, 0 );            }            else if( !strncmp( psz_parser, "audio-input=", strlen( "audio-input=" ) ) )            {                p_sys->i_selected_audio_input = strtol( psz_parser + strlen( "audio-input=" ),                                       &psz_parser, 0 );            }            else if( !strncmp( psz_parser, "fps=", strlen( "fps=" ) ) )            {                p_sys->f_fps = strtof( psz_parser + strlen( "fps=" ),                                       &psz_parser );            }            else if( !strncmp( psz_parser, "io=", strlen( "io=" ) ) )            {                psz_parser += strlen( "io=" );                if( !strncmp( psz_parser, "read", strlen( "read" ) ) )                {                    p_sys->io = IO_METHOD_READ;                    psz_parser += strlen( "read" );                }                else if( !strncmp( psz_parser, "mmap", strlen( "mmap" ) ) )                {                    p_sys->io = IO_METHOD_MMAP;                    psz_parser += strlen( "mmap" );                }                else if( !strncmp( psz_parser, "userptr", strlen( "userptr" ) ) )                {                    p_sys->io = IO_METHOD_USERPTR;                    psz_parser += strlen( "userptr" );                }                else                {                    p_sys->io = strtol( psz_parser, &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, "controls-reset",                               strlen( "controls-reset" ) ) )            {                var_SetBool( p_obj, "v4l2-controls-reset", true );                psz_parser += strlen( "controls-reset" );            }#if 0            else if( !strncmp( psz_parser, "brightness=",                               strlen( "brightness=" ) ) )            {                var_SetInteger( p_obj, "brightness",                    strtol( psz_parser + strlen( "brightness=" ),                            &psz_parser, 0 ) );            }            else if( !strncmp( psz_parser, "contrast=",                               strlen( "contrast=" ) ) )            {                var_SetInteger( p_obj, "contrast",                    strtol( psz_parser + strlen( "contrast=" ),                            &psz_parser, 0 ) );            }            else if( !strncmp( psz_parser, "saturation=",                               strlen( "saturation=" ) ) )            {                var_SetInteger( p_obj, "saturation",                    strtol( psz_parser + strlen( "saturation=" ),                            &psz_parser, 0 ) );            }            else if( !strncmp( psz_parser, "hue=",                               strlen( "hue=" ) ) )            {                var_SetInteger( p_obj, "hue",                    strtol( psz_parser + strlen( "hue=" ),                            &psz_parser, 0 ) );            }            else if( !strncmp( psz_parser, "gamma=",                               strlen( "gamma=" ) ) )            {                var_SetInteger( p_obj, "gamma",                    strtol( psz_parser + strlen( "gamma=" ),                            &psz_parser, 0 ) );            }#endif            else if( !strncmp( psz_parser, "samplerate=",                               strlen( "samplerate=" ) ) )            {                p_sys->i_sample_rate =                    strtol( psz_parser + strlen( "samplerate=" ),                            &psz_parser, 0 );            }            else if( !strncmp( psz_parser, "audio-method", strlen( "audio-method" ) ) )            {                p_sys->i_audio_method =                    strtol( psz_parser + strlen( "audio-method" ),                            &psz_parser, 0 );            }            else if( !strncmp( psz_parser, "stereo", strlen( "stereo" ) ) )            {                psz_parser += strlen( "stereo" );                p_sys->b_stereo = true;            }            else if( !strncmp( psz_parser, "mono", strlen( "mono" ) ) )            {                psz_parser += strlen( "mono" );                p_sys->b_stereo = false;            }            else if( !strncmp( psz_parser, "caching=", strlen( "caching=" ) ) )            {                p_sys->i_pts = strtol( psz_parser + strlen( "caching=" ),                                       &psz_parser, 0 );            }            else if( !strncmp( psz_parser, "tuner=", strlen( "tuner=" ) ) )            {                p_sys->i_cur_tuner = strtol( psz_parser + strlen( "tuner=" ),                                         &psz_parser, 0 );            }            else if( !strncmp( psz_parser, "tuner-frequency=", strlen( "tuner-frequency=" ) ) )            {                p_sys->i_frequency = strtol( psz_parser                                          + strlen( "tuner-frequency=" ),                                          &psz_parser, 0 );            }            else if( !strncmp( psz_parser, "tuner-audio-mode=", strlen( "tuner-audio-mode=" ) ) )            {                p_sys->i_audio_mode = strtol( psz_parser                                          + strlen( "tuner-audio-mode=" ),                                          &psz_parser, 0 );            }            else if( !strncmp( psz_parser, "set-ctrls=", strlen( "set-ctrls=" )) )            {                int  i_len;                psz_parser += strlen( "set-ctrls=" );                if( strchr( psz_parser, ':' ) )                {                    i_len = strchr( psz_parser, ':' ) - psz_parser;                }                else                {                    i_len = strlen( psz_parser );                }                p_sys->psz_set_ctrls = strndup( psz_parser, i_len );                psz_parser += i_len;            }            else            {                char *psz_unk = strchr( psz_parser, ':' );                if (psz_unk)                    psz_unk = strndup( psz_parser, psz_unk - psz_parser );                else                    psz_unk = strdup( psz_parser);                msg_Warn( p_obj, "unknown option %s", psz_unk );                free (psz_unk);            }            while( *psz_parser && *psz_parser != ':' )            {                psz_parser++;            }            if( *psz_parser == '\0' )            {                break;            }        }    }    /* Main device */    if( *psz_dup )    {        p_sys->psz_device = strdup( psz_dup );    }    free( psz_dup );}/***************************************************************************** * Close: close device, free resources *****************************************************************************/static void AccessClose( vlc_object_t *p_this ){    access_t    *p_access = (access_t *)p_this;    demux_sys_t *p_sys   = (demux_sys_t *) p_access->p_sys;    CommonClose( p_this, p_sys );}static void DemuxClose( vlc_object_t *p_this ){    struct v4l2_buffer buf;    enum v4l2_buf_type buf_type;    unsigned int i;    demux_t     *p_demux = (demux_t *)p_this;    demux_sys_t *p_sys   = p_demux->p_sys;    /* Stop video capture */    if( p_sys->i_fd_video >= 0 )    {        switch( p_sys->io )        {        case IO_METHOD_READ:            /* Nothing to do */            break;        case IO_METHOD_MMAP:        case IO_METHOD_USERPTR:            /* Some drivers 'hang' internally if this is not done before streamoff */            for( unsigned int i = 0; i < p_sys->i_nbuffers; i++ )            {                memset( &buf, 0, sizeof(buf) );                buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;                buf.memory = ( p_sys->io == IO_METHOD_USERPTR ) ?                    V4L2_MEMORY_USERPTR : V4L2_MEMORY_MMAP;                v4l2_ioctl( p_sys->i_fd_video, VIDIOC_DQBUF, &buf ); /* ignore result */            }            buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;            if( v4l2_ioctl( p_sys->i_fd_video, VIDIOC_STREAMOFF, &buf_type ) < 0 ) {                msg_Err( p_this, "VIDIOC_STREAMOFF failed" );            }            break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -