csdn编辑器真难用啊,或许是刚开始还不熟悉。
#include <iostream>
#include <vector>
#include <utility>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#if 0
using namespace std;
typedef void (*pfunc)(void);
void func_test(void)
{
cout << "func_test called" << endl;
}
int main (int argc,char *argv[])
{
pair <string,double> product1 ("tomatoes",3.25);
pair <string,double> product2;
pair <string,double> product3;
product2.first = "lightbulbs"; // type of first is string
product2.second = 0.99; // type of second is double
product3 = make_pair ("shoes",20.0);
cout << "the price of " << product1.first << " is $" << product1.second << "\n";
cout << "the price of " << product2.first << " is $" << product2.second << "\n";
cout << "the price of " << product3.first << " is $" << product3.second << "\n";
pair <string,double> product4;
product4 = pair<string,double>("shoes4",20.0);
cout << "the price of " << product4.first << " is $" << product4.second << "\n";
pfunc tmyfunc;
tmyfunc = func_test;
//tmyfunc();
(*tmyfunc)();
pair <string,pfunc> product5("fptr",tmyfunc);
cout << "the price of " << product5.first << " is $" << product5.second << "\n";
cout << "tmyfunc addr: " << tmyfunc << "\n";
return 0;
}
#else
/*
arm-hisi-linux-g++ pair.cpp 通过
g++没编译通过
arm-hisi-linux-g++ -v
...............................
gcc version 3.4.3 (release) (CodeSourcery ARM Q3cvs 2004)
g++ -v
...............................
gcc 版本 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1)
为了在32ch dvr使用rtsp,写了此demo先测试。每一个ch视频源就是一个rtspserver。
创建32个线程来capture和send太费资源。鉴于客户可以接受同时随机访问
8个ch,因此就可以创建8个资源(rtsp sever)供32个使用者使用。最终封装接口
AddRtspServer(chn)/DelRtspServer(),所有的逻辑/功能都包括了。
此demo增加模板T的话可以实现一个通用的资源申请/资源释放模型
template <typename T>
AddResource(T)/DelResource(T)
一段时间后发现用fastdelegate也可以很方便的实现此需求
CRtspServer 被绑定对象
CRtspManager 主动绑定
逻辑在CRtspManager实现
*/
class CRtspServer
{
public:
CRtspServer();
virtual ~CRtspServer();
void Start(int chn,int stream);
void Stop(void);
public:
int m_id; //only for test
//private:
int m_chn;
int m_stream;
};
/ 单件模式
#define PATTERN_SINGLETON_DECLARE(classname) \
static classname * instance();
#define PATTERN_SINGLETON_IMPLEMENT(classname) \
classname * classname::instance() \
{ \
static classname * _instance = NULL; \
if( NULL == _instance) \
{ \
_instance = new classname; \
} \
return _instance; \
}
/
#define ID_RTSP_BASE 0x1000
#define MAX_NRTSPSERVER 8
typedef std::pair <int,CRtspServer *> pair_rtsp;
typedef std::vector < pair_rtsp >::iterator pair_rtsp_iter;
typedef std::vector <pair_rtsp> pair_rtsp_vect;
template<typename T>
bool AddResoure(int id,T &t)
{
}
class CRtspManager
{
public:
PATTERN_SINGLETON_DECLARE(CRtspManager);
CRtspManager();
virtual ~CRtspManager();
void Start(int port=554);
void Stop();
int GetPort() const;
public:
bool PushRtspServer(int chn, CRtspServer *pserver);
bool AddRtspServer(int chn,int stream=0);
bool AddRtspServer(int chn, CRtspServer **ppserver);
void DelRtspServer();
void DelRtspServer(int chn);
void DelRtspServer(int chn, CRtspServer **pserver);
void GetVRtspServer(pair_rtsp_vect &vr) const;
pair_rtsp_vect GetVRtspServer() const;
void DumpVrtsp();
private:
int Rtspd_Start(int port);
int Rtspd_Stop(void);
int Rtspd_Resume(void);
int Rtspd_Pause(void);
private:
int m_nport;
pair_rtsp_vect m_vrtspserver;
public:
int m_nserver;
CRtspServer *m_prtsp[MAX_NRTSPSERVER];
};
CRtspServer::CRtspServer()
{
m_chn = 0;
m_stream = 0;
m_id = m_chn + ID_RTSP_BASE;
}
CRtspServer::~CRtspServer()
{
Stop();
}
void CRtspServer::Start(int chn,int stream)
{
m_chn = chn;
m_stream = stream;
printf("CRtspServer::Start,ch(%d),stream(%d),id(0x%04x)\n",m_chn,m_stream,m_id);
}
void CRtspServer::Stop(void)
{
printf("CRtspServer::Stop,ch(%d),stream(%d),id(0x%04x)\n",m_chn,m_stream,m_id);
}
#define g_RtspManager (*CRtspManager::instance())
PATTERN_SINGLETON_IMPLEMENT(CRtspManager);
CRtspManager::CRtspManager()
:m_nport(554)
{
}
CRtspManager::~CRtspManager()
{
}
bool CRtspManager::PushRtspServer(int chn, CRtspServer *pserver)
{
size_t len = m_vrtspserver.size();
if(len >= MAX_NRTSPSERVER)
{
printf("PushRtspServer,len(%d) exceed max\n",len);
return false;
}
pair_rtsp pPair(chn,pserver);
if(pPair.second)
{
m_vrtspserver.push_back(pPair);
m_nserver = m_nserver + 1;
//pserver->Start(chn,pserver->m_stream);
m_vrtspserver.back().second->Start(chn,pPair.second->m_stream);
printf("PushRtspServer,ch(%d),stream(%d),id(0x%04x),m_nserver(%d)\n",
chn,pPair.second->m_stream,pPair.second->m_id,m_nserver);
return true;
}
printf("PushRtspServer,ch(%d) failed,PLS new CRtspServer\n",chn);
return false;
}
bool CRtspManager::AddRtspServer(int chn,int stream)
{
//lock
pair_rtsp_iter iter;
for(iter = m_vrtspserver.begin(); iter != m_vrtspserver.end(); iter++)
{
if((iter->second->m_chn == chn) && (iter->second->m_stream == stream))
{
printf("AddRtspServer,ch(%d) stream(%d) has exist\n",chn,stream);
return true;
}
}
bool ret = false;
CRtspServer *pserver = new CRtspServer();
pserver->m_stream = stream;
pserver->m_chn = chn;
pserver->m_id = 2*chn + stream + ID_RTSP_BASE;
ret = PushRtspServer(chn,pserver);
return ret;
}
bool CRtspManager::AddRtspServer(int chn, CRtspServer **ppserver)
{
//lock
bool ret = false;
pair_rtsp pPair(chn,*ppserver);
pair_rtsp_iter iter;
iter = find(m_vrtspserver.begin(), m_vrtspserver.end(), pPair);
if(iter == m_vrtspserver.end()) //not found
{
ret = PushRtspServer(chn,*ppserver);
}
else
{
}
return ret;
}
void CRtspManager::DelRtspServer()
{
//lock
printf("DelRtspServer,del all\n");
if(m_vrtspserver.empty())
{
printf("DelRtspServer,veter empty\n");
return;
}
pair_rtsp_iter iter;
for(iter = m_vrtspserver.begin(); iter != m_vrtspserver.end(); iter++)
{
if(iter->second)
{
printf("\nDelRtspServer,dle ch(%d),stream(%d),id(0x%04x)\n",
iter->second->m_chn,iter->second->m_stream,iter->second->m_id);
delete iter->second;
iter->second = NULL;
}
}
m_vrtspserver.clear();
printf("DelRtspServer,del all ~~~\n");
m_vrtspserver.~ vector <pair_rtsp>();
m_nserver = 0;
}
void CRtspManager::DelRtspServer(int chn)
{
//lock
printf("DelRtspServer,del single chn(%d)\n");
if(m_vrtspserver.empty())
{
printf("DelRtspServer,veter empty\n");
return;
}
pair_rtsp_iter iter;
for(iter = m_vrtspserver.begin(); iter != m_vrtspserver.end(); iter++)
{
if( (iter->second) && (iter->second->m_chn == chn) )
{
printf("\nDelRtspServer,dle ch(%d),stream(%d),id(0x%04x)\n",
iter->second->m_chn,iter->second->m_stream,iter->second->m_id);
delete iter->second;
iter->second = NULL;
m_vrtspserver.erase(iter);
m_nserver = m_nserver - 1;
return;
}
else
{
}
}
printf("DelRtspServer,ch(%d) has del or no\n",chn);
}
void CRtspManager::DelRtspServer(int chn, CRtspServer **pserver)
{
//lock
assert(*pserver);
if(m_vrtspserver.empty())
{
printf("DelRtspServer,veter empty\n");
return;
}
pair_rtsp pPair(chn,*pserver);
pair_rtsp_iter iter;
iter = find(m_vrtspserver.begin(), m_vrtspserver.end(), pPair);
if(iter != m_vrtspserver.end()) //found
{
printf("\nDelRtspServer,dle ch(%d),stream(%d),id(0x%04x)\n",
iter->second->m_chn,iter->second->m_stream,iter->second->m_id);
delete *pserver;
*pserver = NULL;
m_vrtspserver.erase(iter);
m_nserver = m_nserver - 1;
}
else
{
printf("DelRtspServer,ch(%d) has del or no\n",chn);
}
}
void CRtspManager::GetVRtspServer(pair_rtsp_vect &vr) const
{
vr = m_vrtspserver;
}
pair_rtsp_vect CRtspManager::GetVRtspServer() const
{
return m_vrtspserver;
}
void CRtspManager::DumpVrtsp()
{
if(m_vrtspserver.empty())
{
printf("DumpVrtsp,veter empty\n");
return;
}
size_t len = m_vrtspserver.size();
printf("Vrtsp,len(%d)\n",len);
pair_rtsp_iter iter;
for(iter = m_vrtspserver.begin(); iter != m_vrtspserver.end(); iter++)
{
printf("Vrtsp,id(0x%04x),ch(%d)\n",iter->second->m_id,iter->second->m_chn);
}
}
void CRtspManager::Start(int port)
{
m_nserver = 0;
m_nport = port;
for (int i = 0; i < 0; i++)
{
m_prtsp[i] = new CRtspServer();
m_prtsp[i]->m_chn = i;
m_prtsp[i]->m_id = i + ID_RTSP_BASE;
if(AddRtspServer(m_prtsp[i]->m_chn,&g_RtspManager.m_prtsp[g_RtspManager.m_nserver]))
{
printf("CRtspManager::Start,AddRtspServer[%d] ok\n\n",g_RtspManager.m_nserver);
}
}
for (int i = 0; i < 6; i++)
{
AddRtspServer(i);
}
//sub stream
}
int main (int argc,char *argv[])
{
pair_rtsp_vect m_vrtspserver;
g_RtspManager.Start();
g_RtspManager.GetVRtspServer(m_vrtspserver);
g_RtspManager.DumpVrtsp();
#if 0
printf("\n000##################\n");
g_RtspManager.AddRtspServer(1,&g_RtspManager.m_prtsp[g_RtspManager.m_nserver]);
g_RtspManager.m_prtsp[g_RtspManager.m_nserver] = new CRtspServer();
g_RtspManager.m_prtsp[g_RtspManager.m_nserver]->m_chn = 68;
g_RtspManager.m_prtsp[g_RtspManager.m_nserver]->m_id = ID_RTSP_BASE +
g_RtspManager.m_prtsp[g_RtspManager.m_nserver]->m_chn;
g_RtspManager.AddRtspServer(68,&g_RtspManager.m_prtsp[g_RtspManager.m_nserver]);
g_RtspManager.AddRtspServer(69);
g_RtspManager.DumpVrtsp();
//g_RtspManager.DelRtspServer();
printf("\n111##################\n");
g_RtspManager.DelRtspServer(2,&g_RtspManager.m_prtsp[2]);
g_RtspManager.DumpVrtsp();
#endif
printf("\n222##################\n");
g_RtspManager.AddRtspServer(3);
g_RtspManager.AddRtspServer(68);
g_RtspManager.AddRtspServer(100);
g_RtspManager.DumpVrtsp();
printf("\n333##################\n");
g_RtspManager.DelRtspServer(200);
g_RtspManager.DelRtspServer(100);
g_RtspManager.DelRtspServer(68);
g_RtspManager.AddRtspServer(101,0);
g_RtspManager.AddRtspServer(101,1);
g_RtspManager.AddRtspServer(101,1);
g_RtspManager.AddRtspServer(102);
g_RtspManager.DumpVrtsp();
printf("\n444##################\n");
g_RtspManager.DelRtspServer();
g_RtspManager.DumpVrtsp();
return 0;
}
#endif