1.core server 每个TaskObject都有两个方法:Signal 和 Run 在每个Task.Run内部,调用GetEvents()接收和从队列弹出所有当前的和之前的事件。 这种事件触发的核心机制渗透到几乎所有Streaming Server subsystem. Task objects make it possible for the Streaming Server use a singlethread to run all connections, which is the Streaming Server’s default configuration on a single processor system. 多亏了Task objects,它让Streaming Server使用一个线程来运行所用的连接成为可能。这在但处理系统里是默认配置。 The Streaming Server uses modules to respond to requests and complete tasks. Streaming Server使用modules来响应请求和完成任务。 三种类型mudules: 1. Content-Managing Modules 将RTSP请求和应答同media sources关联起来,比如一个文件或者一个broadcast。 每个模块负责解释客户端请求,读取和解析它们所支持的文件和网络资源,并用RTSP/RTP做出回应。 具体模块:QTSSFileModule, QTSSReflectorModule, QTSSRelayModule,QTSSMP3StreamingModule 2.Server-Support Modules 执行资料收集和日志功能。 具体模块:QTSSErrorLogModule, QTSSAccessLogModule, QTSSWebStatsModule, QTSSWebDebugModule,QTSSAdminModule, and QTSSPOSIXFileSystemModule. 3.Access Control Modules 提供就像URL路径处理那样鉴别与授权功能。 具体模块:QTSSAccessModule, QTSSHomeDirectoryModule, QTSSHttpFileModule,QTSSSpamDefenseModule. Interface: QTSServerInterface: RTSPSessionInterace: RTPSessionInterface: RTSPRequestInterface: classes server对象有个参数选择字典。 server拥有一个modules列表,每一个都有一个参数选择字典。 server拥有一个RTP client sessions列表。每个RTP client session有一个RTSP Session和一个或者多个RTP media streams。 可以通过这些API遍历(to walk all of ...)活跃的sessions或streams。 rtsp请求: 当服务器收到RTSP请求时创建一个RTSP请求对象,包含一些描述请求属性的信息。这时候,qtssRTSPReqFullRequest属性是唯一属性,它拥有一个值, 这个值包含了RTSP请求的完整内容。 然后,Server按照预先确定的顺序调用模块的具体role。
Rtsp请求处理流程: 首先被调用的是RTSP Filter role。Server会遍历并调用每一个注册有RTSP Filter role的module并把RTSP request object传递给它们。 每module的RTSP Filter role都有权改变qtssRTSPReqFullRequest属性值。 当完成所有RTSP Filter role的调用后,Server将解析RTSP请求,解析过程包括: l 填充RTSP object其余的属性。 l 建立两个session: ① RTSP session ② Client Session 解析过程完毕后,Server将调用每个被注册的RTSP Route role并解析RTSP object,RTSP Route role有权根据某些属性决定是否改变qtssRTSPReqRootDir属性值 ,从而改变处理这个请求所使用的文件夹。 随后server调用RTSP Preprocessor role,它根据qtssRTSPReqAbsoluteURL匹配这个请求是否该模块所处理的类型。如果请求匹配,RTSP Preprocessor role将调用QTSS_Write or QTSS_WriteV 发送数据给client来响应该请求。(调用QTSS_SendStandardRTSPResponse 等,将返回标准应答) 如果没有RTSP Preprocessor role响应该RTSP请求,server将执行被模块成功注册过的RTSP Request role。 最后是RTSP Postprocessor role。
module调用server的QTSS_Play生成媒体数据。server调用RTP Send Packets role。RTP Send Packets role 调用QTSS_Write 或 QTSS_WriteV向client发送数据。 QTSS Modules必须遵守下面的原则: 1. 执行任务,然后将控制权交个server要尽可能快。快速返回可以让server在响应大数量客户端请求时保持负载平衡。 2. 为流I/O过程中出现QTSS_WouldBlock错误做准备。QTSS_Write、QTSS_WriteV、QTSS_Read等回调函数会在I/O将要阻塞时返回QTSS_WouldBlock。 3. 尽量避免使用同步I/O。一个I/O阻塞可能会影响其它客户端的流媒体质量。 Server Time QTSS_TimeVal记录了server的内部时钟:从1970年一月一号凌晨0点开始的毫秒数。 QTSS Streams QTSSStream 这是一个广义的Stream抽象,用来从许多I/O类型读取或写入数据,包含但不仅仅局限于文件(File),还有错误日志(error log),sockets,以及利用RTSP/RTP进行的交互等 (具体例子看92页最后一行)。 除非特别注明,所有的流数据(streams)都是异步的。 Module需要有处理QTSS_WouldBlock 错误的代码,服从限制条件,遵守这一章前边提出的几个原则。 一个流回调函数(stream callback)在完成被请求的操作后,将要求当前线程阻塞,这将返回一个QTSS_WouldBlock错误。例如在一个socket上QTSS_Write时,socket正在接受流控制。 当模块(module)收到一个QTSS_WouldBlock结果时,模块将调用QTSS_RequestEvent回调函数向server请求一个通知,该通知在指定的stream对I/O可用时发出。调用QTSS_RequestEvent后 ,模块应立即将控制权交还给server。当指定的stream对I/O可用时,模块(module)将会在同一个角色(role),同一个状态被重新唤醒(re-invoked). 流类型(Stream types): QTSS_ErrorLogStream QTSS_FileStream QTSS_RTSPSessionStream QTSS_RTSPRequestStream QTSS_RTPStreamStream QTSS_SocketStream QTSS Services Service可能是server提供的内置(build-in)service。也可能是其它模块提供的额外(added)service。 一个service实例:a logging module允许其它module写信息到错误日志。
|