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

Setup消息进入到DoSetup函数单独处理,处理流程如下:

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

1. 根据关键字qtssRTSPReqTransportMode判断是否为推模式,具体isPush值由Setup请求中的mode值有关,mode="receive" || mode="record"表示isPush为true。对应的解析函数为:void RTSPRequest::ParseModeSubHeader(StrPtrLen* inModeSubHeader)

StrPtrLen theMode;
theSubHeaderParser.ConsumeWord(&theMode);
//mode="receive" || mode="record"表示isPush为true,即为推模式。
if ( theMode.EqualIgnoreCase(sReceiveMode) || theMode.EqualIgnoreCase(sRecordMode) )
{
<span style="white-space:pre">	</span>fTransportMode = qtssRTPTransportModeRecord;
<span style="white-space:pre">	</span>break;
}

2. 查询是否已经建立RTPSessionOutput。

1.1)    如果没有,且是从UI发来的标准RTSP客户端请求,那么

//增加客户端输出管道(多路转发);
 RTPSessionOutput* theNewOutput = NEW RTPSessionOutput(inParams->inClientSession, theSession, sServerPrefs, sStreamCookieAttr );
 theSession->AddOutput(theNewOutput,true);
 //将新建的RTPSessionOutput存储起来,key = sOutputAttr;
 (void)QTSS_SetValue(inParams->inClientSession, sOutputAttr, 0, &theNewOutput, sizeof(theNewOutput));

1.2)   如果isPush = true,代表为Announce推流中的SETUP消息,那么

/*
根据前面Announce中存储于qtssRTSPReqLocalPath的路径读取sdp信息,调用DoSessionSetup创建或引用已存在的ReflectorSession<span style="font-family: Arial, Helvetica, sans-serif;">转发会话</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>
*/
 theSession = DoSessionSetup(inParams, qtssRTSPReqFilePathTrunc,isPush,&foundSession);

2) 如果已经存在输出会话,即直接调用。

3. 解析track ID,后面会根据这个track id来获取流信息

 char* theDigitStr = NULL;
(void)QTSS_GetValueAsString(inParams->inRTSPRequest, qtssRTSPReqFileDigit, 0, &theDigitStr);
 QTSSCharArrayDeleter theDigitStrDeleter(theDigitStr);

4. 如果是推流模式:

//标识流转发的建立
        theStreamInfo->fSetupToReceive = true;
        // This is an incoming data session. Set the Reflector Session in the ClientSession
		//设置转发会话的RTPSession字典的sClientBroadcastSessionAttr字段
        theErr = QTSS_SetValue(inParams->inClientSession, sClientBroadcastSessionAttr, 0, &theSession, sizeof(theSession));
        Assert(theErr == QTSS_NoErr);
        //设置ReflectorSession的fBroadcasterSession属性为inParams->inClientSession
        if (theSession != NULL)
            theSession->AddBroadcasterClientSession(inParams);

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

时间: 2024-12-29 05:34:29

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

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

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

【Darwin学习笔记】之RTSPSession

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

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

RTSP Announce命令是数据源向Darwin服务端主动发起的上报本地媒体sdp信息的命令,在Darwin中处理该命令的函数为QTSSReflectorModule模块的DoAnnounce()函数,下面对该函数的进行剖析: [转载请注明出处]:http://blog.csdn.net/longlong530 1. 判断sAnnounceEnabled是否开启,由以下配置项确定,默认为true <PREF NAME="enable_broadcast_announce" T

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

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

【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

storm学习笔记

Storm学习笔记 一.简介 本文使用的Storm版本为1.0.1 Storm是一个免费开源的分布式实时计算系统,它使得可靠地处理无限的数据流更加容易,可以实时的处理Hadoop的批量任务.Storm简单易用,且支持各种主流的程序语言. Storm有很多适用场景:实时分析.在线机器学习.连续计算.分布式RPC.分布式ETL.易扩展.支持容错,可确保你的数据得到处理,易于构建和操控. 下图是Storm"流式数据处理"的概念图,即数据像水流一样从数据源头源源不断的流出,经过每个节点,每个节

嵌入式学习笔记101-uboot_1.1.6移植(1)

根据前篇博文(嵌入式学习笔记100-uboot1.1.6初体验)最后的结论,现在开始将其实现: a. 修改makefile的CROSS_COMPILE指定编译器 arm-linux-gcc -v –> gcc version 3.4.5 CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux- chmod -R 777 u-boot-1.1.6/