gusucode.com > 嵌入式linux系统的网络编程源码程序 > 嵌入式linux系统的网络编程源码程序/视频会议源码/video_send.cpp

    ///////////////////////////////////////////////////////
// FileName:	video_send.cpp
// Author:		b1gm0use
// Project:		myvideo

#include <iostream>
#include <qapplication.h>
#include <string.h>
#include <qsemaphore.h>

#include "capture_event.h"
#include "video_send.h"
#include "video.h"
#include "avi.h"

using namespace std;

///////////////////////////////////////////////////////
// Public Functions
///////////////////////////////////////////////////////

void dump_image ( const BUFF * image, size_t size, const char * filename );

// 构造函数
video_send::video_send ( avi * avi_ptr_in ) // {{{
{
	verbose_output( 2, "create video_send" );

	vp = NULL;

	last_image[0] = last_image[1] = last_image[2] = NULL;

	frame = 0;

	avi_ptr = avi_ptr_in;

} // }}}


// 析构函数
video_send::~video_send ( void ) // {{{
{
	delete [] last_image[0];
	delete [] last_image[1];
	delete [] last_image[2];

} // }}}
	
// 初始化函数
int video_send::init ( VideoPlayer * vp_in ) // {{{
{
	vp =  vp_in;

	//开辟缓冲区
	last_image[0] = new BUFF [ avi_ptr->video_opt.min_width * avi_ptr->video_opt.factor * avi_ptr->video_opt.min_height * avi_ptr->video_opt.factor * 3 ];
	last_image[1] = new BUFF [ avi_ptr->video_opt.min_width * avi_ptr->video_opt.factor * avi_ptr->video_opt.min_height * avi_ptr->video_opt.factor * 3 ];
	last_image[2] = new BUFF [ avi_ptr->video_opt.min_width * avi_ptr->video_opt.factor * avi_ptr->video_opt.min_height * avi_ptr->video_opt.factor * 3 ];

	return 0;

} // }}}


// 发送捕捉图像完成的消息
// 维护两个缓冲区,交替使用
// 这个函数中的缓冲区有待优化
int video_send::send_image ( const BUFF * image, int size ) // {{{
{

	verbose_output( 2, "create video_send" );

	(*(avi_ptr->video_send_semaphore))++;
	memcpy( last_image[frame], image, size );
	(*(avi_ptr->video_send_semaphore))--;
	
	//发送消息
	capture_event * event = new capture_event( VIDEO_EVENT, last_image[frame], size );

	verbose_output( 3, "sending new image change event." );

	QApplication::postEvent( (QObject *) vp, (QEvent *) event );

	frame = ( frame + 1 ) % 3;

	return 0;

} // }}}