live555 源码分析

最近由于项目需要,自己开始阅读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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值