⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net_av.cpp

📁 实时监控
💻 CPP
字号:
#include "stdafx.h"
#include "net_av.h"
#include "../NetDef.h"

#include "safe_destroy.h"

// added 2003-10-25, for another decoder lib
#include "../../decoder.h"
#include "../../decoder_factory.h"

extern ULONG use_mpeg4;
int   nCurListenGroup = 0, nPreListenGroup = 0 ;

//////////////////////////////////////////////////////////////////////////

COLOR_SPACE net_av::cs = csAUTO;
BOOL net_av::video_mem = TRUE;

//##ModelId=3F9A1D240377
void net_av::init_audio()
{
	;
}

//##ModelId=3F9A1D24038B
void net_av::free_audio()
{
	;
}

//##ModelId=3F9A1D2403D1
void net_av::clear_audio()
{
}

//##ModelId=3F9A1D240395
void net_av::switch_audio(int group)
{
	if (nCurListenGroup < 0)  {  //mute
		nPreListenGroup = group ;
	}
	else  { //normal
		nPreListenGroup = nCurListenGroup ;
		nCurListenGroup = group ;
	}
}

//##ModelId=3F9A1D2403AA
void net_av::mute()
{
	nCurListenGroup = -1 ;
}

//##ModelId=3F9A1D2403BD
void net_av::unmute()
{
	nCurListenGroup = nPreListenGroup ;
}

//##ModelId=3F9A1D2403C7
bool net_av::is_muted()
{
	return (nCurListenGroup < 0) ;
}

//##ModelId=3F9A1D24039F
void net_av::mute_toggle()
{
	if( is_muted() )
		unmute();
	else
		mute();
}

//##ModelId=3F9A1D2403DB
int net_av::get_audio_group()
{
	return nCurListenGroup ;
}

//////////////////////////////////////////////////////////////////////////
// net_av 类
//##ModelId=3F9A1D2403E5
net_av::net_av(int idx):
remote_ip(0), remote_port(0), chnl(0)//, tick(0)
, exit(false)
, cb(NULL), index(idx)
, dec(NULL)
{
	bits = 0;
	bitrate = 0;
	bitrate_1 = 0;
	bitrate_2 = 0;
	bitrate_3 = 0;
	bitrate_4 = 0;
}

//##ModelId=3F9A1D250007
net_av::~net_av()
{
}

// 视频/音频多播数据(从net_udp::got_something())到这里
//##ModelId=3F9A1D240254
//extern int m_tttt;
void net_av::on_net_udp_recv(byte* buf, int length, net_addr* from)
{
	if( exit )
		return;
	if(dec)
	{
		dec->push_data(buf, length);
		bits += length;
	}
}

/*
 *	创建对象, 分配资源(启动解码线程等)
 */
//##ModelId=3F9A1D250011
bool net_av::create(net_addr& addr)
{
	exit = false;
	
	if( !net_mcast::create(addr) )
	{
		return false;
	}
/*
	if( !decode_timer.start(INTERVAL, request_decode, (DWORD)this) )
	{
		MessageBox(NULL, _T("Error: Failed to start timer."), _T("Timer error"), MB_OK | MB_ICONERROR);
		destroy();
		return false;
	}
*/
	//dec = decoder_factory::create(DECODER_H263, index, cb);
	dec = decoder_factory::create(use_mpeg4 != 0, index, cb, cs, video_mem, TRUE);
	
    //m_str.Format("../data/ggg%d.date",m_testclientsk++);
	if( !dec )
	{
		MessageBox(NULL, _T("Error: Failed to initialize decoder component."), _T("Decoder failure"), MB_OK | MB_ICONERROR);
		destroy();
		return false;
	}
//	dec->set_sound_out(snd_decoder);

	return true;
}

/*
 *	销毁对象, 关闭解码线程
 */
//##ModelId=3F9A1D25001C
void net_av::destroy()
{
	exit = true;
	decoder_factory::destroy(index);
	safe_destroy(dec);	
	//decoder * p_temdec = dec;
	//dec = NULL;
	//问题就出现在这!!!

	//vedio_channel和net_mcast两处的destroy出问题
	
	net_mcast::destroy();
}

/*
 *	加入多播组, 打开实时图像
 */
//##ModelId=3F9A1D250026
bool net_av::join(net_addr& mc_addr, int ttl, BOOL loopback, BOOL image_type)
{
// 	decoder->parent = this;
	
	return net_mcast::join(mc_addr, ttl, loopback, image_type);
}

/*
 *	退出多播组, 关闭实时图像
 */
//##ModelId=3F9A1D250043
void net_av::leave()
{
	/*if( cb )
	{
		SEND_NOTIFY(cb, NTM_CMD_CHANNEL_CLOSED, remote_ip, MAKEDWORD(remote_port, chnl));
		cb = NULL;
	}*/
    cb = NULL;
	remote_ip = 0;
	remote_port = 0;
	chnl = 0;
	net_mcast::leave();

	destroy();
}

//##ModelId=3F9A1D250045
bool net_av::open_channel(ULONG ip, USHORT port, ULONG mip, USHORT mport, int channel)
{
	remote_ip = ip;
	remote_port = port;
	chnl = channel;

//	if( chnl == audio_group )
//		clear_audio();

	if( !create(net_addr((ULONG)0, mport)) )             //创建解码线程
		return false;

	//fprintf(fppppp, "create decode ok!! : ip = %ld,  port = %u, channel = %u\n",ip, port, channel) ;

	bool result = false;
	if(channel == -1)
		result = join(net_addr(mip, mport), 8, FALSE, FALSE);    //创建网络线程
	else 
		result = join(net_addr(mip, mport), 8, FALSE, TRUE);    //创建网络线程

	if(!result)
	{
		destroy();
		return false;
	}
	//fprintf(fppppp, "create netware ok!! : ip = %ld,  port = %u, channel = %u\n",ip, port, channel) ;

	POST_NOTIFY(cb, NTM_CMD_CHANNEL_OPENED, ip, MAKEDWORD(port, channel));
	return true;
}

//##ModelId=3F9A1D25006B
void net_av::close_channel(ULONG ip, USHORT port, int channel)
{
	if( remote_ip == ip &&
		remote_port == port &&
		chnl == channel )
		leave();
}

//##ModelId=3F9A1D250080
void net_av::logout(ULONG ip, USHORT port)
{
	if( remote_ip == ip &&
		remote_port == port )
		leave();
}

//##ModelId=3F9A1D250093
ULONG net_av::svr_ip() const
{
	return remote_ip;
}

//##ModelId=3F9A1D25009D
USHORT net_av::svr_port() const
{
	return remote_port;
}

//##ModelId=3F9A1D25009F
int net_av::svr_chnl() const
{
	return chnl;
}

//##ModelId=3F9A1D2500A8
bool net_av::is_opened() const
{
	return remote_ip != 0;
}

//##ModelId=3F9A1D2500BB
bool net_av::snapshot(LPCTSTR bmpfile)
{
	if( dec )
		dec->snapshot(bmpfile);
	return true;
}

void net_av::set_cb(VIDEO_CALLEE vcb)
{
	cb = vcb;
	if( IsWindow(vcb))
		update_window();
}
BOOL net_av::set_cb_showhandle(VIDEO_CALLEE cb)
{
	if(dec)
		return dec->set_cb_showhandle(cb);
	return FALSE;
}


//##ModelId=3F9A1D2500C5
void net_av::set_cb(VIDEO_CALLEE vcb, ULONG ip, USHORT port, LONG channel)
{
	cb = vcb;
	remote_ip = ip;
	remote_port = port;
	chnl = channel;

	if(IsWindow(vcb))
		update_window();
}


//##ModelId=3F9A1D2500CF
void net_av::update_window()
{
	if( dec )
		dec->update_pos();
}

//##ModelId=3F9A1D2500D0
void net_av::set_video_renderer(COLOR_SPACE _cs, BOOL _video_mem)
{
	cs = _cs;
	video_mem = _video_mem;
}

void net_av::lr_begin(TCHAR drive)
{
	if( dec )
		dec->lr_begin(drive, chnl);
}

void net_av::lr_end()
{
	//if( !lc.lr_is_recording() )
	//	return;
	
	//lc.lr_end();
	if( dec )
		dec->lr_end();
}

void net_av::lr_get_drive(TCHAR* drive)
{
	if( !dec )
		*drive = 0;
	else
		*drive = dec->lr_get_drive();
}

struct __rebuild{};

void net_av::set_play_mode(int mode)
{
	if( dec )
		dec->set_play_mode(mode);
}

void net_av::go()
{
	if( dec )
		dec->go();
}

void net_av::draw()
{
	if( dec )
		dec->draw();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -