gusucode.com > 嵌入式linux系统的网络编程源码程序 > 嵌入式linux系统的网络编程源码程序/视频会议源码/video_test.cpp
/////////////////////////////////////////////////////// // FileName: video_test.cpp // Author: b1gm0use // Project: myvideo #include <iostream> #include <getopt.h> #include <sys/ioctl.h> #include <linux/videodev.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <fstream> using namespace std; /////////////////////////////////////////////////////// // Functions Declaration /////////////////////////////////////////////////////// int test_capability ( ostream & out, int dev, video_capability & vid_cap ); int test_frame_buffer ( ostream & out, int dev, video_buffer & vid_buf ); int test_window ( ostream & out, int dev, video_window & vid_win ); int test_channel ( ostream & out, int dev, video_channel & vid_chan, int channels ); int test_image_properties ( ostream & out, int dev, video_picture & vid_pic ); int test_tuner ( ostream & out, int dev, video_tuner & vid_tun, int tuners ); int test_audio ( ostream & out, int dev, video_audio & vid_audio ); /////////////////////////////////////////////////////// // Public Functions /////////////////////////////////////////////////////// // 构造函数 // 也是测试开始 void video_test ( const char * device, const char * filename ) // {{{ { int dev; ostream * out = &cout; video_capability vid_cap; video_buffer vid_buf; video_window vid_win; video_channel vid_chan; video_picture vid_pic; cout << "Begin video device testing..." << endl << endl; //////////////////////// // open device if ( ( dev = open( device, O_RDWR ) ) == -1 ) { cerr << "Can't open device:\t" << device << endl; exit(1); } //////////////////////// // open file if ( filename != NULL ) { out = new ofstream( filename ); if ( out == NULL ) { cerr << "Can't open output file:\t" << filename << endl; exit( 1 ); } } test_capability ( *out, dev, vid_cap ); test_frame_buffer ( *out, dev, vid_buf ); test_window ( *out, dev, vid_win ); test_channel ( *out, dev, vid_chan, vid_cap.channels ); test_image_properties ( *out, dev, vid_pic ); return; } // }}} int test_capability ( ostream & out, int dev, video_capability & vid_cap ) // {{{ { //////////////////////// // Capability Query if ( ioctl( dev, VIDIOCGCAP, &vid_cap ) == -1 ) { cerr << "ioctl( VIDIOCGCAP ) error!" << endl; return -1; } // Capability report out << "There is the report of Capability Query Below." << endl; out << "=====================================================" << endl; out << "name:\t\t" << vid_cap.name << endl; out << "type:\t\t" << vid_cap.type << endl; out << "channels:\t" << vid_cap.channels << endl; out << "audios:\t\t" << vid_cap.audios << endl; out << "maxwidth:\t" << vid_cap.maxwidth << endl; out << "maxheight:\t" << vid_cap.maxheight << endl; out << "minwidth:\t" << vid_cap.minwidth << endl; out << "minheight:\t" << vid_cap.minheight << endl; out << endl << endl; out << "type field:" << endl; out << "---------------" << endl; if ( ( vid_cap.type & VID_TYPE_CAPTURE ) != 0 ) out << "VID_TYPE_CAPTURE" << endl; if ( ( vid_cap.type & VID_TYPE_TUNER ) != 0 ) out << "VID_TYPE_TUNER" << endl; if ( ( vid_cap.type & VID_TYPE_TELETEXT ) != 0 ) out << "VID_TYPE_TELETEXT" << endl; if ( ( vid_cap.type & VID_TYPE_OVERLAY ) != 0 ) out << "VID_TYPE_OVERLAY" << endl; if ( ( vid_cap.type & VID_TYPE_CHROMAKEY ) != 0 ) out << "VID_TYPE_CHROMAKEY" << endl; if ( ( vid_cap.type & VID_TYPE_CLIPPING ) != 0 ) out << "VID_TYPE_CLIPPING" << endl; if ( ( vid_cap.type & VID_TYPE_FRAMERAM ) != 0 ) out << "VID_TYPE_FRAMERAM" << endl; if ( ( vid_cap.type & VID_TYPE_SCALES ) != 0 ) out << "VID_TYPE_SCALES" << endl; if ( ( vid_cap.type & VID_TYPE_MONOCHROME ) != 0 ) out << "VID_TYPE_MONOCHROME" << endl; if ( ( vid_cap.type & VID_TYPE_SUBCAPTURE ) != 0 ) out << "VID_TYPE_SUBCAPTURE" << endl; if ( ( vid_cap.type & VID_TYPE_MPEG_DECODER ) != 0 ) out << "VID_TYPE_MPEG_DECODER" << endl; if ( ( vid_cap.type & VID_TYPE_MPEG_ENCODER ) != 0 ) out << "VID_TYPE_MPEG_ENCODER" << endl; if ( ( vid_cap.type & VID_TYPE_MJPEG_DECODER ) != 0 ) out << "VID_TYPE_MJPEG_DECODER" << endl; if ( ( vid_cap.type & VID_TYPE_MJPEG_ENCODER ) != 0 ) out << "VID_TYPE_MJPEG_ENCODER" << endl; out << endl << endl; return 0; } // }}} int test_frame_buffer ( ostream & out, int dev, video_buffer & vid_buf ) // {{{ { //////////////////////// // Frame Buffer Test if ( ioctl( dev, VIDIOCGFBUF, &vid_buf ) == -1 ) { cerr << "ioctl( VIDIOCGFBUF ) error!" << endl; return -1; } // Frame Buffer Test report out << "There is the report of Frame Buffer Test Below." << endl; out << "=====================================================" << endl; out << "base:\t" << hex << vid_buf.base << endl; out << "height:\t" << dec << vid_buf.height<< endl; out << "width:\t" << vid_buf.width << endl; out << "depth:\t" << vid_buf.depth << endl; out << "bytesperline:\t" << vid_buf.bytesperline << endl; out << endl << endl; return 0; } // }}} int test_window ( ostream & out, int dev, video_window & vid_win ) // {{{ { //////////////////////// // Capture Windows Test if ( ioctl( dev, VIDIOCGWIN, &vid_win ) == -1 ) { cerr << "ioctl( VIDIOCGWIN ) error!" << endl; return -1; } // Capture Windows Test report out << "There is the report of Capture Windows Test Below." << endl; out << "=====================================================" << endl; out << "x:\t" << vid_win.x<< endl; out << "y:\t" << vid_win.y << endl; out << "width:\t" << vid_win.width<< endl; out << "height:\t" << vid_win.height << endl; out << "chromakey:\t" << vid_win.chromakey << endl; out << "flags:\t" << vid_win.flags << endl; out << "clipcount:\t" << vid_win.clipcount << endl; out << endl << endl; return 0; } // }}} int test_channel ( ostream & out, int dev, video_channel & vid_chan, int channels ) // {{{ { video_tuner vid_tun; video_audio vid_audio; //////////////////////// // Video Channel Test for ( int i = 0; i < channels; i++ ) { vid_chan.channel = i; if ( ioctl( dev, VIDIOCGCHAN, &vid_chan ) == -1 ) { cerr << "ioctl( VIDIOCGCHAN ) error!" << endl; return -1; } out << "There is the report of Video Channel[" << i << "] Test Below." << endl; out << "=====================================================" << endl; out << "channel:\t" << vid_chan.channel << endl; out << "name:\t" << vid_chan.name << endl; out << "tuners:\t" << vid_chan.tuners << endl; out << "flags:\t" << vid_chan.flags << endl; out << "type:\t" << vid_chan.type << endl; out << "norm:\t" << vid_chan.norm << endl; out << endl << endl; out << "flags field:" << endl; out << "---------------" << endl; if ( ( vid_chan.flags & VIDEO_VC_TUNER ) != 0 ) out << "VIDEO_VC_TUNER" << endl; if ( ( vid_chan.flags & VIDEO_VC_AUDIO ) != 0 ) out << "VIDEO_VC_AUDIO" << endl; out << endl << endl; out << "type field:" << endl; out << "---------------" << endl; if ( ( vid_chan.type & VIDEO_TYPE_TV ) != 0 ) out << "VIDEO_TYPE_TV" << endl; if ( ( vid_chan.type & VIDEO_TYPE_CAMERA ) != 0 ) out << "VIDEO_TYPE_CAMERA" << endl; out << endl << endl; if ( vid_chan.tuners > 0 ) { out << "Channel Sub Test" << endl; out << "----------------------------------" << endl; test_tuner ( out, dev, vid_tun, vid_chan.tuners ); } if ( ( vid_chan.flags & VIDEO_VC_AUDIO ) != 0 ) { out << "Channel Sub Test" << endl; out << "----------------------------------" << endl; test_audio ( out, dev, vid_audio ); } } return 0; } // }}} int test_image_properties ( ostream & out, int dev, video_picture & vid_pic ) // {{{ { //////////////////////// // Image Properties Test if ( ioctl( dev, VIDIOCGPICT, &vid_pic ) == -1 ) { cerr << "ioctl( VIDIOCGPICT ) error!" << endl; return -1; } // Image Properties Test report out << "There is the report of Image Properties Test Below." << endl; out << "=====================================================" << endl; out << "brightness:\t" << vid_pic.brightness << endl; out << "hue:\t" << vid_pic.hue << endl; out << "colour:\t" << vid_pic.colour << endl; out << "contrast:\t" << vid_pic.contrast << endl; out << "whiteness:\t" << vid_pic.whiteness << endl; out << "depth:\t" << vid_pic.depth << endl; out << "palette:\t" << vid_pic.palette << endl; out << endl << endl; out << "palette field:" << endl; out << "---------------" << endl; switch ( vid_pic.palette ) { case VIDEO_PALETTE_GREY: out << "VIDEO_PALETTE_GREY" << endl; break; case VIDEO_PALETTE_HI240: out << "VIDEO_PALETTE_HI240" << endl; break; case VIDEO_PALETTE_RGB565: out << "VIDEO_PALETTE_RGB565" << endl; break; case VIDEO_PALETTE_RGB24: out << "VIDEO_PALETTE_RGB24" << endl; break; case VIDEO_PALETTE_RGB32: out << "VIDEO_PALETTE_RGB32" << endl; break; case VIDEO_PALETTE_RGB555: out << "VIDEO_PALETTE_RGB555" << endl; break; case VIDEO_PALETTE_YUV422: out << "VIDEO_PALETTE_YUV422 or VIDEO_PALETTE_COMPONENT" << endl; break; case VIDEO_PALETTE_YUYV: out << "VIDEO_PALETTE_YUYV" << endl; break; case VIDEO_PALETTE_UYVY: out << "VIDEO_PALETTE_UYVY" << endl; break; case VIDEO_PALETTE_YUV420: out << "VIDEO_PALETTE_YUV420" << endl; break; case VIDEO_PALETTE_YUV411: out << "VIDEO_PALETTE_YUV411" << endl; break; case VIDEO_PALETTE_RAW: out << "VIDEO_PALETTE_RAW" << endl; break; case VIDEO_PALETTE_YUV422P: out << "VIDEO_PALETTE_YUV422P or VIDEO_PALETTE_PLANAR" << endl; break; case VIDEO_PALETTE_YUV411P: out << "VIDEO_PALETTE_YUV411P" << endl; break; case VIDEO_PALETTE_YUV420P: out << "VIDEO_PALETTE_YUV420P" << endl; break; case VIDEO_PALETTE_YUV410P: out << "VIDEO_PALETTE_YUV410P" << endl; break; } out << endl << endl; return 0; } // }}} int test_tuner ( ostream & out, int dev, video_tuner & vid_tun, int tuners ) // {{{ { //////////////////////// // Tuner Test if ( ioctl( dev, VIDIOCGTUNER, &vid_tun ) == -1 ) { cerr << "ioctl( VIDIOCGTUNER ) error!" << endl; return -1; } // Frame Buffer Test report for ( int i = 0; i < tuners; i++ ) { out << "There is the report of Tuner[" << i << "] Test Below." << endl; out << "-----------------------------------------------------" << endl; out << "tuner:\t" << vid_tun.tuner << endl; out << "name:\t" << vid_tun.name << endl; out << "rangelow:\t" << vid_tun.rangelow << endl; out << "rangehigh:\t" << vid_tun.rangehigh << endl; out << "flags:\t" << vid_tun.flags << endl; out << "mode:\t" << vid_tun.mode << endl; out << "signal:\t" << vid_tun.signal << endl; out << endl << endl; out << "flags field:" << endl; out << "---------------" << endl; if ( ( vid_tun.flags & VIDEO_TUNER_PAL ) != 0 ) out << "VIDEO_TUNER_PAL" << endl; if ( ( vid_tun.flags & VIDEO_TUNER_NTSC ) != 0 ) out << "VIDEO_TUNER_NTSC" << endl; if ( ( vid_tun.flags & VIDEO_TUNER_SECAM ) != 0 ) out << "VIDEO_TUNER_SECAM" << endl; if ( ( vid_tun.flags & VIDEO_TUNER_LOW ) != 0 ) out << "VIDEO_TUNER_LOW" << endl; if ( ( vid_tun.flags & VIDEO_TUNER_NORM ) != 0 ) out << "VIDEO_TUNER_NORM" << endl; if ( ( vid_tun.flags & VIDEO_TUNER_STEREO_ON ) != 0 ) out << "VIDEO_TUNER_STEREO_ON" << endl; if ( ( vid_tun.flags & VIDEO_TUNER_RDS_ON ) != 0 ) out << "VIDEO_TUNER_RDS_ON" << endl; if ( ( vid_tun.flags & VIDEO_TUNER_MBS_ON ) != 0 ) out << "VIDEO_TUNER_MBS_ON" << endl; out << endl << endl; out << "mode field:" << endl; out << "---------------" << endl; if ( ( vid_tun.mode & VIDEO_MODE_PAL ) != 0 ) out << "VIDEO_MODE_PAL" << endl; if ( ( vid_tun.mode & VIDEO_MODE_NTSC ) != 0 ) out << "VIDEO_MODE_NTSC" << endl; if ( ( vid_tun.mode & VIDEO_MODE_SECAM ) != 0 ) out << "VIDEO_MODE_SECAM" << endl; if ( ( vid_tun.mode & VIDEO_MODE_AUTO ) != 0 ) out << "VIDEO_MODE_AUTO" << endl; out << endl << endl; } return 0; } // }}} int test_audio ( ostream & out, int dev, video_audio & vid_audio ) // {{{ { //////////////////////// // Audio Test if ( ioctl( dev, VIDIOCGAUDIO, &vid_audio ) == -1 ) { cerr << "ioctl( VIDIOCGAUDIO ) error!" << endl; return -1; } // Audio Test report out << "There is the report of Audio Test Below." << endl; out << "-----------------------------------------------------" << endl; out << "audio:\t" << vid_audio.audio << endl; out << "volume:\t" << vid_audio.volume << endl; out << "treble:\t" << vid_audio.treble << endl; out << "flags:\t" << vid_audio.flags << endl; out << "name:\t" << vid_audio.name << endl; out << "mode:\t" << vid_audio.mode << endl; out << "balance:\t" << vid_audio.balance << endl; out << "step:\t" << vid_audio.step << endl; out << endl << endl; out << "flags field:" << endl; out << "---------------" << endl; if ( ( vid_audio.flags & VIDEO_AUDIO_MUTE ) != 0 ) out << "VIDEO_AUDIO_MUTE" << endl; if ( ( vid_audio.flags & VIDEO_AUDIO_MUTABLE ) != 0 ) out << "VIDEO_AUDIO_MUTABLE" << endl; if ( ( vid_audio.flags & VIDEO_AUDIO_VOLUME ) != 0 ) out << "VIDEO_AUDIO_VOLUME" << endl; if ( ( vid_audio.flags & VIDEO_AUDIO_BASS ) != 0 ) out << "VIDEO_AUDIO_BASS" << endl; if ( ( vid_audio.flags & VIDEO_AUDIO_TREBLE ) != 0 ) out << "VIDEO_AUDIO_TREBLE" << endl; if ( ( vid_audio.flags & VIDEO_AUDIO_BALANCE ) != 0 ) out << "VIDEO_AUDIO_BALANCE" << endl; out << endl << endl; out << "mode field:" << endl; out << "---------------" << endl; if ( ( vid_audio.mode & VIDEO_SOUND_MONO ) != 0 ) out << "VIDEO_SOUND_MONO" << endl; if ( ( vid_audio.mode & VIDEO_SOUND_STEREO ) != 0 ) out << "VIDEO_SOUND_STEREO" << endl; if ( ( vid_audio.mode & VIDEO_SOUND_LANG1 ) != 0 ) out << "VIDEO_SOUND_LANG1" << endl; if ( ( vid_audio.mode & VIDEO_SOUND_LANG2 ) != 0 ) out << "VIDEO_SOUND_LANG2" << endl; out << endl << endl; return 0; } // }}}