live555搭建流媒体服务器2--live555源码分析

Live555搭建流媒体服务器2--Live源码分析

1. Live555源码概述

        从主页上得到的Live555源码(详见博客 Live555搭建流媒体服务器1--概述 )包括四个基本的库,BasicUsageEnvironment库,UsageEnvironment库,groupsock库,liveMedia库;以及两个应用mediaServerproxyServer;和各种测试代码testProgs。

2. UsageEnvironment库和BasicUsageEnvironment库

     UsageEnvironment库包含三个类: UsageEnvironment类、TaskSchedule类、HashTable类UsageEnvironment主要用于消息的输入输出和用户交互功能,也就是说代表了整个系统运行的环境,提供了错误记录和错误报告的功能,无论哪一个类要输出错误,就需要保存UsageEnvironment 的指针TaskSchedule类实现事件的异步处理、事件处理函数的注册等提供了任务调度功能,整个程序的运行发动机就是它,它调度任务,执行任务(任务就是一个函数)。其中UsageEnvironment类的成员变量中包含TaskSchedule类型的成员,即:
TaskScheduler& fScheduler;
这是因为TaskScheduler 类在全局中只有一个,所以保存在UsageEnvironment中。而所有的类又都保存了UsageEnvironment类的指针,所以谁想把自己的任务加入调度中,就可以很容易做到。
UsageEnvironment类的构造函数也要用到TaskSchedule类型的成员,即: 
UsageEnvironment(TaskScheduler& scheduler); // abstract base class
TaskSchedule类通过维护一个异步读取源实现对诸如通信消息到达等事件的处理,通过使用DelayQueue实现对其他注册函数的延时调度,这些后面用到再做研究,主要的是TaskSchedule类的一个虚函数:
virtual void doEventLoop(char* watchVariable = NULL) = 0;
   // Causes further execution to take place within the event loop. 
   // Delayed tasks, background I/O handling, and other events are handled, sequentially (as a single       thread of control).
   // (If "watchVariable" is not NULL, then we return from this routine when *watchVariable != 0)
一般代码都有着三句话:
TaskScheduler* scheduler = BasicTaskScheduler::createNew();//创建任务调用器
UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler); //创建交互环境
env->taskScheduler().doEventLoop();//进行事件循环
HashTable类定义了一个Hash表,其它代码要用到这个表。程序设计者通过自定义该抽象了类UsageEnvironment和TaskScheduler类的子类,就可以在特定环境(如GUI环境)中运行,不需要进行过多的修改。
     BasicUsageEnvironment库是UsageEnvironment的一个控制台应用程序的实现,利用select()函数实现事件获取和处理,针对Unix或者Windows的控制台输入输出和信号响应进行具体实现,可用于调试,开发传统的运行与控制台应用。主要包含以下类:BasicUsageEnvironment0类、BasicTaskScheduler0类,这两个直接继承于UsageEnvironment类、TaskSchedule类;BasicUsageEnvironment类、BasicTaskScheduler类这两个继承于BasicUsageEnvironment0类、BasicTaskScheduler0类;为什么不直接继承于UsageEnvironment类、TaskSchedule类还没做研究,望研究过的大神指点。然后就是HandlerSet类、HandlerDescriptor、HandlerIterator、BasicHashTable、Timeval,用于事件调度的一些辅助类吧。这里主要是SingleStep()函数,在BasicUsageEnvironment0类中定义的是:
virtual void SingleStep(unsigned maxDelayTime = 0) = 0;
   // "maxDelayTime" is in microseconds.  It allows a subclass to impose a limit
   // on how long "select()" can delay, in case it wants to also do polling.
   // 0 (the default value) means: There's no maximum; just look at the delay queue

BasicUsageEnvironment类中进行了虚函数的重写:
virtual void SingleStep(unsigned maxDelayTime);
而之前env->taskScheduler().doEventLoop();//进行事件循环 ,函数体中是执行了SingleStep()函数的:
void BasicTaskScheduler0::doEventLoop(char* watchVariable) {
  // Repeatedly loop, handling readble sockets and timed events:
  while (1) {
    if (watchVariable != NULL && *watchVariable != 0) break;
    SingleStep();
  }
}
SingleStep()函数到底执行了哪些可以参考源代码中的函数实现,简要介绍是:只是任务调度的一个方法,该方法找到最需要执行的任务并执行之。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值