📄 conference.h
字号:
/*
* conference.h
*
* Conferencing functions for a simple MCU
*
* Copyright (c) 2000 Equivalence Pty. Ltd.
* Copyright (c) 2004 Post Increment
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is Portable Windows Library.x
*
* The Initial Developer of the Original Code is Equivalence Pty. Ltd.
*
* Portions of ths code were written by by Post Increment (http://www.postincrement.com)
* with the assistance of funding from Stonevoice, slc. http://www.stonevoice.com
*
* Portions of this code were written by Post Increment (http://www.postincrement.com)
* with the assistance of funding from Citron Networks (http://www.citron.com.tw)
*
* Contributor(s): Derek J Smithies (derek@indranet.co.nz)
* Craig Southeren (craig@postincrement.com)
*
* $Log: conference.h,v $
* Revision 1.1 2007/10/17 19:44:29 shorne
* Initial Commit
*
* Revision 2.15 2006/08/07 06:18:22 csoutheren
* Fix detection of MCU members
* Add auto-removal of conferences only containing MCU members
*
* Revision 2.14 2006/07/21 08:01:40 csoutheren
* Fixed conference member detect
* Re-factored video mixer code slightly
*
* Revision 2.13 2006/07/21 05:52:51 csoutheren
* Add flag to indicate if remote endpoint is an MCU
*
* Revision 2.12 2006/07/21 05:08:03 csoutheren
* Stability fixes and more inline documentation
* Thanks to Paolo Amadini of Stonevoice
*
* Revision 2.11 2006/06/22 04:15:00 csoutheren
* Fixed for new pwlib
*
* Revision 2.10 2006/06/21 06:11:36 csoutheren
* Fixes for latest pwlib
*
* Revision 2.9 2006/06/11 00:14:43 csoutheren
* Fixed compile error on 64 bit systems
*
* Revision 2.8 2006/06/09 04:39:59 csoutheren
* Migrated VideoBranch to main trunk
*
* Revision 2.7.2.17 2006/06/06 08:24:16 csoutheren
* Added support for echo test room
* Fix problem with using high frame rates
*
* Revision 2.7.2.16 2006/05/31 08:48:02 csoutheren
* Fixed crash on second call when entry/exit files do not exist
* Fix crash when Cisco HOLD used. Thanks to Christian Bongiovanni of Stonevoice
*
* Revision 2.7.2.15 2006/04/26 15:03:16 csoutheren
* Added better override for creating conferenc
*
* Revision 2.7.2.14 2006/04/26 13:09:08 csoutheren
* Fix problem when connecting file not available
* Add optional time limit for rooms
*
* Revision 2.7.2.13 2006/04/19 09:26:16 csoutheren
* Fixes for gcc 4.1.0
*
* Revision 2.7.2.12 2006/04/18 03:05:09 csoutheren
* Fix video mix problem with > 3 members
* Add test room
*
* Revision 2.7.2.11 2006/04/12 04:54:18 csoutheren
* Fix more problems with audio-only members
*
* Revision 2.7.2.10 2006/04/06 08:20:29 csoutheren
* Retyped conference member identifier to epxlicit type
* Added support for H.245 terminal added and terminal left
*
* Revision 2.7.2.9 2006/04/06 01:11:16 csoutheren
* Latest sources include
* - premedia blanking and optional image display
* - ablity to defer conference join for authentication if required
* - more bulletproofing on conference join
* - new video copy/fill functions
*
* Revision 2.7.2.8 2006/04/06 00:50:29 csoutheren
* Latest changes (more to come)
*
* Revision 2.7.2.7 2006/03/28 05:13:38 csoutheren
* Normalised file headers
* Fixed problem with QCIF video
* Seperated H.323 and MCU process functions into seperate files
*
* Revision 2.7.2.6 2006/03/27 09:14:14 csoutheren
* Fixed Unix compile warnings and errors
* Added VideoTxQuality value
*
* Revision 2.7.2.5 2006/03/24 22:49:24 csoutheren
* Video now working
*
* Revision 2.7.2.4 2006/03/21 14:02:49 csoutheren
* More video mixiing.
* Still some crashes in video mixer code when members exit conference
*
* Revision 2.7.2.3 2006/03/17 07:00:24 csoutheren
* More video implementation
* Video mixing now working except copying subimage UV components causes overrun
* Y is OK, which is why the images are grey. Also need to work out flipping requirements
*
* Revision 2.7.2.2 2006/03/14 08:02:50 csoutheren
* More implemenrtation of video
* Video mixing infrastructure implemented but not fully working
*
* Revision 2.7.2.1 2006/03/06 05:48:15 csoutheren
* Start of implementation for video. Still in progress
*
* Revision 2.6 2006/02/08 06:54:44 csoutheren
* Added extra information to monitoring page
*
* Revision 2.5 2005/06/21 12:45:21 rjongbloed
* Disabled video so will compile - for now.
*
* Revision 2.4 2005/03/11 00:25:24 csoutheren
* Fixed problems with flags
*
* Revision 2.3 2004/05/26 06:54:31 csoutheren
* Changed to be a PHTTPServiceProcess
* Added ability to play WAV files on member entry and exit
* Added additional documentation on all classes
* Preparation for re-introducing video
*
* Revision 2.2 2004/03/31 03:36:38 csoutheren
* Fixed problem with user indication messages
* Fixed problems with room listener and unlisten
*
* Revision 2.1 2004/03/11 20:49:44 csoutheren
* Removed warnings
*
* Revision 2.0 2004/03/08 02:06:24 csoutheren
* Totally rewritten to use new connection locking mecahnism
* Added ability to monitor conferences
* Added initial support for H.323 MCU messages
* Thanks to Citron Networks for supporting this work
*
*/
#ifndef _OpenMCU_CONFERENCE_H
#define _OpenMCU_CONFERENCE_H
#ifdef _WIN32
#pragma warning(disable:4786)
#pragma warning(disable:4100)
#endif
#include "config.h"
#include <ptlib/sound.h>
#include <ptlib/video.h>
#include <ptlib/vconvert.h>
#include <ptclib/delaychan.h>
#include <set>
#include <map>
#define CIF_WIDTH 352
#define CIF_HEIGHT 288
#define CIF_SIZE (CIF_WIDTH*CIF_HEIGHT*3/2)
#define QCIF_WIDTH (CIF_WIDTH / 2)
#define QCIF_HEIGHT (CIF_HEIGHT / 2)
#define QCIF_SIZE (QCIF_WIDTH*QCIF_HEIGHT*3/2)
typedef void * ConferenceMemberId;
////////////////////////////////////////////////////
class MCULock : public PObject
{
PCLASSINFO(MCULock, PObject);
public:
MCULock();
BOOL Wait(BOOL hard = FALSE);
void Signal(BOOL hard = FALSE);
void WaitForClose();
protected:
PMutex mutex;
BOOL closing;
int count;
PSyncPoint closeSync;
};
#if OPENMCU_VIDEO
////////////////////////////////////////////////////
class VideoFrameStoreList {
public:
class FrameStore {
public:
FrameStore(int _w, int _h)
: valid(FALSE), width(_w), height(_h)
{ valid = FALSE; PAssert(_w != 0 && _h != 0, "Cannot create zero size framestore"); data.SetSize(_w * _h * 3 / 2); }
BOOL valid;
int width;
int height;
PBYTEArray data;
};
inline unsigned WidthHeightToKey(int width, int height)
{ return width << 16 | height; }
inline void KeyToWidthHeight(unsigned key, int & width, int & height)
{ width = (key >> 16) & 0xffff; height = (key & 0xffff); }
~VideoFrameStoreList();
FrameStore & AddFrameStore(int width, int height);
FrameStore & GetFrameStore(int width, int height);
FrameStore & GetNearestFrameStore(int width, int height, BOOL & found);
void InvalidateExcept(int w, int h);
typedef std::map<unsigned, FrameStore *> VideoFrameStoreListMapType;
VideoFrameStoreListMapType videoFrameStoreList;
};
////////////////////////////////////////////////////
class ConferenceMember;
class MCUVideoMixer
{
public:
class VideoMixPosition {
public:
VideoMixPosition(ConferenceMemberId _id,
ConferenceMember & mbr,
int _x = 0,
int _y = 0,
int _w = 0,
int _h = 0);
virtual ~VideoMixPosition()
{ }
virtual BOOL WriteSubFrame(MCUVideoMixer & parent, const void * buffer, int width, int height, PINDEX amount)
{ return parent.WriteSubFrame(*this, buffer, width, height, amount); }
ConferenceMemberId id;
int xpos;
int ypos;
int width;
int height;
unsigned audioLevel;
};
virtual ~MCUVideoMixer()
{ }
typedef std::map<ConferenceMemberId, VideoMixPosition *> VideoMixPositionMap;
VideoMixPositionMap videoPositions;
int rows;
int cols;
int subImageWidth;
int subImageHeight;
MCUVideoMixer()
: subImageWidth(0), subImageHeight(0)
{ }
virtual MCUVideoMixer * Clone() const = 0;
virtual BOOL ReadFrame(ConferenceMember & mbr, void * buffer, int width, int height, PINDEX & amount) = 0;
virtual BOOL WriteFrame(ConferenceMemberId id, const void * buffer, int width, int height, PINDEX amount) = 0;
virtual void SetAudioLevel(ConferenceMemberId id, unsigned audioLevel) = 0;
virtual BOOL WriteSubFrame(VideoMixPosition & vmp, const void * buffer, int width, int height, PINDEX amount) = 0;
virtual void SetSubFrameLevel(VideoMixPosition & vmp, unsigned audioLevel) = 0;
virtual BOOL AddVideoSource(ConferenceMemberId id, ConferenceMember & mbr) = 0;
virtual void RemoveVideoSource(ConferenceMemberId id, ConferenceMember & mbr) = 0;
virtual VideoMixPosition * CreateVideoMixPosition(ConferenceMemberId _id,
ConferenceMember & _mbr,
int _x,
int _y,
int _w,
int _h)
{ return new VideoMixPosition(_id, _mbr, _x, _y, _w, _h); }
static void ConvertRGBToYUV(BYTE R, BYTE G, BYTE B, BYTE & Y, BYTE & U, BYTE & V);
static void FillYUVFrame(void * buffer, BYTE R, BYTE G, BYTE B, int w, int h);
static void FillCIFYUVFrame(void * buffer, BYTE R, BYTE G, BYTE B);
static void FillQCIFYUVFrame(void * buffer, BYTE R, BYTE G, BYTE B);
static void FillCIFYUVRect(void * frame, BYTE R, BYTE G, BYTE B, int xPos, int yPos, int rectWidth, int rectHeight);
static void FillYUVRect(void * frame, int frameWidth, int frameHeight, BYTE R, BYTE G, BYTE B, int xPos, int yPos, int rectWidth, int rectHeight);
static void CopyRectIntoCIF(const void * _src, void * _dst, int xpos, int ypos, int width, int height);
static void CopyRectIntoQCIF(const void * _src, void * _dst, int xpos, int ypos, int width, int height);
static void ConvertQCIFToCIF(const void * _src, void * _dst);
};
class MCUSimpleVideoMixer : public MCUVideoMixer
{
public:
MCUSimpleVideoMixer(BOOL forceScreenSplit = FALSE);
virtual MCUVideoMixer * Clone() const
{ return new MCUSimpleVideoMixer(*this); }
virtual BOOL ReadFrame(ConferenceMember &, void * buffer, int width, int height, PINDEX & amount);
virtual BOOL WriteFrame(ConferenceMemberId id, const void * buffer, int width, int height, PINDEX amount);
virtual void SetAudioLevel(ConferenceMemberId id, unsigned audioLevel);
virtual void SetSubFrameLevel(VideoMixPosition & vmp, unsigned audioLevel);
virtual BOOL WriteSubFrame(VideoMixPosition & vmp, const void * buffer, int width, int height, PINDEX amount);
virtual BOOL AddVideoSource(ConferenceMemberId id, ConferenceMember & mbr);
virtual void RemoveVideoSource(ConferenceMemberId id, ConferenceMember & mbr);
protected:
virtual void CalcVideoSplitSize(unsigned int imageCount, int & subImageWidth, int & subImageHeight, int & cols, int & rows);
virtual void ReallocatePositions();
virtual BOOL ReadMixedFrame(void * buffer, int width, int height, PINDEX & amount);
BOOL ReadSrcFrame(VideoFrameStoreList & srcFrameStores, void * buffer, int width, int height, PINDEX & amount);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -