pvr.c
来自「VLC媒体播放程序」· C语言 代码 · 共 516 行 · 第 1/2 页
C
516 行
else if( !strncmp( psz_parser, "size=", strlen( "size=" ) ) ) { p_sys->i_width = strtol( psz_parser + strlen( "size=" ), &psz_parser, 0 ); p_sys->i_height = strtol( psz_parser + 1 , &psz_parser, 0 ); } else { char *psz_parser_init; psz_parser_init = psz_parser; while ( *psz_parser != ':' && *psz_parser != ',' && *psz_parser != '\0' ) { psz_parser++; } psz_device = calloc( psz_parser - psz_parser_init + 1, 1 ); strncpy( psz_device, psz_parser_init, psz_parser - psz_parser_init ); } if( *psz_parser ) psz_parser++; else break; } } //give a default value to psz_device if none has bee specified if (!psz_device) { psz_device = calloc( strlen( "/dev/videox" ) + 1, 1 ); strcpy( psz_device, "/dev/video0" ); } free( psz_tofree ); /* open the device */ if( ( p_sys->i_fd = open( psz_device, O_RDWR ) ) < 0 ) { msg_Err( p_input, "cannot open device (%s)", strerror( errno ) ); return VLC_EGENERIC; } else { msg_Dbg( p_input, "using video device: %s",psz_device); } free( psz_device ); /* set the input */ if( p_sys->i_input != -1) { if(ioctl( p_sys->i_fd, VIDIOC_S_INPUT, &p_sys->i_input ) < 0 ) { msg_Warn( p_input, "VIDIOC_S_INPUT failed" ); } else { msg_Dbg( p_input,"input set to:%d",p_sys->i_input); } } /* set the video standard */ if(p_sys->i_standard != V4L2_STD_UNKNOWN) { if(ioctl( p_sys->i_fd, VIDIOC_S_STD, &p_sys->i_standard ) < 0 ) { msg_Warn( p_input, "VIDIOC_S_STD failed" ); } else { msg_Dbg( p_input,"video standard set to:%x",p_sys->i_standard); } } /* set the picture size */ if(p_sys->i_width != -1 || p_sys->i_height != -1) { if(ioctl( p_sys->i_fd, VIDIOC_G_FMT, &vfmt ) < 0 ) { msg_Warn( p_input, "VIDIOC_G_FMT failed" ); } else { if(p_sys->i_width != -1) { vfmt.fmt.pix.width = p_sys->i_width; } if(p_sys->i_height != -1) { vfmt.fmt.pix.height = p_sys->i_height; } if( ioctl( p_sys->i_fd, VIDIOC_S_FMT, &vfmt ) < 0 ) { msg_Warn( p_input, "VIDIOC_S_FMT failed" ); } else { msg_Dbg( p_input,"picture size set to:%dx%d",vfmt.fmt.pix.width, vfmt.fmt.pix.height); } } } /* set the frequency */ if (p_sys->i_frequency != -1) { vf.tuner = 0; /* TODO: let the user choose the tuner */ if( ioctl( p_sys->i_fd, VIDIOC_G_FREQUENCY, &vf ) < 0 ) { msg_Warn( p_input, "VIDIOC_G_FREQUENCY failed (%s)", strerror( errno ) ); } else { vf.frequency = p_sys->i_frequency * 16 / 1000; if( ioctl( p_sys->i_fd, VIDIOC_S_FREQUENCY, &vf ) < 0 ) { msg_Warn( p_input, "VIDIOC_S_FREQUENCY failed (%s)", strerror( errno ) ); } else { msg_Dbg( p_input,"Tuner frequency set to:%d",p_sys->i_frequency); } } } /* codec parameters */ if(p_sys->i_framerate != -1 || p_sys->i_bitrate_mode != -1 || p_sys->i_bitrate_peak != -1 || p_sys->i_bitrate != -1) { if( ioctl( p_sys->i_fd, IVTV_IOC_G_CODEC, &codec ) < 0 ) { msg_Warn( p_input, "IVTV_IOC_G_CODEC failed" ); } else { if(p_sys->i_framerate != -1) { switch( p_sys->i_framerate ) { case 30: codec.framerate = 0; break; case 25: codec.framerate = 1; break; default: msg_Warn( p_input, "invalid framerate, reverting to 25" ); codec.framerate = 1; break; } } if(p_sys->i_bitrate != -1) { codec.bitrate = p_sys->i_bitrate; } if(p_sys->i_bitrate_peak != -1) { codec.bitrate_peak = p_sys->i_bitrate_peak; } if(p_sys->i_bitrate_mode != -1) { codec.bitrate_mode = p_sys->i_bitrate_mode; } if( ioctl( p_sys->i_fd, IVTV_IOC_S_CODEC, &codec ) < 0 ) { msg_Warn( p_input, "IVTV_IOC_S_CODEC failed" ); } else { msg_Dbg( p_input, "Setting codec parameters to: framerate: %d, bitrate: %d/%d/%d", codec.framerate, codec.bitrate, codec.bitrate_peak, codec.bitrate_mode); } } } /* do a quick read */ if(p_sys->i_fd) { if(read(p_sys->i_fd,&" ",1)) { msg_Dbg(p_input, "Could read byte from device"); } else { msg_Warn(p_input, "Could not read byte from device"); } } return VLC_SUCCESS;}/***************************************************************************** * Close: close the device *****************************************************************************/static void Close( vlc_object_t * p_this ){ input_thread_t * p_input = (input_thread_t*) p_this; access_sys_t * p_sys = p_input->p_access_data; close( p_sys->i_fd ); free( p_sys );}/***************************************************************************** * Read *****************************************************************************/static ssize_t Read( input_thread_t * p_input, byte_t * p_buffer, size_t i_len ){ access_sys_t * p_sys = p_input->p_access_data; int i_ret; struct timeval timeout; fd_set fds; FD_ZERO( &fds ); FD_SET( p_sys->i_fd, &fds ); timeout.tv_sec = 0; timeout.tv_usec = 500000; while( !( i_ret = select( p_sys->i_fd + 1, &fds, NULL, NULL, &timeout ) ) ) { FD_ZERO( &fds ); FD_SET( p_sys->i_fd, &fds ); timeout.tv_sec = 0; timeout.tv_usec = 500000; if( p_input->b_die || p_input->b_error ) return 0; } if( i_ret < 0 ) { msg_Err( p_input, "select error (%s)", strerror( errno ) ); return -1; } i_ret = read( p_sys->i_fd, p_buffer, i_len ); return i_ret;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?