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信息。
-
-
- 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 );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- char* sessionHeaders = sortedSDP.GetSessionHeaders()->GetAsCString();
- OSCharArrayDeleter sessionHeadersDeleter(sessionHeaders);
-
-
-
-
-
-
-
-
- char* mediaHeaders = sortedSDP.GetMediaHeaders()->GetAsCString();
- OSCharArrayDeleter mediaHeadersDeleter(mediaHeaders);