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;

} // }}}