【Darwin学习笔记】之QTSSReflectorModule的Announce消息处理

RTSP Announce命令是数据源向Darwin服务端主动发起的上报本地媒体sdp信息的命令,在Darwin中处理该命令的函数为QTSSReflectorModule模块的DoAnnounce()函数,下面对该函数的进行剖析:

【转载请注明出处】:http://blog.csdn.net/longlong530

1. 判断sAnnounceEnabled是否开启,由以下配置项确定,默认为true

<PREF NAME="enable_broadcast_announce" TYPE="Bool16" >true</PREF>

2. 通过键值qtssRTSPReqLocalPath获取完整的转发路径,比如D:\MSU\Movies\34020000001320000008.sdp

3. 验证上面路径的结尾是否为.kill,如果是设置killBroadcast为true,那么下面就会进入KillSession流程

    if (killBroadcast)
    {
        theFullPath.Len -= sSDPKillSuffix.Len;
        if (KillSession(&theFullPath, killBroadcast))
            return QTSSModuleUtils::SendErrorResponse(inParams->inRTSPRequest, qtssServerInternal,0);
        else
            return QTSSModuleUtils::SendErrorResponseWithMessage(inParams->inRTSPRequest, qtssClientNotFound, &sKILLNotValidMessage);
    }

4. 验证上面路径的结尾是否为.sdp

5. 获取SDP字符串的长度,并检验sdp字符串是否超长,默认 4* 1024

6. 检测sRequestBodyAttr、sBufferOffsetAttr这两个KEY值是否存在hash表中。如果没有就构造键值对增加到hash标准。

7. 通过QTSS_Read从RTSP请求消息inParams->inRTSPRequest中解析出SDP信息。

 //theBufferOffset直接被设置为0,这里好像没有用到该偏移值;
 //这里通过该方法将RTSP请求消息中的sdp字符串解析出来了。
 theErr = QTSS_Read(inParams->inRTSPRequest, theRequestBody + theBufferOffset, *theContentLenP - theBufferOffset, &theLen);
   

8. 通过IsSDPBufferValid()方法来校验SDP是否合法,通过InfoPortsOK()判断Announce请求的端口是否合法,其中端口范围由sMinimumStaticSDPPort、sMaximumStaticSDPPort决定,默认分别为20000、65535

9. 分别将SDP字符串中的会话相关字段、媒体相关字段写入sdp文件中.

SDPLineSorter sortedSDP(&checkedSDPContainer );

// ------------ Write the SDP
	//SDP字符串中的会话相关字段
	/*
	v=0
	o=- 0 0 IN IP4 192.168.10.177
	s=PLAY
	c=IN IP4 192.168.10.177
	t=0 0
	a=x-qt-text-nam:PLAY
	a=x-qt-text-inf:LIVE555 Streaming Media
	a=x-qt-text-cmt:source application:PLAY
	a=x-qt-text-aut:
	a=x-qt-text-cpy:
	*/
    char* sessionHeaders = sortedSDP.GetSessionHeaders()->GetAsCString();
    OSCharArrayDeleter sessionHeadersDeleter(sessionHeaders);

	//SDP字符串中的媒体相关字段
	/*
	m=video 20020 RTP/AVP 96
	a=rtpmap:96 PS/90000
	a=fmtp:96 packetization-mode=1;profile-level-id=4D4033;sprop-parameter-sets=Z01AM5p0FCNCAAEEugA9CQEeMGVA,aO48gA==
	a=control:trackID=1
	*/
    char* mediaHeaders = sortedSDP.GetMediaHeaders()->GetAsCString();
    OSCharArrayDeleter mediaHeadersDeleter(mediaHeaders);

【转载请注明出处】:http://blog.csdn.net/longlong530

时间: 2024-08-13 02:45:19

【Darwin学习笔记】之QTSSReflectorModule的Announce消息处理的相关文章

C++ Primer 学习笔记_56_类与数据抽象 --消息处理示例

复制控制 --消息处理示例 说明: 有些类为了做一些工作需要对复制进行控制.为了给出这样的例子,我们将概略定义两个类,这两个类可用于邮件处理应用程序.Message类和 Folder类分别表示电子邮件(或其他)消息和消息所出现的目录,一个给定消息可以出现在多个目录中.Message上有 save和 remove操作,用于在指定Folder中保存或删除该消息. 数据结构: 对每个Message,我们并不是在每个Folder中都存放一个副本,而是使每个Message保存一个指针集(set),set中

【Darwin学习笔记】之QTSSReflectorModule的Describe消息处理

对于QTSSReflectorModule里面的Describe消息只处理sdp类型的资源请求,其他类型的比如mov.mp4等资源会跳转到QTSSFileModule里面,其中mp4文件在Darwin源码中点播需要先hint下.如果想在增加多种视频格式那就要对FileModule进行扩展,在我们的项目中就优化了FileModule,实现了对mp4.avi等各种格式的文件的点播支持.后面的章节我们详细讨论. [转载请注明出处]:http://blog.csdn.net/longlong530 1.

【Darwin学习笔记】之QTSSReflectorModule的Setup消息处理

Setup消息进入到DoSetup函数单独处理,处理流程如下: [转载请注明出处]:http://blog.csdn.net/longlong530 1. 根据关键字qtssRTSPReqTransportMode判断是否为推模式,具体isPush值由Setup请求中的mode值有关,mode="receive" || mode="record"表示isPush为true.对应的解析函数为:void RTSPRequest::ParseModeSubHeader(S

【Darwin学习笔记】之RTSPSession

今天详细的看了下RTSPSession的会话处理代码,该模块主要是Run方法内对会话的状态机进行管理,实现对RTSP会话的处理,我以点播Movie文件夹下的视频文件为例,深入的学习了(Describe.Setup.Play的点播流程),并按照状态机的处理顺序对他们进行一一解析,如下: [转载请注明出处]:http://blog.csdn.net/longlong530 1. 状态机 kReadingFirstRequest 通过fInputStream.ReadRequest()调用Sessio

【Darwin学习笔记】之TaskThread

[转载请注明出处]:http://blog.csdn.net/longlong530 学习TaskThread主要有三个类要关注: TaskTreadPool: 任务线程池 TaskThread:任务线程 Task: 任务 1. TaskThreadPool Darwin运行着一个或者多个任务(Task)线程,并将他们统一在线程池TaskThreadPool中管理.任务线程从事件线程中接收RTSP和RTP请求,然后把请求传递到恰当的服务器模块进行处理,把数据包发送给客户端. 缺省情况下,核心服务

【Darwin学习笔记】之RTSP连接监听初始化

网上有很多大侠已经对Darwin做了详细的剖析,在下仅本着积累经验的目的,将Darwin的学习过程记录下来,同时与网友们交流学习,今天先来分析下Darwin如果根据配置文件监听RTSP连接的流程. 1. Darwin系统初始化,Bool16 QTSServer::Initialize(.....) 2. QTSServer::CreateListeners(...)根据本地xml配置文件中的地址和端口进行监听的建立,主要有两个配置项: <PREF NAME="bind_ip_addr&qu

【Darwin学习笔记】之EventThread

[转载请注明出处]:http://blog.csdn.net/longlong530 EventThread负责侦听Darwin系统的Socket事件,包括以下两类, 对于两类事件是分别如何处理的,我们从头开始分析. a)   建立新的RTSP连接请求事件 b)   已有RTSP连接上的RTSP请求消息事件 一.  EventThread 的创建 RunServer.cpp 中StartServer函数初始化调用了 Socket::Initialize(),在该函数内即创建了EventThrea

我的Hook学习笔记

关于Hook 一.基本概念: 钩子(Hook),是Windows消息处理机制的一个平台,应用程序能够在上面设置子程以监视指定窗体的某种消息,并且所监视的窗体能够是其它进程所创建的.当消息到达后,在目标窗体处理函数之前处理它.钩子机制同意应用程序截获处理window消息或特定事件. 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息发出,在没有到达目的窗体前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权.这时钩子函数即能够加工处理(改变)该消息,也能够不作处理而继续传

[原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------