【Darwin学习笔记】之QTSSReflectorModule的Announce消息处理
2017-02-27 16:23
543 查看
RTSP Announce命令是数据源向Darwin服务端主动发起的上报本地媒体sdp信息的命令,在Darwin中处理该命令的函数为QTSSReflectorModule模块的DoAnnounce()函数,下面对该函数的进行剖析:
【转载请注明出处】:http://blog.csdn.net/longlong530
1. 判断sAnnounceEnabled是否开启,由以下配置项确定,默认为true
[html] view
plain copy
print?
<PREF NAME="enable_broadcast_announce" TYPE="Bool16" >true</PREF>
2. 通过键值qtssRTSPReqLocalPath获取完整的转发路径,比如D:\MSU\Movies\34020000001320000008.sdp
3. 验证上面路径的结尾是否为.kill,如果是设置killBroadcast为true,那么下面就会进入KillSession流程
[cpp] view
plain copy
print?
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信息。
[cpp] view
plain copy
print?
//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文件中.
[cpp] view
plain copy
print?
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
1. 判断sAnnounceEnabled是否开启,由以下配置项确定,默认为true
[html] view
plain copy
print?
<PREF NAME="enable_broadcast_announce" TYPE="Bool16" >true</PREF>
2. 通过键值qtssRTSPReqLocalPath获取完整的转发路径,比如D:\MSU\Movies\34020000001320000008.sdp
3. 验证上面路径的结尾是否为.kill,如果是设置killBroadcast为true,那么下面就会进入KillSession流程
[cpp] view
plain copy
print?
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信息。
[cpp] view
plain copy
print?
//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文件中.
[cpp] view
plain copy
print?
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);
相关文章推荐
- 【Darwin学习笔记】之QTSSReflectorModule的Announce消息处理
- 【Darwin学习笔记】之QTSSReflectorModule的Announce消息处理
- 【Darwin学习笔记】之QTSSReflectorModule的Setup消息处理
- 【Darwin学习笔记】之QTSSReflectorModule的Setup消息处理
- 【Darwin学习笔记】之QTSSReflectorModule的Describe消息处理
- 【Darwin学习笔记】之QTSSReflectorModule的Describe消息处理
- 【Darwin学习笔记】之QTSSReflectorModule的Describe消息处理
- 【Darwin学习笔记】之QTSSReflectorModule的Setup消息处理
- Android消息处理学习笔记
- C++ Primer 学习笔记_56_ 类和数据抽象 --消息处理演示示例
- POX学习笔记:POX接收OpenFlow消息的处理流程分析
- Akka学习笔记:Actor消息处理-请求和响应(2)
- OpenCV学习笔记14 OpenCV图像处理模块ImgProc Module. Image Processing(七)
- VC++学习笔记之消息处理机制和窗口过程函数
- struts2的表单验证 ,消息处理学习笔记
- android 多线程 异步消息处理 服务 学习笔记 (六)
- SOAP消息的创建,传递,处理的学习笔记
- Android应用开发学习笔记之多线程与Handler消息处理机制
- Socket网络编程学习笔记(4):TCP消息边界处理
- 【VS2010学习笔记】【函数学习】一(MFC+OpenCV2.4.7读取摄像头之WM_TIMER消息处理函数的添加问题)