最近由于项目需要,自己开始阅读live555的源码,下面是一些总结,希望和大家多多交流。
这次项目
1.live555 开发库源代码包括6个部分:UsageEnviroment、BasicUsageEnviroment、groupsock、liveMedia、testProgs、mediaServer
1)UsageEnviroment
UsageEnviroment目录中,声明一些虚类 class UsageEnviroment class HashTable class TaskScheduler
这些类中包括各种纯虚函数,这些虚函数定义出这些类的整体轮廓。这些类的某些子类,如果想要实例化的,必须描绘出这些轮廓。即实现这些函数。
class UsageEnviroment 是程序运行环境的抽象描述,通过包含TaskScheduler& fScheduler 的私有变量,表示网络功能、异步事件处理等。
class TaskScheduler 是定义如何设置RTSPServer端的网络功能、异步事件处理。
class HashTable 是定义类似于字典的功能。(key,value)。
注: virtual 关键字修饰的虚函数,同时不包括实现部分的函数,成为纯虚函数。带有纯虚函数的类是无法实例化的。
2)BasicUsageEnviroment
BasicUsageEnviroment目录中,主要是对UsageEnviroment目录中的class UsageEnviroment 、class TaskScheduler 各个部分的逐步实现,在实现的过程中逐步引入相应的成员数据。
3)groupsock
groupsock目录,主要是对基本的socket封装,在liveMedia目录中,涉及网络的部分会有使用。
这部分,我现在并没有太多关注。
4)liveMedia
liveMeida目录,是整个live555开发库的核心部分。
(1)class Medim,class _Tables,class MediaLookupTable
class Medim,class _Tables在Media.hh文件中定义。在 Media.cpp文件中实现。class MediaLookupTable在 Media.cpp文件中定义和实现。
liveMeida目录中最基础的类是class Medium。liveMedia目录下,很多class类型都是class Media 的子类。
class _Tables,class MediaLookupTable主要是实现对Medium的管理。
#define mediumNameMaxLen 30
class Medium {
public:
static Boolean lookupByName(UsageEnvironment& env,
char const* mediumName,
Medium*& resultMedium); //通过env.liveMediaPriv.mediaTable 这样一个MediaLookupTable里面的lookup方法查找Medium
static void close(UsageEnvironment& env, char const* mediumName); //关闭特定的env中,特定的Medium,释放相关的内存
static void close(Medium* medium); // alternative close() method using ptrs
// (has no effect if medium == NULL)
UsageEnvironment& envir() const {return fEnviron;}
char const* name() const {return fMediumName;}
// Test for specific types of media:
virtual Boolean isSource() const;
virtual Boolean isSink() const;
virtual Boolean isRTCPInstance() const;
virtual Boolean isRTSPClient() const;
virtual Boolean isRTSPServer() const;
virtual Boolean isMediaSession() const;
virtual Boolean isServerMediaSession() const;
virtual Boolean isDarwinInjector() const;
protected:
Medium(UsageEnvironment& env); // abstract base class
virtual ~Medium(); // instances are deleted using close() only
TaskToken& nextTask() {
return fNextTask;
}
private:
friend class MediaLookupTable;
UsageEnvironment& fEnviron; // Medium 属于的UsageEnviroment,在创建Meium实例的时候,赋值。
char fMediumName[mediumNameMaxLen]; // Medium 的名称,例如:liveMedium0/1/2....
TaskToken fNextTask; // void* 与Medium相关的TaskToken,
};
上面是class Medium的定义。
class Medium 某种媒体
class _Tables 查找表,包括void *mediaTable,class MediaLookupTable 类型;void* socketTable,具体类型我现在没有找到。
class MedaLookupTable 通过HashTabel实现的Medium的查找表,包括所有在UsageEnviroment 中创建的Medium实体。
上面三种类型是通过class UsageEnviroment类型中的void *liveMediaPriv 成员变量联系起来。
其中liveMediaPriv实际上是_Tables* 类型,而在_Tables类型中有void *mediaTable成员变量,mediaTable是MediaLookupTable*类型的。
如果我们知道UsageEnviroment& env,给出key值,即Medium的名称,我们就可以查找相关的Medium。
2)class RTSPServer, class RTSPServer::class RTSPClientSession
clas