📄 v4l2.c
字号:
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 + -