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 + -
显示快捷键?