📄 net_av.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 + -