📄 conference.h
字号:
PMutex mutex;
BOOL forceScreenSplit;
VideoFrameStoreList frameStores; // list of framestores for data
PBYTEArray imageStore; // temporary conversion store
PColourConverter * converter; // CIF to QCIF converter
};
#if ENABLE_TEST_ROOMS
class TestVideoMixer : public MCUSimpleVideoMixer
{
public:
TestVideoMixer(unsigned frames);
BOOL AddVideoSource(ConferenceMemberId id, ConferenceMember & mbr);
BOOL WriteFrame(ConferenceMemberId id, const void * buffer, int width, int height, PINDEX amount);
BOOL ReadFrame(ConferenceMember &, void * buffer, int width, int height, PINDEX & amount);
protected:
unsigned frames;
BOOL allocated;
};
#endif // ENABLE_TEST_ROOMS
#if ENABLE_ECHO_MIXER
class EchoVideoMixer : public MCUSimpleVideoMixer
{
public:
EchoVideoMixer();
BOOL AddVideoSource(ConferenceMemberId id, ConferenceMember & mbr);
BOOL WriteFrame(ConferenceMemberId id, const void * buffer, int width, int height, PINDEX amount);
BOOL ReadFrame(ConferenceMember &, void * buffer, int width, int height, PINDEX & amount);
};
#endif
////////////////////////////////////////////////////
#endif // OPENMCU_VIDEO
////////////////////////////////////////////////////
class Conference;
/**
* this class describes a connection between a conference member and a conference
* each conference member has one instance of class for every other member of the conference
*/
class ConferenceConnection : public PObject {
PCLASSINFO(ConferenceConnection, PObject);
public:
ConferenceConnection(ConferenceMemberId _id);
~ConferenceConnection();
ConferenceMemberId GetID() const
{ return id; }
#ifdef _WIN32
#pragma warning(push)
#pragma warning(disable:4311)
#endif
virtual PString GetName() const
#ifdef P_64BIT
{ return psprintf("%lli", id); }
#else
{ return PString(PString::Unsigned, (unsigned)id); }
#endif
#ifdef _WIN32
#pragma warning(pop)
#endif
virtual void OnUserInputIndication(const PString &)
{ }
void WriteAudio(ConferenceMemberId source, const void * buffer, PINDEX amount);
void Write(const BYTE * ptr, PINDEX amount);
void ReadAudio(BYTE * ptr, PINDEX amount);
void ReadAndMixAudio(BYTE * ptr, PINDEX amount, PINDEX channels);
protected:
Conference * conference;
ConferenceMemberId id;
void Mix(BYTE * dst, const BYTE * src, PINDEX count, PINDEX channels);
BYTE * buffer;
PINDEX bufferLen; ///Number of bytes unread in the buffer.
PINDEX bufferStart; ///Current position in the buffer.
PINDEX bufferSize; ///Total number of bytes in buffer. Never gets changed.
PMutex audioBufferMutex;
};
////////////////////////////////////////////////////
/**
* this class describes a member of a conference
*/
class ConferenceManager;
class ConferenceMember : public PObject
{
PCLASSINFO(ConferenceMember, PObject);
public:
typedef std::map<ConferenceMemberId, ConferenceConnection *> ConnectionListType;
typedef std::map<ConferenceMemberId, ConferenceMember *> MemberListType;
/**
* create a new conference member. The single parameter is an "id" (usually a pointer)
* that can used to identify this member unambiguously
*/
ConferenceMember(Conference * conference, ConferenceMemberId id, BOOL isMCU = FALSE);
/**
* destroy the conference member
*/
~ConferenceMember();
/**
* used to pre-emptively close a members connection
*/
virtual void Close()
{ }
/**
* used to add a conference member to a conference. This is not done in the constructor
* as some conference members have non-trivial startup requirements
*/
virtual BOOL AddToConference(Conference * conference);
/**
* used to remove a conference member from a conference. This is not done in the destructor
* as some conference members have non-trivial shutdown requirements
*/
virtual void RemoveFromConference();
/**
* If this returns TRUE, the conference member will be visible in all publically displayed
* conference lists. It will always be visible in the console displays
*/
virtual BOOL IsVisible() const
{ return TRUE; }
/**
* return the conference member ID
*/
ConferenceMemberId GetID() const
{ return id; }
PTime GetStartTime() const
{ return startTime; }
#ifdef _WIN32
#pragma warning(push)
#pragma warning(disable:4311)
#endif
/**
* return the title that should be used for the conference member
*/
virtual PString GetTitle() const
#ifdef P_64BIT
{ return psprintf("%lli", id); }
#else
{ return PString(PString::Unsigned, (unsigned)id); }
#endif
#ifdef _WIN32
#pragma warning(pop)
#endif
/**
* return the conference this member belongs to
*/
Conference * GetConference()
{ return conference; }
/**
* add a new connection for the specified member to this member to the internal list of connections
*/
virtual void AddConnection(ConferenceMember * newMember);
/**
* remove any connections belong to the specified ID from the internal list of connections
*/
virtual void RemoveConnection(ConferenceMemberId id);
/**
* This is called when the conference member want to send a user input indication to the the conference.
* By default, this routines calls OnReceivedUserInputIndication for all of the other conference members
*/
virtual void SendUserInputIndication(const PString & str);
/**
* this virtual function is called when the conference sends a user input indication to the endpoint
* the conference
*/
virtual void OnReceivedUserInputIndication(const PString & str)
{ }
/**
* Called when the conference member want to send audio data to the cofnerence
*/
virtual void WriteAudio(const void * buffer, PINDEX amount);
/**
* Called when the conference member wants to read a block of audio from the conference
* By default, this calls ReadMemberAudio on the conference
*/
virtual void ReadAudio(void * buffer, PINDEX amount);
/**
* Called when another conference member wants to send audio to the endpoint
* By default, the audio is added to the queue for the specified member
* so it can be retreived by a later call to OnIncomingAudio
*/
virtual void OnExternalSendAudio(ConferenceMemberId id, const void * buffer, PINDEX amount);
/**
* called when another conference member wants to write a video frame to this endpoint
* this will only be called when the conference is not "use same video for all members"
*/
virtual void OnExternalSetAudioLevel(ConferenceMemberId id, unsigned audioLevel);
#if OPENMCU_VIDEO
/**
* Called when the conference member wants to send video data to the conference
*/
virtual void WriteVideo(const void * buffer, int width, int height, PINDEX amount);
/**
* Called when a conference member wants to read a block of video from the conference
* By default, this calls ReadMemberVideo on the conference
*/
virtual void ReadVideo(void * buffer, int width, int height, PINDEX & amount);
/**
* Called when another conference member wants to read video from the endpoint
* UnlockExternalVideo must be called after video has been used
*/
virtual void * OnExternalReadVideo(ConferenceMemberId /*id*/, int width, int height, PINDEX & /*amount*/);
virtual void UnlockExternalVideo();
/**
* called when another conference member wants to write a video frame to this endpoint
* this will only be called when the conference is not "use same video for all members"
*/
virtual void OnExternalSendVideo(ConferenceMemberId id, const void * buffer, int width, int height, PINDEX amount);
/**
* called to when a new video source added
*/
virtual BOOL AddVideoSource(ConferenceMemberId id);
/**
* called to when a new video source removed
*/
virtual void RemoveVideoSource(ConferenceMemberId id);
virtual BOOL OnIncomingVideo(const void * buffer, int width, int height, PINDEX amount);
virtual BOOL OnOutgoingVideo(void * buffer, int width, int height, PINDEX & amount);
double GetVideoTxFrameRate() const
{
if (totalVideoFramesSent == 0)
return 0.0;
else
return totalVideoFramesSent * 1000.0 / ((PTime() - firstFrameSendTime).GetMilliSeconds()); }
double GetVideoRxFrameRate() const
{
if (totalVideoFramesReceived == 0)
return 0.0;
else
return totalVideoFramesReceived * 1000.0 / ((PTime() - firstFrameReceiveTime).GetMilliSeconds());
}
#endif
/*
* Used to create a conference connection for this member
*/
virtual ConferenceConnection * CreateConnection() = 0;
void WaitForClose()
{ lock.WaitForClose(); }
/*
* used to output monitor information for the member
*/
virtual PString GetMonitorInfo(const PString & hdr);
ConnectionListType & GetConnectionList()
{ return connectionList; }
unsigned GetAudioLevel() const
{ return audioLevel; }
virtual int GetTerminalNumber() const { return terminalNumber; }
virtual void SetTerminalNumber(int n) { terminalNumber = n; }
void SetJoined(BOOL isJoinedNow)
{ memberIsJoined = isJoinedNow; }
BOOL IsJoined() const
{ return memberIsJoined; }
BOOL IsMCU() const
{ return isMCU; }
protected:
Conference * conference;
ConferenceMemberId id;
BOOL memberIsJoined;
MCULock lock;
ConnectionListType connectionList;
MemberListType memberList;
PTime startTime;
unsigned audioLevel;
int terminalNumber;
BOOL isMCU;
#if OPENMCU_VIDEO
//PMutex videoMutex;
MCUVideoMixer * videoMixer;
VideoFrameStoreList memberFrameStores;
PMutex memberFrameStoreMutex;
PColourConverter * fsConverter;
PTime firstFrameSendTime;
PINDEX totalVideoFramesSent;
PTime firstFrameReceiveTime;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -